Bài 19 Các Ki u d li u Nâng cao và S p x p ế
M c tiêu:
K t thúc bài h c này, b n có th :ế
Tìm hi u c u trúc (structure) và công d ng c a chúng
Đ nh nghĩa c u trúc
Khai báo các bi n ki u c u trúcế
Tìm hi u cách truy c p vào các ph n t c a c u trúc
Tìm hi u cách kh i t o c u trúc
Tìm hi u cách s d ng c u trúc v i câu l nh gán
Tìm hi u cách truy n tham s ki u c u trúc
S d ng m ng c u trúc
Tìm hi u cách kh i t o các m ng c u trúc
Tìm hi u con tr đ n c u trúc ế
Tìm hi u cách truy n đ i s ki u con tr c u trúc vào hàm .
Tìm hi u t khóa typedef
Tìm hi u hai thu t toán s p x p m ng là Insertion sort và Bubble sort. ế
Gi i thi u
Các ch ng trình ng d ng trong th c t đòi h i l u tr các ki u d li u khác nhau. Tuy nhiên, cácươ ế ư
ki u d li u c a C chúng ta đã đ c h c th không đ trong các tr ng h p đó. v y, C ượ ườ
cho phép t o ra các ki u d li u do ng i dùng đ nh nghĩa. M t trong nh ng ki u nh v y là ườ ư c u
trúc (structure). M t c u trúc m t t p các bi n đ c nhóm l i v i nhau cùng tên. M t ki u ế ượ
d li u cũng có th đ c đ t tên m i b ng cách s d ng t khóa ượ typedef.
Các ng d ng th ng l u tr m t s l ng d li u r t l n. Trong nh ng tr ng h p này, vi c ườ ư ượ ườ
đ nh v m t m c d li u nào đó có th t n nhi u th i gian. S p x p các giá tr theo m t tr t t nào ế
đó s làm cho công vi c tìm ki m nhanh chóng d dàng h n. Trong ch ng này, chúng ta cũng ế ơ ươ
s xem m t s gi i thu t dùng đ s p x p các m ng. ế
19.1 C u trúc
Bi n đ c s d ng đ l u gi m t m u d li u t i m t th i đi m m ng đ c s d ng đ l uế ượ ư ượ ư
gi m t s m ud li u cùng ki u. Tuy nhiên, m t ch ng trình th u c u x các m c ươ
d li u ki u khác nhau trong cùng m t đ n v chung. tr ng h p này, c bi n m ng đ u ơ ườ ế
không thích h p đ s d ng.
Ví d , m t ch ng trình đ c vi t đ l u tr d li u v m t danh m c sách. Ch ng trình đòi h i ươ ượ ế ư ươ
ph i nh p l u tr tên c a m i quy n sách (m t m ng chu i), tên c a tác gi (m t m ng chu i ư
khác), l n xu t b n (m t s nguyên), giá c a quy n sách (m t s th c). M t m ng đa chi u không
th s d ng đ làm đi u này, các ph n t c a m t m ng ph i cùng ki u. Trong tr ng h p ư
này, vi c s d ng c u trúc s làm cho m i vi c tr nên đ n gi n h n. ơ ơ
Các Ki u d li u Nâng cao và S p x p ế 3
M t c u trúc bao g m m t s m u d li u, không c n ph i cùng ki u, đ c nhóm l i v i nhau. ượ
Trong d trên, m t c u trúc s bao g m tên sách, tên tác gi , l n xu t b n, giá c a quy n
sách. C u trúc có th l u gi bao nhiêu m u d li u cũng đ c. ư ượ
Hình 19.1 Minh h a s khác bi t gi a m t bi n, m t m ng và m t c u trúc. ế
I
L
L
U
S
I I
1 L O
Biế
n
L N
U S
S B
I A
O C
N H
S
M n
g
1
C u
trúc
Hình 19.1. S khác nhau gi a m t bi n, m t m ng và m t c u trúc. ế
19.1.1 Đ nh nghĩa m t c u trúc
Vi c đ nh nghĩa c u trúc s t o ra ki u d li u m i cho phép ng i dùng s d ng chúng đ khai ườ
báo các bi n ki u c u trúc. Các bi n trong c u trúc đ c g i là các ph n t hay các thành ph n c aế ế ượ
c u trúc.
M t cách t ng quát, các ph n t c a m t c u trúc quan h v i nhau m t cách logic chúng liên
quan đ n m t th c th duy nh t. Ví d , m t danh m c sách có th đ c bi u di n nh sau:ế ượ ư
struct cat
{
char bk_name [25];
char author [20];
int edn;
float price;
};
Câu l nh trên đ nh nghĩa m t ki u d li u m i có tên là struct cat. M i bi n c a ki u này bao g m ế
b n ph n t - bk_name, author, edn, price. Câu l nh không khai báo b t kỳ bi n nào v y ế
ch ng trình không đ dành b t kỳ vùng nh nào trong b nh . ch đ nh nghĩa c u trúc c a ươ cat.
T khóa struct báo cho trình biên d ch bi t r ng m t structure đ c đ nh nghĩa. Nhãn ế ượ cat không
ph i là tên bi n, vì không ph i ta đang khai báo bi n. Nó là m t ế ế tên ki u. Các ph n t c a c u trúc
đ c đ nh nghĩa trong d u móc, và k t thúc toàn b câu l nh b ng m t d u ch m ph y.ượ ế
19.1.2 Khai báo bi n ki u c u trúcế
4 L p trình c b n C ơ
Tên
tác gi
L n
xu t b n
Tên sách
Khi m t c u trúc đã đ c đ nh nghĩa, chúng ta th khai báo m t ho c nhi u bi n ki u này. ượ ế
d :
struct cat books1;
Câu l nh này s dành đ vùng nh đ l u gi t t c các m c trong m t c u trúc. Khai báo trên ư
th c hi n ch c năng t ng t nh các khai báo bi n: ươ ư ế int xyz float ans. báo v i trình biên
d ch dành ra m t vùng l u tr cho m t bi n v i ki u nào đó và gán tên cho bi n. ư ế ế
Cũng nh v i ư int, float các ki u d li u khác, ta th m t s b t kỳ các bi n có ki u c u ế
trúc đã cho. Trong m t ch ng trình, có th khai báo hai bi n books1 và books2 có ki u c u trúc ươ ế cat
. Đi u này có th th c hi n đ c theo nhi u cách. ượ
struct cat
{
char bk_name[25];
char author[20];
int edn;
float price;
} books1, books2;
ho c
struct cat books1, books2;
ho c
struct cat books1;
struct cat books2;
Các khai báo này s dành vùng nh cho hai bi n books1 và books2. ế
Các ph n t c a c u trúc đ c truy c p thông qua vi c s d ng toán t ch m (.), toán t này còn ượ
đ c g i toán t thành viên ượ membership. pháp t ng quát dùng đ truy c p m t ph n t c a
c u trúc là:
structure_name.element_name
d nh l nh sau đây truy c p đ n tr ng bk_name c a bi n ki u c u trúc books1 đã khai ư ế ườ ế
báo trên.
books1.bk_name
Đ đ c vào tên c a quy n sách, câu l nh s là:
scanf(“%s”, books1.bk_name);
Đ in ra tên sách, câu l nh s là:
printf(“The name of the book is %s”, books1.bk_name);
19.1.3 Kh i t o bi n c u trúc ế
Các Ki u d li u Nâng cao và S p x p ế 5
Gi ng nh các bi n và m ng, các bi n ki u c u trúc th đ c kh i t o t i th i đi m khai báo. ư ế ế ượ
Hình th c t ng t nh cách kh i t o m ng. Xét c u trúc sau dùng đ l u s th t tên nhân ươ ư ư
viên:
struct employee
{
int no;
char name[20];
};
Các bi n ếemp1emp2 có ki u employee có th đ c khai báo và kh i t o nh sau: ượ ư
struct employee emp1 = {346, “Abraham”};
struct employee emp2 = {347, “John”};
đây, sau khi khai báo ki u c u trúc, hai bi n c u trúc ế emp1 emp2 đ c khai báo kh i t o.ượ
Vi c khai báo kh i t o c a chúng đ c th c hi n cùng lúc b i m t câu l nh duy nh t. Vi c ượ
kh i t o c u trúc t ng t nh kh i t o m ng ki u bi n, tên bi n, toán t gán, cu i cùng ươ ư ế ế
danh sách các giá tr đ c đ t trong c p móc và đ c phân cách b i d u ph y. ượ ượ
19.1.4 Th c hi n câu l nh gán v i các bi n c u trúc ế
Có th gán giá tr c a m t bi n c u trúc cho m t bi n khác cùng ki u b ng cách s d ng câu l nh ế ế
gán đ n gi n. Ch ng h n, n u books1 và books2 là các bi n c u trúc có cùng ki u, thì câu l nh sauơ ế ế
là h p l .
books2 = books1;
Cũng nh ng tr ng h p không th dùng câu l nh gán tr c ti p, tth s d ng hàm t o s n ườ ế
memcpy(). Nguyên m u c a hàm này là:
memcpy (char * destn, char &source, int nbytes);
Hàm này th c hi n sao chép nbytes đ c l u tr b t đ u t đ a ch ượ ư source đ n m t vùng nh khácế
đ a ch b t đ u t destn. Hàm đòi h i ng i s d ng ph i ch ra kích c c a c u trúc (nbytes), ườ
kích c này th đ t đ c b ng cách s d ng toán t ư sizeof(). S d ng hàm memcpy(), th
sao chép n i dung c a books1 sang books2 nh sau:ư
memcpy (&books2, &books1, sizeof(struct cat));
19.1.5 C u trúc l ng trong c u trúc
M t c u trúc th l ng trong m t c u trúc khác. Tuy nhiên, m t c u trúc không th l ng trong
chính nó. R t nhi u tr ng h p th c t đòi h i m t c u trúc n m trong m t c u trúc khác. Xét ườ ế
d , đ l u tr thông tin v nh ng ng i m n sách chi ti t c a quy n sách đ c m n ta ư ườ ư ế ượ ượ
có th s d ng c u trúc sau:
struct issue
{
char borrower [20];
char dt_of_issue[8];
struct cat books;
}issl;
6 L p trình c b n C ơ
Câu l nh này khai báo booksm t thành ph n c a c u trúc issue. B n thân thành ph n này là m t
c u trúc ki u struct cat. Bi n c u trúc trên có th đ c kh i t o nh sau:ế ượ ư
struct issue issl = {“Jane”, “04/22/03”, {“Illusions”,
“Richard Bach”, 2, 150.00}};
Các d u ngo c l ng nhau đ c s d ng đ kh i t o m t c u trúc n m trong m t c u trúc. ượ
Đ i v i bi n c u trúc thành ph n m t c u trúc khác, vi c truy c p các thành ph n c a bi n ế ế
này hoàn toàn t ng t đ i v i m t bi n c u trúc thông th ng. Ch ng h n, đ truy c p vào tênươ ế ườ
c a ng i m n ta dùng l nh là: ườ ượ
issl.borrower
Tuy nhiên, đ truy c p thành ph n author c a bi n c u trúc ế cat bi n c u trúc này l i thànhế
ph n c a m t bi n c u trúc ế issl ta s d ng l nh sau:
issl.books.author
M c đ l ng c a các c u trúc ch b gi i h n b i dung l ng hi n th i c a b nh . Có th có m t ượ
c u trúc l ng trong m t c u trúc r i l ng trong m t c u trúc khác v.v… Tên c a các bi n ế
th ng đ c đ t theo cách th c g i nh n i dung thông tin mà nó l u tr . Ví d nh :ườ ượ ư ư
company.division.employee.salary
Cũng c n nh r ng n u m t c u trúc đ c l ng trong m t c u trúc khác, ph i đ c khai báo ế ượ ượ
tr c c u trúc khác s d ng nó.ướ
19.1.6 Truy n tham s ki u c u trúc
Ki u tham s c a m t hàm th c u trúc. Đây m t ph ng ti n h u d ng khi ta mu n ươ
truy n m t nhóm các thành ph n d li u có quan h logic v i nhau thông qua m t bi n thay vì ph i ế
truy n t ng thành ph n m t. Tuy nhiên, khi m t c u trúc đ c s d ng nh m t tham s , c n ph i ượ ư
l u ý r ng ki u c a tham s th c ph i trùng v i ki u c a tham s hình th c.ư
Ch ng h n nh , m t c u trúc đ c khai báo đ l u tr n, s khách hàng s ti n g i g c ư ượ ư
vào tài kho n c a khách hàng. D li u đ c nh p trong hàm ượ main(), vi c toán s ti n lãi ph i tr
đ c th c hi n b ng cách g i hàm intcal() có m t tham s ki u c u trúc. Đo n l nh nh sau:ượ ư
Ví d 1:
#include <stdio.h>
struct strucintcal /* Defines the structure */
{
char name[20];
int numb;
float amt;
};
void main()
Các Ki u d li u Nâng cao và S p x p ế 7