Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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 ch­ng 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 l­ng, 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Ø, l­ng, 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 ch­ng nµy chó ng ta sÏ minh ho¹ c¸ ch sö dô ng cñ a c¸ c cÊ u tró c trong ch­ng 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 t­ng 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 ch­ng 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 ch­ng 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 ch­ng 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 ngaysinhngaybatdaucongtac ®­î 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 ngaynhancong ë 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 ngaynhancong 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µ ngaydingayden. 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µ nhom1nhom2. 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µ ngaydingayden 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 l­ng cñ a nhom1nhom2 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);

Nh­ng ®è 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 l­ng.

Yª u cÇ u viÕ t mé t ch­ng 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.

Ch­ng 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 ch­ng 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 t­ng 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 ch­ng tr× nh sau sÏ tÝ nh tæ ng l­ng 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 t­ng ®­ng ví i mé t d·y phÐ p g¸ n c¸ c thµnh phÇ n t­ng ø ng.

 

VÝ dô:

§o¹ n ch­ng 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 ®Ó l­u 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;

T­ng ®­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µ t­ng ®­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 ch­ng tr× nh qu¶n lý mµ b¶n th©n sè biÕ n (cÊ u tró c) ch­a ®­î 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 l­u 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ô:

           
   
  .........
     
 
 

 


Pdau
NULL

 

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:

· L­u 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 ch­ng 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();

}

 







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.