You are on page 1of 22
chi duyet duoc danh sch theo mot chiéu nhat dinh. Dé kh4c phuc nhuge diém nay, ta sit dung khai béo sau : Vidu2: struct h_sinh { char ho_ten[20]; float diem; struct h_sinh *truoc, *sau; i Trong cau lénh khai b4o nay, nhd hai thank phan con tr truoc va sau tuong ting chi dia chi cau mic chita thong tin vé cdc hoc sinh ding tién truéc va lién sau trong danh sdch, ta 6 thé dé dang duyét danh séch theo ca hai chiéu "tien" hoac "Idi", Kiéu cu tric ty trd 14 mot co ché linh hoat 4é xay dung danh séch lien két (médc ndi). 3, Danh sach lién két 3.1. Dinh nghia Khi quan lf mt danh s4ch nao 46 thi thuéng xuyén phai cap nhat, them, bét c4c ph4n tit cla danh sdch. Néu sit dung mang sé rat tn kém (khi sé thanh phan mang vuot qué sé phan ti cia danh sdch) hodc 1a khong dit ché dé chita hét cdc thanh phén méi them vao. Trdi lai bing danh sdch lin két, mac di phdi them céc mutng con td trong think phén cau tric, nhumg bi lai danh sach cita chting ta cé thé dai my y (uy theo kha nang cia b6 nhé) va hon thé nifa do sir dung cap phat dong sé khong bi lang phi bo nhé nh trong trutmg hop sé dung mang. M6t cach hinh anh, danh séch lién két g6m céc phdn tir, mdi phan tir cé hai ving chin : ving dif li¢u danh séch va ving lien két. Ving lien két 14 mt hoac nhiéu con trd trd dén cdc phan tit truée hoac sau phan tir dang dugc xét tuy thudc vao yéu cau cha cong viéc cu thé. Hinh sau minh hoa mét kiéu danh séch lien két. 12. GTKTLTC-A 177 ‘Cit phap chung cho khai béo danh séch lién két sit dung kidu da lieu con tr nhu sau : typedef struct kidu_da_liéu { < khai bdéo phén di liéu > < khai béo cfc con trdé lién két > } t_kidu_di® 1igu; Dong typedef struct kiéu_dit_li¢u t_kiéu_dtt_liéu dinh nghia mot kiéu dit ligu méi. Trong kidu ditt li¢u nay 06 hai phén, phan dau khai béo cdc tugng thong thudng, phén thit hai 14 cdc con 16 wé dén chinh cdc kiéu dé ligu 46. Sau day chiing ta phan tich m6t chong trinh dé minh hoa cdch ding danh sdch méc néi quan ly mét }ép hoc gém Ho.tén hoc sinh va Diém thi. 3.2. Bai tap miu Xay dimg chuong trinh quan ly Ho tén he sinh va Diém thi hoc ky cita timg hgc sinh. Danh séch hoc sinh duge sép theo thit ty alphabet. Kién cau nic duge dinh nghia nhu sau : typedef struct hoc_sinh{ char ho_ten[20]; float diem; struct hoc_sinh *tiep; }t_hee_sinh; t_hoc_sinh *head; /* con tré dén déu danh séch */ 178 2 exntc- M6Gi phéin tr chia thong tin cla mot hoc sinh va m6t con tré trd ti dia chi cia edu tic chita c4c thong tin cfia hoc sinh tiép theo trong danh sdch. Danh sach két théc bang mot thanh phan NULL. Nhu vay, ban ddu danh sAch duge gin bang NULL chi ra chua c6 hoc sinh nao duge nhap. M&i khi c6 mot hoc sinh duge nh§p vao, nghia la cé mét thanh ph4n méi duge tao ra, ta phai xin cp phdt mot ving bo nhd 6 kich thuée di dé chita phén tir d6. Ton tir sizeof(ten_kiéu) cho biét kich thuée cén thiét dé cap phat cho mét bién cé kiéu 1a tén_kiéu. Tat nhién khi cap phat nén kiém tra xem ligu c6 cdn di b6 nhé hay khong, diéu nay 1a can thiét dé chuong trinh khong bi treo. fidefine SIZEHS sizeof (t_hoc fin) t_hoc_sinh ths; hs = NULL; if((hs = (t_hoc_sinh *)malloc(SIZEHS)) == NULL) { printf("\n Khong con du bo nho de cap phat"); getch(); } Ch §, cn gin hs = NULL 46 4€ phong trutng hop hs dang to t6i mot thanh phan cdu tric nao dé trong danh séch. = = wa = | pL tec oo 4 Danh sach trudc khi thém phén tif méi Khi thém phn tir méi vao danh séch, chuong trinh sé tu dong tim vi tri thich hop cho phn tit, Ching ta sit dung ham stremp() dé thuc hién cdc phép so sinh ho tén cia ho tén hoc sinh mdi nh4p vao voi ho tén céc hoc sinh trong danh séch (chi ¥ rang, danh sdch cia ching ta luon Indn 179 duge sip xép theo van alphabet cita ho tén cfc hge sinh), Cac tring hop c6 thé xAy ra khi thém mot phan tir méi vao danh sdch : — Néu phan wt méi ¢ déu danh séch, can phai sita lai con ud head. head Danh sach sau khi chén phan tif mdi vao du — Néu phan tir 46 da c6 (hai tén tring nhau) phai c6 sy Iya chon : ligu c6 phai hai hoc sinh khéc nhau hay chi li mot. — Trong cdc trudng hop khic céin phai stra lai con tr cdc thanh phdn mét cdch truc quan nhur sau : head +I Lea 6.5, LeB Danh sdch trifdc khi thém hoc sinh heat} Lea 65. leB fi 65 pee 6. i 180 Danh sach sau khi thém hoc sinh Khi loai bd, céng viéc duge thuc hién theo chiéu ngugc lai. Ching ta ciing cain phai phan bi¢t cdc trudng hop khi danh séch réng hodc phan ar cAn loai bé nam 6 dau danh séch. Chuong trinh sau minh hoa nhimg van dé duoc phan tich 6 trén. #include #include #include #include #include typedef struct hoc_sinh { char ho_ten[{20]; float diem; struct hoc_sinh *tiep; } t_hoe_sinh; t_hoc_sinh *head = NULL; #define SIZEHS sizeof (t_hoc_sinh) main() t t_hoe_sinh *hs,*p,*q: char name[20]; float d; chaz ch int n = 0;/* Ban dau chua co hoc sinh nao */ elrser{); /* Whap vao théng tin ¢ac hee sinh cho dén khi nhaép vao mét tén réng */ do { print£("Nhap vao thong tin cua hoc sinh #d\n",n + 1); ££lush (stdin) ;/* x6a dém ban phim, can thiét khi nhaép x(c)u */ print£(" Ho ten : "}; gets (name) ; ig (stomp (name, ) t= 0) 181 { if. ((hs = (t_hoc_sinh *) (malloc (SIzEHS))) == NULL) { printf ("Khong du bo nho\n' break; n ++; strcpy(hs -> ho_ten,name) ; printf(" Diem : "); sean€ ("%E", &d) ; hs -> diem = d; he -> tiep = NULL; /* chan phan tu méi vao danh sach */ if (head == NULL) head = hs; else Pp = head; whila(p != NULL&&éstromp(p -> ho_ten, hs -> he_ten) < 0) a=P P =p -> tiep; } if (p != NULL 6& stromp(p -> ho_ten, hs -> ho_ten) == 0) { do { f£lush (stdin) ; print£("Co hai hoc sinh trung ten (D/S) ?”); } while (toupper(ch = getchar()) != 'D' && toupper(ch) != 'S'}; 182 if (toupper(ch) == 'S') { free (bs) ; } else while(p != NULL&ééstrcmp(p -> ho_ten, hs -> ho_ten} == 0) aq=Pr P =p -> tiep; af (p == head) C hs -> tiep = head; head = hs; else { q -> tiep = hs; hs -> tiep = p; } while (stremp(name,"") != 0); /* Duyét lai danh sach va in ra danh sdch hoc sinh thi lei */ p = head; while (p { NULL && p -> diem >= 5.0) if (head == p) head = q = p -> tiep; 183 184 else q -> tlep = p -> tiep; @ =p -> tiep; } free(p); P=@ while(p != NULL s& p -> diem < 5.0) { q=pP: P=p -> tiep; ) af (head == NULL) printf ("Khong co hoc sinh thi lai!\n"); else { print£("Danh sach hoc sinh phai thi lai\n \n"); n= 0; Pp = head; while(p != NULL) { printf ("%3d. %20s %6.1£\n", ++ nop -> ho_ten,p -> diem); P =p -> tiep; } printf ("\n Co tong so td hee sinh phai thi } /* Gidi phéng b$ nhé truée khi két thac chuong P = head; while (p != NULL) { q =p -> tiep; free(p); getch(); y Ket qua = Nhap vao thong tin cua hoe sinh 1 Ho ten ; Nguyen Bich Thao Diem: 9 Nhap vao thong tin cua hoc sinh 2 Ho ten : Pham Hai Yen Diem: 4 Nhap vao thong tin cua hoc sinh 3 Ho ten : Nguyen Van Anh Diem :9 Nhap vao thong tin cua hoc sinh 4 Ho ten : Do Thanh Xuan Diem : 3 Nhap vao thong tin cua hoc sinh $ Ho ten : Do Bich Ha Diem :7 Nhap vao thong tin cua hoc sinh 6 Ho ten: Danh sach hoc sinh phai thi lai 1. Do Thanh Xuan 3.0 2. Pham Hai Yen 4.0 Co tong so 2 hoc sinh phai thi lai IV- KIEU HOP (UNION) 4. Khai nim Mot bign kiéu union citing bao gém nhiéu thinh phan gidng nhy mot bign kiéu céu tric, nhung khéc bién kiéu cdu tric & ché : cdc thinh phan 185 cha bién kiéu cAu tric duge cap phat c4c ving nhé khdc nhau, cdn cdc than phan cia bign kiéu union duge cap phat chung mot ving nhé. DO dai cita ving nh di dé chia duge thanh phdn dai nit tong union. Khai bdo md union duge thyc hign nhd ti khéa union. 2, Binh nghia truy nhap dén thanh phan cia union Vigc dinh nghia m6t bién kiéu union, mang cac union, con tré union, cfing nhu céch thttc uy nhap dén cdc thanh phdn ciia bién union duge thyc hien hoan toan tuong tr nhu déi véi cdc cau tric. Mot cfu tic c6 thé c6 thinh phén union va ngugc lai cdc thanh phan cita union lai cé thé 1a cau triic. Vidu: typedef union { unsigned int ival; float fval; unsigned char ch[2]; } val; val a,b,x[10]; Cau lénh trong vi du trén dinh nghia kiéu union val gém ba thanh phan 18 ival, fval va mang ky ty ch. Do dai cia val bing do dai cla trudng fval va bang 4. Tiép dé khai béo c4c bién union a, b va mang cdc union x. Phép gan a.ival = 0xalb2; mot sO hé 16 14 Oxalb2 cho thanh phan ival cia a. Do ival chi chiém 2 byte dau cia union nén sau cau lénh trén ta c6: a.ch[0] = Oxal va a.ch[1] = Oxb2 Nhu vay ta da dung khai b4o union dé t4ch ra byte cao va thdp cua mot sé nguyén. Vi du : Khai béo mot union c6 thanh phn 1a kiéu cffu tric. struct ng{ int ngay; int thang; int nam; 186 struct diachi{ int sonha; char *tenpho; Ve union u { struct ng date struct diachi address; } diachi_ngaysinh; V - BAL TAP MINH HOA Bail. /* Chuong trinh minh hoa kiéu cdéu tric enum (ding khai bao typedef) */ #include typedef enum light_status {Red, Green, Off}; void test_it (void); int check_lights(enum light_status condition) ; main() { test_it(): 4 void test_it() { char input; enum light_status reading; printf£("\n \n 1] Red 2] Green 3] Off \n \n"); printf("Chon kha nang bang so => "); input = getchar(); switch (input) case '1' : reading = Red; case '2' : reading = Green; 187 break; case '3' : reading = Off; break; } /* End of switch */ check_lights (reading) ; } int check_lights(enum light_status condition) { switch (condition) { case Red : print£("Kiem tra ap suat nguon. break; case Green : printf("He thong OK."); break; case Off : printf ("Kiem tra cau chi he thong."); break; ) /* Két thac switch */ Kéi qué: i]Red 2]Green 3] Off Chon kha nang bang so => 2 He thong OK. Bai2. /* Chuong trinh minh hoa cAéch nh4p di liéu vao mét edu tric */ . #include main () { struct { char manufacturer(20]; /* San phdm dién tré. */ int quantity; 7* S& lugng chuyén giao. */ float price each; /* Gia cua méi di€n tré. */ 188 } resistors; /* Bién edu trite. */ float total_value; /* Téng gia tri. */ /* wién thi céc bién : */ /* whap tén cia san phdm : */ printf ("Tan cia sin phdm => "); gets (resistors.manufacturer) ; /* Whap s& luong xudt : */ print£("Sé lugng xudt => "); scang ("%d", Sresistors.quantity) ; /* Nhap gia cha méi san phdm : */ printf ("Gia cada méi san phdm => "); scanf("%£", Gresistors.price_each) ; /* Tinh téng gid tri : */ total_value = resistors.quantity * resistors.price_each; /* Mudt cdc gia tri: */ printf("\n \n"); print£("Muc : ign trdé \n \n"); printf£("san phdm: %s\n",resistors.manufacturer) ; print£("Don gia : $%£\n",xesistors.price_each) ; print£("Sé lugng : %d\n",resistors. quantity) ; print£("Téng gid tri : $%f\n", total_value); Két qua < Ten cla san phém => Ohmite SO luong xuat => 10 Gié cla mdi s4n phim => 0.05 Muc : Dién ro San phim: Ohmite Don gid: $0.050000 SOluomg: 10 Téng gid tri: $0.500000 189 Bai 3. /* Chueng trinh minh hoa con tré céu trac */ #include typedef struct t char manufacturer[20]; /* Tén dién tra. */ int - quantity; /* S& iuong chuyén giao. */ £loat 'price_each; /* Don gia. */ } parts_record; main() { parts_xecord *rced ptr; /* Con tré cdu tric. */ float total_value; /* téng gid tri. */ /* Whaép tén dién tré : */ printf("Tén cia sd4n phdm => "); gets (red_ptr -> manufacturer) ; /* $6 luong chuyén giao : */ print£("Sé luong xudt => "); scanf("#d",red_ptr -> quantity); /* Mhép don gia : */ printf("Gid cia méi san phém => "); scanf("%£",rcd ptr -> price each); /* Tinh téng gia tri : */ total_value = red_ptr -> quantity * red _ptr -> price_each; /* Xudt : */ printf ("\n \n"}; ‘printf ("Muc : Dién tré\n \n"); printf ("San phém: %s\n",rcd_ptr -> manufacturer) ; print£("Don gia : $%f\n",red ptr -> price each); printf ("Sé lugng : %d\n",rcd_ ptr -> quantity); printf ("Téng gia tri : §$£\n", total_value); 190 Keét qua : Ten cia sin phdm => Ohmite SO lung xudt => 10 Gid cia méi sn phdm => 0.05 Mve : Bign tre Sin phim: Ohmite Don gid: $0.050000 Sélyvgng: 10 Téng gid ti: $0.500000 Bai 4. /* Chuong trinh minh hoa ham véi kiéu cdéu trac */ #include typedef struct { char manufacturer[20]; /* Tén dién trad, */ int quantity; /* 8& lugng xudt. */ float price each; /* Bon gid. */ parts_record; parts_record get_input (void) ; /* Phin nhép di ligu. = */ void display output (parts_record resistor_record) ; /* Phan xudt dit ligu. */ main() { } parts record resistor_box; /* Khai bao mét bién edu trac. */ xesistor_box = get_input(); /* Nhap di ligu. */ display output (resistor_box); /* xudt dix ligu. */ parts_record get_input (void) /* Whap di lieu. */ { parts_record resistor_information: /¢* Nhap tén sén phdm : */ 191 printf ("Tén cia sén phdém => "); gets (resistor_information.manufacturer) ; /* S6 lugng xudt : */ printf ("S6 lugng xudt => "); seanf ("%d" , Gresistor_information.quantity) ; 7/* Bon gia : */ print£("Gid cia méi san phdm => "); scanf("%£", &resistor_information.price_each) ; return (resistor_information) ; } void display_output (parts_zecord resistor_information) 1 /* Xudt 2 */ printf ("\n \n"); print£("Muc : Bién trd\n \n"); printé ("San ‘phém : %s\n", . resistor_information.manufacturer) ; Pprint£ ("Bon gia : $%£\n", resistor_information.price_each) ; printf("S6 lugng : %d\n" xesistor_information.quantity) ; } Két qua : ‘Ten cia san phém => Ohmite 86 Iugng xudt => 10 Gid cia méi san phdm => 0.05 Muc; Dien wo Sin phim: Ohmite Don gid: $0.050000 SO luong: 10 192 Bai 5. /* Minh hoa cach khdi tao mot danh séch lién két*/ #include #include typedef struct node { char data; struct node *link; } LNODE; void show_list(LNODE *ptr) ; main () { LNODE ‘nl, *n2, *n3; nl = malloc (sizeof (LNODE) ) n2_= malloc (sizeof {LNODE) ) ; n3 = malloc (sizeof (LNODE)) ; nmi -> data = ‘ce’; nl -> link n2 -> data n2 -> link = n3 -> data = n3 -> link = NULL; printf("Danh sach lién két sé la : show_list(n1); } void show_list (LNODE *ptr) { while(ptr != NULL) { print£("te",ptr -> da! ptr = ptr -> link; } printf ("\n"); } Ket qud : Danh séch lien két sé 1a: cat 13. GTKTLTC-A, 193 Bai 6. /* Minh hoa céch nhép dit 1igu vdo danh s4ch lién két ty nguéi st dung */ #include #include typedef struct node { char data; struct node *link; } LNODE; void show_list(LNODE *ptr); void add_node(LNODE **ptr, char item); main() { LNODE *nl = NULL; char item; do { print£("\n Nhap dit ligu : item = getche(); if(item {= '\r') add_node(sn1,item) ; fs Ne); printf("\n Danh séch lién két méi 58 14 show_list(n1) ; } while(item } void show_list(LNODE *ptr) t while(ptr != NULL) { print£("%c",ptr -> data); ptr = ptr -> link; \ 194 13, oreTLTC-6 print£("\n"); } void add_node(LNODE **ptr, char item) . { LNODE *pi, *p2; pl = *ptr; if (pl == NULL) { Pl = malloc (sizeof ({LNODE) ); if(pl != NULL) { pl -> data = item; pl -> link = NULL; *ptr = pl; } + else { while(pl -> link t= NULL) pl = pl -> link; p2 = malloc(sizeof (LNODE)) ; 4£(p2 != NULL) { p2 -> data = item; p2 -> link = NULL; pl -> link = p2; } } Ket qua : Nhap dit liu : ¢ Nhap dit lig Nhap dit lieu : u Nhap dit lieu : Danh sach lien ket m6i sé 1a: cpu 195 Bai 7. /* Chuong trinh minh hoa kiéu edu tric Union */ #include main() { union /* Dinh nghia union. */ C int integer value; float value; } integex_or float: print£("Kich c@ kigu union => %d bytes.\n", sizeof (intager_or_float)) ; /* Nhap mét sé va hién thi né : */ integer_or_float.integer_value = 123; printf£("Gid tri cia sé nguyén = %d\n", Anteger_or_float.integer_value) ; printf ("Bia chi bat déu 14 => %d\n", Sinteger_or_float.integer_value) ; /* Nbap mét sd thyc va hién thi né : */ integer_or_float.value = 123.45; printf ("Giaé tri cia thuc 1a %£\n", integer_or_float. value); printf£("Dia chi baét ddu 1a => %d\n", &integer_or_float.value) ; Kéi qua: Kich cd kiéu union => 4 Gié tri cha s6 nguyen = 123 Dia chi bat dau la => 7042 Gid tr} cfla sé thyc 1 123.45 Dia chi bat déu 1a => 7042 196 VI- BAI TAP TY GIAI Bai 1, Viét chong tinh ding kiéu céu tric dé ghi ngay sinh, ngay tuyén dung va bac Iuong cia nhan vien. Bai 2. Viet chuong trinh s4p xép mot danh sdch cé kiéu cau mic. Goi ys . typedef struct { char Ho[181; char Ten[8]; int Bacluong; } Person; void Compare(Person *p, Person *q) { int k; k = stromp(p -> Ten,q -> Ten); if(k == 0) k = stremp(p -> Ho,q -> Ho); return k; } Bai 3. Viet chong trinh nh4p mot danh sdch hoc sinh bao gém Ho, Ten, Tu6i, Diém Ton, Diém Ly, Diém Hod va Diém Trung Binh. Sép x€p Tén, Ho theo thir tr ting din. Sau 46 xuat ra danh sch nay gém Ho, Ten va Diém Trung Binh. Bai 4. Viét chuong trinh nhap them mot nut vao dau danh sdch. Bai 5, Viét chuong trinh nhap them mot nuit vao cudi danh s4ch. Bai 6. Viét chuong trinh loai bé mot nuit 6 dau danh sdch. Bai 7. Viet chuong trinh loai bé mot nuit 6 cudi danh sdch. 197 Chitong 12 THAO TAC VOI TEP TIN (FILE) Se 1— KHAI NIEM VE TEP TIN ‘Tep tin hay tép dit ligu 1A mgt tap hop céc dit ligu c6 lien quan voi nhau va ¢6 cing mot kiéu dug nh6m Iai v6i nhau thanh mot day. Ching thudng due chita trong mot thiet bi nho ngoai cla méy tinh (dia mém, dia cig...) dudi mot c4i tén nao dé. Tep tin duge chita tong bd nhé ngoai, duge Iuu trit dé ding nhiéu ln va tn tai ngay ca khi chuong trinh két thiic hoac mat dién. Tep tin giéng mang & ché chting déu 1a 4p hop cla céc phan tir dit Tigu cling kiéu, song mang thudng c6 sé phan tir c6 djnh, s6 phan tir cha tep khong duge xdc dinh trong dinh nghia. Mot tép tin di. duge xay dung bang cach nao di nia ciing chi don gidn 1 mot day cde byte ghi tren dia (mdi byte c6 gid tri ti 0 d€n 258), SO byte cila day chinh 1a do dai ciia tép. Il- KHAT BAO DU LIEU Trong C.c6 hai loai ham thao téc tren tep tin : ~ Ham cdp 1 : La nhitag ham cap thap lam vige véi tep tin thong qua mOt s6 higu tép tin (file handle). ~ Ham edp 2 : La nhing ham duge xay dung titnhiing ham céip 1, dé sit dung hon. Cé ede ham phuc vu cho vic doc/ghi tren timg loai dtt lieu (86, chudi, ky ty, cu tnic,...). 198

You might also like