Ãëàâíàÿ ñòðàíèöà Ñëó÷àéíàÿ ñòðàíèöà ÊÀÒÅÃÎÐÈÈ: ÀâòîìîáèëèÀñòðîíîìèÿÁèîëîãèÿÃåîãðàôèÿÄîì è ñàäÄðóãèå ÿçûêèÄðóãîåÈíôîðìàòèêàÈñòîðèÿÊóëüòóðàËèòåðàòóðàËîãèêàÌàòåìàòèêàÌåäèöèíàÌåòàëëóðãèÿÌåõàíèêàÎáðàçîâàíèåÎõðàíà òðóäàÏåäàãîãèêàÏîëèòèêàÏðàâîÏñèõîëîãèÿÐåëèãèÿÐèòîðèêàÑîöèîëîãèÿÑïîðòÑòðîèòåëüñòâîÒåõíîëîãèÿÒóðèçìÔèçèêàÔèëîñîôèÿÔèíàíñûÕèìèÿ×åð÷åíèåÝêîëîãèÿÝêîíîìèêàÝëåêòðîíèêà |
CÊu tróc
CÊ u tró c lµ tË p hî p cñ a mé t hoÆ c nhiÒ u biÕ n, chó ng cã thÓ kh¸ c kiÓ u nhau, ®î c nhã m l¹ i dí i mé t c¸ i tª n duy nhÊ t ®Ó tiÖ n sö lý. CÊ u tró c cß n gä i lµ b¶n ghi trong mé t sè ng«n ng÷ kh¸ c, ch¼ ng h¹ n nh PASCAL. CÊ u tró c gió p cho viÖ c tæ chø c c¸ c d÷ liÖ u phø c t¹ p, ®Æ c biÖ t trong nh÷ ng chng tr× nh lí n v× trong nhiÒ u t× nh huè ng chó ng cho phÐ p nhã m c¸ c biÕ n cã liª n quan l¹ i ®Ó xö lý nh mé t ®n vÞ thay v× c¸ c thù c thÓ t¸ ch biÖ t. Mé t vÝ dô ®î c ®Ò cË p nhiÒ u ®Õ n lµ cÊ u tró c phiÕ u ghi lng, trong ®ã mç i nh©n viª n ®î c m«t¶ bë i mé t tË p c¸ c thué c tÝ nh ch¼ ng h¹ n nh: tª n, ®Þ a chØ, lng, phô cÊ p vv.. mé t sè trong c¸ c thué c tÝ nh nµy l¹ i cã thÓ lµ cÊ u tró c bë i trong nã cã thÓ chø a nhiÒ u thµnh phÇ n: Tª n (Hä, ®Ö m, tª n), §Þ a chØ (Phè, sè nhµ) vv. Trong chng nµy chó ng ta sÏ minh ho¹ c¸ ch sö dô ng cñ a c¸ c cÊ u tró c trong chng tr× nh. 8.1. KiÓ u cÊ u tró c: Khi x©y dù ng cÊ u tró c, ta cÇ n m«t¶ kiÓ u cñ a nã. §iÒ u nµy cò ng tng tù nh viÖ c ph¶i thiÕ t kÕ ra mé t kiÓ u nhµ trí c khi ta ®i x©y dù ng nh÷ ng c¨ n nhµ thù c sù ë c¸ c ®Þ a ®iÓ m kh¸ c nhau. C«ng viÖ c ®Þ nh nghÜ a mé t kiÓ u cÊ u tró c bao gå m viÖ c nª u ra tª n cñ a kiÓ u cÊ u tró c vµ c¸ c thµnh phÇ n cñ a nã theo mÉ u sau: struct tª n_kiÓ u _cÊ u_tró c { Khai b¸ o c¸ c thµnh phÇ n cñ a cÊ u tró c (1) }; Trong ®ã: · struct lµ tõ kho¸ · tª n_kiÓ u _cÊ u_tró c lµ mé t tª n bÊ t kú do ngê i lË p tr× nh tù ®Æ t theo qui t¾ c ®Æ t tª n nª u ra trong chng 1.
Thµnh phÇ n cñ a cÊ u tró c cã thÓ lµ: biÕ n, m¶ng, cÊ u tró c kh¸ c ®· ®î c ®Þ nh nghÜ a trí c ®ã vv..
VÝ dô: VÝ dô 1: §o¹ n chng tr× nh: struct ngay { int ngaythu; char thang[12]; int nam; };
m«t¶ mé t kiÓ u cÊ u tró c cã tª n lµ ngay gå m cã ba thµnh phÇ n: BiÕ n nguyª n ngaythu, m¶ng thang, vµ biÕ n nguyª n nam. VÝ dô 2: §o¹ n chng tr× nh: struct nhancong {
char ten[15]; char diachi[20] double bacluong; struc ngay ngaysinh; struc ngay ngaybatdaucongtac; }; t¹ o ra kiÓ u cÊ u tró c cã tª n lµ nhancong gå m cã n¨ m thµnh phÇ n. Ba thµnh phÇ n ®Ç u kh«ng cã g× cÇ n nã i thª m. ChØ cã hai thµnh phÇ n cß n l¹ i lµ c¸ c cÊ u tró c ngaysinh vµ ngaybatdaucongtac ®î c x©y dù ng theo cÊ u tró c ngay ®î c ®Þ nh nghÜ a trong vÝ dô 1. §Þ nh nghÜ a cÊ u tró c b»ng typedef: Cã thÓ dï ng to¸ n tö typedef ®Ó ®Þ nh nghÜ a c¸ c kiÓ u cÊ u tró c ngay vµ nhancong ë trª n nh sau: typedef struct { int ngaythu; char thang[12]; int nam;
} ngay; typedef struct {
char ten[15]; char diachi[20] double bacluong; struc ngay ngaysinh; struc ngay ngaybatdaucongtac; } nhancong; 8.2. Khai b¸ o theomé t kiÓ u cÊ u tró c ®· ®Þ nh nghÜ a: X©y dù ng nh÷ ng cÊ u tró c thù c sù theo c¸ c kiÓ u ®· khai b¸ o trí c ®ã. VÊ n ®Ò nµy hoµn toµn giè ng nh viÖ c khai b¸ o c¸ c biÕ n vµ c¸ c m¶ng. Gi¶ sö ta ®· cã c¸ c kiÓ u cÊ u tró c ngay vµ nhancong nh trong mô c trª n. Khi ®ã ta khai b¸ o: VÝ dô 1: struct ngay ngaydi, ngayden;
sÏ cho ta hai cÊ u tró c ví i tª n lµ ngaydi vµ ngayden. C¶ hai cÊ u tró c ®Ò u ®î c x©y dù ng theo cÊ u tró c kiÓ u ngay. VÝ dô 2: struct nhancong nhom1, nhom2; sÏ cho ta hai cÊ u tró c ví i tª n lµ nhom1 vµ nhom2. C¶ hai cÊ u tró c ®Ò u ®î c x©y dù ng theo cÊ u tró c kiÓ u nhancong. Nh vË y, mé t c¸ ch tæ ng qu¸ t, viÖ c khai b¸ o cÊ u tró c ®î c thù c hiÖ n theo mÉ u sau: C¸ ch 1: struct tª n_kiÓ u_cÊ u_tró c_®·_khai_b¸ o danh_s¸ ch_tª n_c¸ c_cÊ u_tró c; (2) Chó ý: C¸ c biÕ n cÊ u tró c ®î c khai b¸ o theo mÉ u trª n sÏ ®î c cÊ p ph¸ t bé nhí mé t c¸ ch ®Ç y ®ñ cho tÊ t c¶ c¸ c thµnh phÇ n cñ a nã. ViÖ c khai b¸ o cã thÓ thù c hiÖ n ®å ng thê i ví i viÖ c ®Þ nh nghÜ a kiÓ u cÊ u tró c. Muè n vË y, chØ cÇ n ®Æ t danh s¸ ch tª n biÕ n cÊ u tró c cÇ n khai b¸ o sau dÊ u } cñ a (*) nh trª n. Nã i c¸ ch kh¸ c, ®Ó võ a khai b¸ o kiÓ u võ a khai b¸ o biÕ n ta dï ng c¸ ch sau: C¸ ch 2: struct tª n_kiÓ u_cÊ u_tró c { C¸ c thµnh phÇ n cñ a cÊ u tró c (3) } danh_s¸ ch_tª n_c¸ c_cÊ u_tró c; VÝ dô: VÝ dô 1: struct ngay { int ngaythu; char thang[12]; int nam; } ngaydi, ngayden; VÝ dô 2: struct nhancong {
char ten[15]; char diachi[20]; double bacluong; struc ngay ngaysinh; struc ngay ngaybatdaucongtac;
} nhom1, nhom2;
Khi võ a ®Þ nh nghÜ a kiÓ u cÊ u tró c võ a khai b¸ o cÊ u tró c nh trong vÝ dô trª n, ta kh«ng thÓ kh«ng cÇ n ®Õ n tª n kiÓ u cÊ u tró c. Nã i c¸ ch kh¸ c cÊ u tró c cã thÓ ®î c khai b¸ o theo c¸ ch sau: struct { C¸ c thµnh phÇ n cñ a cÊ u tró c (4) } danh_s¸ ch_tª n_c¸ c_cÊ u_tró c; VÝ dô: struct { int ngaythu; char thang[12]; int nam; } ngaydi, ngayden; Sù kh¸ c nhau cñ a c¸ c c¸ ch khai b¸ o cÊ u tró c trong (3) vµ (4) lµ ë chç: Ví i (3) ta võ a khai b¸ o ®î c mé t kiÓ u cÊ u tró c võ a khai b¸ o ®î c c¸ c cÊ u tró c, vµ cã thÓ dï ng kiÓ u cÊ u tró c nµy ®Ó khai b¸ o cho c¸ c cÊ u tró c kh¸ c nh trong (2), cß n (4) chØ khai b¸ o ®î c c¸ c cÊ u tró c.
Chó ý: NÕ u dï ng tõ kho¸ typedef ®Ó ®Þ nh nghÜ a kiÓ u cÊ u tró c nh trong mô c 8.1 th× khi khai b¸ o c¸ c cÊ u tró c mí i ta kh«ng cÇ n dï ng tõ kho¸ struct, chØ cÇ n dï ng tª n kiÓ u.
VÝ dô nh kiÓ u cÊ u tró c ngay ®î c khai b¸ o b»ng typedef trong 8.1 th× khi khai b¸ o c¸ c cÊ u tró c mí i lµ ngaydi vµ ngayden cã cï ng kiÓ u ngay ta dï ng dß ng lÖ nh sau:
ngay ngaydi, ngayden; 8.3. Truy nhË p ®Õ n c¸ c thµnh phÇ n cÊ u tró c: Ta ®· kh¸ quen ví i viÖ c sö dô ng c¸ c biÕ n, c¸ c phÇ n tö cñ a m¶ng vµ tª n m¶ng trong c¸ c c©u lÖ nh. Trª n ®©y ta cò ng ®· ®Ò cË p ®Õ n c¸ c thµnh phÇ n cñ a cÊ u tró c lµ biÕ n vµ m¶ng. ViÖ c xö lý mé t cÊ u tró c bao giê cò ng ph¶i ®î c thù c hiÖ n th«ng qua c¸ c thµnh phÇ n cñ a nã. §Ó truy cË p ®Õ n mé t thµnh phÇ n c b¶n (lµ biÕ n hoÆ c m¶ng) cñ a mé t cÊ u tró c ta sö dô ng mé t trong c¸ c c¸ ch viÕ t sau: tª n_cÊ u_tró c.tª n_thµnh_phÇ n tª n_cÊ u_tró c.tª n_cÊ u_tró c.tª n_thµnh_phÇ n tª n_cÊ u_tró c. tª n_cÊ u_tró c.tª n_cÊ u_tró c.tª n_thµnh_phÇ n ..... C¸ ch viÕ t thø nhÊ t nh trª n ®î c sö dô ng khi biÕ n hoÆ c m¶ng lµ thµnh phÇ n trù c tiÕ p cñ a mé t cÊ u tró c. VÝ dô nh biÕ n ngaythu, biÕ n nam vµ m¶ng thang lµ c¸ c thµnh phÇ n trù c tiÕ p cñ a c¸ c cÊ u tró c ngaydi, ngayden. C¸ c biÕ n bacluong, c¸ c m¶ng ten, diachi lµ c¸ c thµnh phÇ n trù c tiÕ p cñ a c¸ c cÊ u tró c nhancong.
C¸ c c¸ ch viÕ t cß n l¹ i nh trª n ®î c sö dô ng khi biÕ n hoÆ c m¶ng lµ thµnh phÇ n trù c tiÕ p cñ a mé t cÊ u tró c mµ b¶n th©n cÊ u tró c nµy l¹ i lµ thµnh phÇ n cñ a c¸ c cÊ u tró c lí n hn.
VÝ dô: Ta xÐ t phÐ p to¸ n trª n c¸ c thµnh phÇ n cñ a cÊ u tró c nhom1, nhom2: C©u lÖ nh: printf(" %s", nhom1.ten); sÏ ®a lª n mµn h× nh tª n cñ a nhom1. C©u lÖ nh: tongluong=nhom1.bacluong+nhom2.bacluong; sÏ g¸ n tæ ng lng cñ a nhom1 vµ nhom2 rå i g¸ n cho biÕ n tongluong. C©u lÖ nh: printf(" %d", nhom1.ngaysinh.ten); sÏ ®a lª n mµn h× nh ngµy sinh cñ a nhom1. C©u lÖ nh: printf(" %d", nhom1. ngaybatdaucongtac.nam); sÏ ®a lª n mµn h× nh ngµy b¾ t ®Ç u c«ng t¸ c cñ a nhom1.
Chó ý: · Cã thÓ sö dô ng phÐ p to¸ n lÊ y ®Þ a chØ ®è i ví i c¸ c thµnh phÇ n cÊ u tró c ®Ó nhË p sè liÖ u trù c tiÕ p vµo c¸ c thµnh phÇ n cÊ u tró c. VÝ dô nh ta viÕ t: scanf(" %d", & nhom1. ngaybatdaucongtac.nam); Nhng ®è i ví i c¸ c thµnh phÇ n kh«ng nguyª n, viÖ c lµm trª n cã thÓ dÉ n ®Õ n treo m¸ y. V× thÕ nª n nhË p sè liÖ u vµo mé t biÕ n trung gian sau ®ã mí i g¸ n cho thµnh phÇ n cñ a cÊ u tró c.
C¸ ch lµm nh sau: int year; scanf(" %d", & year); nhom1. ngaybatdaucongtac.nam=year; · §Ó tr¸ nh dµi dß ng khi lµm viÖ c ví i c¸ c thµnh phÇ n cÊ u tró c ta cã thÓ dï ng lÖ nh #define. VÝ dô trong c©u lª nh scanf ë vÝ dô trª n, ta cã thÓ viÕ t nh sau: #define p nhom1. ngaybatdaucongtac ..... scanf(" %d", & p.nam); VÝ dô: Gi¶ sö ta lË p tr× nh qu¶n lý th«ng tin c¸ n bé. Gi¶ sö mç i d÷ liÖ u cñ a mé t c¸ n bé gå m: · Ngµy th¸ ng n¨ m sinh. · Ngµy th¸ ng n¨ m vµo c quan. · BË c lng. Yª u cÇ u viÕ t mé t chng tr× nh ®Ó: · X©y dù ng cÊ u tró c c së d÷ liÖ u cho c¸ n bé. · Vµo sè lÖ u cñ a mé t c¸ n bé. · §a sè liÖ u ®ã ra m¸ y in. Chng tr× nh ®î c viÕ t nh sau: #include " stdio.h" typedef struct { int ngay; char thang[10]; int nam; } date; typedef struct { date ngaysinh; date ngayvaocq; float luong; } canbo; main() { canbo p; printf(" \n Sinh ngay: "); scanf(" %d", & p.ngaysinh.ngay); printf(" \n Thang: "); scanf(" %d", & p.ngaysinh.thang); printf(" \n Nam: "); scanf(" %d", & p.ngaysinh.nam); printf(" \n Vao co quan ngay: "); scanf(" %d", & p.ngayvaocq.ngay); printf(" \n Thang: "); scanf(" %d", & p.ngayvaocq.thang); printf(" \n Nam: "); scanf(" %d", & p.ngayvaocq.nam); printf(" \n Luong: "); scanf(" %d", & p.luong); fprintf(stdprn, " \n Ngay sinh: %d%s%d", p.ngaysinh.ngay, p.ngaysinh.thang, p.ngaysinh.nam); fprintf(stdprn, " \n Ngay vao co quan: %d%s%d", p.ngayvaocq.ngay, p.ngayvaocq.thang, p.ngayvaocq.nam); fprintf(stdprn, " \n Luong: %8.2f", p.luong); }
8.4. M¶ng cÊ u tró c: Nh ®· ®Ò cË p ë c¸ c chng trí c, khi sö dô ng mé t kiÓ u gi¸ trÞ (vÝ dô nh kiÓ u int) ta cã thÓ khai b¸ o c¸ c biÕ n vµ c¸ c m¶ng kiÓ u ®ã. VÝ dô nh khai b¸ o: int a, b, c[10]; cho ta hai biÕ n nguyª n lµ a, b vµ mé t m¶ng nguyª n c cã 10 phÇ n tö. Hoµn toµn tng tù nh vË y: ta cã thÓ sö dô ng mé t kiÓ u cÊ u tró c ®· m«t¶ ®Ó khai b¸ o c¸ c cÊ u tró c vµ m¶ng cÊ u tró c. C¸ ch khai b¸ o m¶ng cÊ u tró c: struct tª n_kiÓ u_cÊ u_tró c_®·_®Þ nh_nghÜ a tª n_m¶ng_cÊ u_tró c[sè phÇ n tö cñ a m¶ng];
VÝ dô: VÝ dô 1: Gi¶ sö kiÓ u cÊ u tró c canbo ®· ®î c ®Þ nh nghÜ a nh mô c trª n. Khi ®ã dß ng khai b¸ o: struct canbo cb1, cb2, nhom1[10], nhom2[7];
sÏ cho: Hai biÕ n cÊ u tró c cb1 vµ cb2. Hai m¶ng cÊ u tró c nhom1 co 10 phÇ n tö vµ nhom2 cã 7 phÇ n tö vµ mç i phÇ n tö cñ a hai nhã m nµy cã kiÓ u canbo. VÝ dô 2: §o¹ n chng tr× nh sau sÏ tÝ nh tæ ng lng cho c¸ c phÇ n tö nhã m 1: double tongluong=0; for (i=0; i< 10; ++i) tongluong+=nhom1[i].luong;
Chó ý: Kh«ng cho phÐ p sö dô ng phÐ p to¸ n lÊ y ®Þ a chØ ®è i ví i c¸ c thµnh phÇ n cñ a m¶ng cÊ u tró c kh¸ c kiÓ u nguyª n. Ch¼ ng h¹ n kh«ng cho phÐ p sö dô ng c©u lÖ nh sau: scanf(" %f", & nhom1[5].luong); Trong trê ng hî p nµy ta dï ng biÕ n trung gian. 8.5. Khë i ®Ç u mé t cÊ u tró c: Cã thÓ khë i ®Ç u cho mé t cÊ u tró c ngoµi, cÊ u tró c tÜ nh, m¶ng cÊ u tró c ngoµi vµ m¶ng cÊ u tró c tÜ nh 8.6. PhÐ p g¸ n cÊ u tró c: Cã thÓ thù c hiÖ n phÐ p g¸ n trª n c¸ c biÕ n vµ phÇ n tö m¶ng cÊ u tró c cï ng kiÓ u nh sau: · G¸ n hai biÕ n cÊ u tró c cho nhau · G¸ n biÕ n cÊ u tró c cho phÇ n tö m¶ng cÊ u tró c · G¸ n phÇ n tö m¶ng cÊ u tró c cho biÕ n cÊ u tró c · G¸ n hai phÇ n tö m¶ng cÊ u tró c cho nhau Mç i mé t phÐ p g¸ n trª n tng ®ng ví i mé t d·y phÐ p g¸ n c¸ c thµnh phÇ n tng ø ng.
VÝ dô: §o¹ n chng tr× nh sau minh ho¹ c¸ ch dï ng phÐ p g¸ n cÊ u tró c ®Ó ®Ó s¾ p xÕ p n thÝ sinh theo thø tù gi¶m cñ a tæ ng ®iÓ m: struct thisinh { char ht[25]; float td; } tg, ts[100]; for (i=1; i< =n-1; ++i) for (j=1; j< =n; ++j) if (ts[i].td< ts[j].td) { tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } 8.7. Con trá cÊ u tró c vµ ®Þ a chØ cÊ u tró c: 8.7.1. Con trá vµ ®Þ a chØ: Ta xÐ t vÝ dô sau: struct ngay { int ngaythu; char thang[10]; int nam; }; struct nhancong { char ten[20]; char diachi[25]; double bacluong; struct ngay ngaysinh; }; NÕ u khai b¸ o: struct nhancong *p, *p1, *p2, nc1, nc2, ds[100]; ta cã: · p, p1, p2 lµ con trá cÊ u tró c · nc1, nc2 lµ c¸ c biÕ n cÊ u tró c · ds lµ m¶ng cÊ u tró c Con trá cÊ u tró c dï ng ®Ó lu tr÷ ®Þ a chØ cñ a biÕ n cÊ u tró c vµ m¶ng cÊ u tró c. VÝ dô: p1=& nc1; /* Gö i ®Þ a chØ nc1 vµo p1 */ p2=& ds[4]; /* Gö i ®Þ a chØ ds[4] vµo p2 */ p=ds; /* Gö i ®Þ a chØ ds[0] vµo p */
8.7.2. Truy nhË p qua con trá: Cã thÓ truy nhË p ®Õ n c¸ c thµnh phÇ n th«ng qua con trá theo mé t trong hai c¸ ch sau: C¸ ch mé t: Tª n_con_trá -> Tª n_thµnh_phÇ n C¸ ch hai: (*Tª n_con_trá).Tª n_thµnh_phÇ n VÝ dô: nc1.ngaysinh.nam p1-> ngaysinh.nam ds[4].ngaysinh.thang (*p2). ngaysinh.thang 8.7.3. PhÐ p g¸ n qua con trá: Gi¶ sö ta g¸ n: p1=& nc1; p2=& ds[4]; Khi ®ã cã thÓ dï ng: *p1 thay cho nc1 *p2 thay cho ds[4] Tø c lµ viÕ t: ds[5]=nc1; ds[4]=nc2; Tng ®ng ví i: ds[5]=*p1; *p2=nc2;
8.7.4. PhÐ p cé ng ®Þ a chØ: Sau c¸ c phÐ p g¸ n: p=ds; p2=& ds[4]; th× p trá thí i ds[[0]] vµ p2 trá tí i ds[4]. Ta cã thÓ dï ng c¸ c phÐ p cé ng, trõ ®Þ a chØ ®Ó lµm cho p vµ p2 trá tí i c¸ c thµnh phÇ n bÊ t kú nµo kh¸ c.
VÝ dô: Sau c¸ c lÖ nh: p=p+10; p2=p2-4; th× p trá tí i ds[10] cß n p2 trá tí i ds[0]
8.7.5. Con trá vµ m¶ng: Gi¶ sö con trá p trá tí i ®Ç u m¶ng ds, khi ®ã:
· Ta cã thÓ truy nhË p tí i c¸ c thµnh phÇ n cÊ u tró c b»ng c¸ c c¸ ch sau: + ds[i].thµnh_phÇ n ds[i].ngaysinh.nam + p[i].thµnh_phÇ n p[i].ngaysinh.nam + (p+i)-> thµnh_phÇ n (p+i)-> ngaysinh.nam · Khi ta sö dô ng c¶ cÊ u tró c th× c¸ c c¸ ch viÕ t sau lµ tng ®ng: ds[i] p[i] *(p+i) 8.8. CÊ u tró c tù trá vµ danh s¸ ch liª n kÕ t: Khi ta lË p mé t chng tr× nh qu¶n lý mµ b¶n th©n sè biÕ n (cÊ u tró c) cha ®î c biÕ t trí c, nÕ u ta sö dô ng m¶ng (cÊ p ph¸ t bé nhí tÜ nh) th× ta ph¶i sö dô ng sè c¸ c phÇ n tö lµ tè i ®a. Nh vË y sÏ cã rÊ t nhiÒ u vï ng nhí ®î c cÊ p ph¸ t mµ kh«ng bao giê dï ng ®Õ n. Ló c ®ã ta cã c¸ ch ®Ó cÊ p ph¸ t bé nhí ®é ng. Sè vï ng nhí cÊ p ra ®ñ sè biÕ n cÇ n dï ng. CÊ u tró c cã Ý t nhÊ t mé t thµnh phÇ n lµ con trá kiÓ u cÊ u tró c ®ang ®Þ nh nghÜ a gä i lµ cÊ u tró c tù trá.
VÝ dô: C¸ c c¸ ch ®Ó ®Þ nh nghÜ a cÊ u tró c tù trá person: C¸ ch 1: typedef struct pp { char ht[20]; char qq[25]; int tuoi; struct pp *tiep; } person;
C¸ ch 2: typedef struct pp person struct pp { char ht[20]; char qq[25]; int tuoi; person *tiep; };
C¸ ch 3: struct pp { char ht[20]; char qq[25]; int tuoi; struct pp *tiep; }; typedef pp person; CÊ u tró c tù trá ®î c dï ng ®Ó x©y dù ng danh s¸ ch liª n kÕ t (mã c nè i), ®ã lµ mé t nhã m c¸ c cÊ u tró c cã tÝ nh chÊ t sau: (Mã c nè i theo chiÒ u thuË n). · BiÕ t ®Þ a chØ cÊ u tró c ®Ç u ®ang ®î c lu tr÷ trong mé t con trá nµo ®ã. · Trong mç i cÊ u tró c (trõ cÊ u tró c cuè i) chø a ®Þ a chØ cñ a cÊ u tró c tiÕ p sau cñ a danh s¸ ch. · CÊ u tró c cuè i chø a h»ng NULL. VÝ dô:
Ví i danh s¸ ch nµy, ta cã thÓ lÇ n lî t tõ cÊ u tró c ®Ç u ®Õ n cÊ u tró c cuè i theo chiÒ u tõ trª n xuè ng dí i. Nhã m cÊ u tró c mã c nè i theo chiÒ u ngî c cã tÝ nh chÊ t sau: · BiÕ t ®Þ a chØ cÊ u tró c cuè i. · Trong mç i cÊ u tró c (trõ cÊ u tró c ®Ç u) ®Ò u chø ®Þ a chØ cñ a cÊ u tró c trí c. · CÊ u tró c ®Ç u chø a h»ng NULL. Ví i danh s¸ ch nµy, ta cã thÓ lÇ n lî t tõ cÊ u tró c cuè i lª n cÊ u tró c ®Ç u theo chiÒ u tõ dí i lª n trª n. Ngoµi ra, ta cã thÓ x©y dù ng c¸ c danh s¸ ch mµ mç i phÇ n tö chø a hai ®Þ a chØ cñ a cÊ u tró c trí c vµ cÊ u tró c sau. Ví i lo¹ i danh s¸ ch nµy, ta cã thÓ truy nhË p theo c¶ hai chiÒ u trª n. Khi lµm viÖ c ví i danh s¸ ch mã c nè i, ta thê ng ph¶i tiÕ n hµnh c¸ c c«ng viÖ c sau sau: (Gi¶ sö ta cã con trá p, trá pdau chØ cÊ u tró c ®Ç u cñ a danh s¸ ch, con trá tiep lµ thµnh phÇ n con trá cñ a cÊ u tró c) T¹ o danh s¸ ch mí i: · CÊ p ph¸ t bé nhí cho mé t cÊ u tró c · NhË p mé t biÕ n cÊ u tró c vµo vï ng nhí võ a cÊ p · G¸ n ®Þ a chØ cñ a cÊ u tró c sau cho thµnh phÇ n con trá cñ a cÊ u tró c trí c
DuyÖ t qua tÊ t c¶ c¸ c phÇ n tö cñ a danh s¸ ch: · §a trá p vÒ trá cï ng cÊ u tró c ví i pdau b»ng lÖ nh: p=pdau · §Ó chuyÓ n tiÕ p ®Õ n ngê i tiÕ p theo ta dï ng lÖ nh: p=p-> tiep · DÊ u hiÖ u ®Ó biÕ t ®ang xÐ t cÊ u tró c cuè i cï ng cñ a danh s¸ ch lµ: p-> tiep==NULL Lo¹ i mé t cÊ u tró c ra khá i danh s¸ ch: · Lu tr÷ ®Þ a chØ cñ a cÊ u tró c cÇ n lo¹ i vµo mé t con trá (§Ó gi¶i phã ng bé nhí cñ a cÊ u tró c nµy) · Sö a ®Ó cÊ u tró c trí c ®ã cã ®Þ a chØ cñ a cÊ u tró c cÇ n lo¹ i · Gi¶i phã ng bé nhí cÊ u tró c cÇ n lo¹ i
Bæ xung hoÆ c chÌ n mé t cÊ u tró c vµo danh s¸ ch: · CÊ p ph¸ t bé nhí vµ nhË p bæ xung · Sö a thµnh phÇ n con trá trong c¸ c cÊ u tró c cã liª n quan ®Ó ®¶m b¶o mç i cÊ u tró c chø a ®Þ a chØ cñ a cÊ u tró c tiÕ p theo
Hµm cÊ p ph¸ t bé nhí: void *malloc(kichthuoc_t kichthuoc); Hµm lÊ y trong th viÖ n alloc.h hoÆ c stdlib.h. kichthuoc tÝ nh b»ng sè by te. Hµm sÏ ®a con trá vÒ vÞ trÝ «nhí võ a ®î c cÊ p hoÆ c vÒ NULL nÕ u kh«ng ®ñ bé nhí cÇ n thiÕ t. NÕ u kichthuoc == 0 th× nã tr¶ vÒ NULL. VÝ dô: #include " stdio.h" #include " string.h" #include " alloc.h" #include " process.h" int main() { char *str; /* CÊ p ph¸ t bé nhí cho x©u ký tù */ if ((str = malloc(10)) == NULL) { printf(" Not enough memory to allocate buffer\n"); exit(1); /* KÕ t thó c chng tr× nh nÕ u thiÕ u bé nhí */ } /* copy " Hello" vµo x©u */ strcpy(str, " Hello"); /* HiÓ n thÞ x©u */ printf(" String is %s\n", str); /* Gi¶i phã ng bé nhí */ free(str); return 0; }
VÝ dô: T¹ o mé t danh s¸ ch liª n kÕ t. C¸ c biÕ n cÊ u tró c gå m c¸ c trê ng: Hä tª n, Quª qu¸ n, tuæ i, vµ mé t trê ng con trá lµ TiÕ p. Mã c nè i theo chiÒ u thuË n (Vµo trí c ra trí c FIFO first in first out): #include " stdio.h" #include " alloc.h" #include " conio.h" #include " string.h" typedef struct pp { char ht[25]; char qq[20]; int tuoi; struct pp *tiep; } nhansu; main() { char tt; nhansu *pdau, *pcuoi, *p; char tam[10]; clrscr(); pdau=NULL; do { p=(nhansu*)malloc(sizeof(nhansu)); printf(" \n Ho ten: "); gets(p-> ht); printf(" Que quan: "); gets(p-> qq); printf(" Tuoi: "); gets(tam); p-> tuoi=atoi(tam); if (pdau==NULL) { pdau=p; pcuoi=p; p-> tiep=NULL; } else { pcuoi-> tiep=p; pcuoi=p; p-> tiep=NULL; } printf(" \nBam phim bat ky de tiep tuc, ESC de dung"); tt=getch(); } while(tt! =27); /* §a danh s¸ ch liª n kÕ t ra mµn h× nh, trá pdau tro */ printf(" \n Danh sach nhu sau: \n"); p=pdau; while (p! =NULL) { printf(" \n Ho ten: %25s Que: %20s Tuoi: %d", (*p).ht, (*p).qq, (*p).tuoi); p=p-> tiep; } getch(); } Mã c nè i theo chiÒ u ngî c (Vµo sau ra trí c LIFO last in first out): #include " stdio.h" #include " alloc.h" #include " conio.h" #include " string.h" typedef struct pp { char ht[25]; char qq[20]; int tuoi; struct pp *tiep; } nhansu; main() { char tt; nhansu *pdau, *pcuoi, *p; char tam[10]; clrscr(); pdau=NULL; do { p=(nhansu*)malloc(sizeof(nhansu)); printf(" \n Ho ten: "); gets(p-> ht); printf(" Que quan: "); gets(p-> qq); printf(" Tuoi: "); gets(tam); p-> tuoi=atoi(tam); if (pdau==NULL) { pdau=p; pcuoi=p; p-> tiep=NULL; } else { p-> tiep=pcuoi; pcuoi=p; } printf(" \nBam phim bat ky de tiep tuc, ESC de dung"); tt=getch(); } while(tt! =27); /* §a danh s¸ ch liª n kÕ t ra mµn h× nh, trá pdau tro */ printf(" \n Danh sach nhu sau: \n"); p=pcuoi; while (p! =NULL) { printf(" \n Ho ten: %25s Que: %20s Tuoi: %d", (*p).ht, (*p).qq, (*p).tuoi); p=p-> tiep; } getch(); }
|