版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第11章 構(gòu)造體和共用體主講 北京交通大學(xué)計(jì)算機(jī)學(xué)院 趙宏 : zhaohong671631第一節(jié) 構(gòu)造體與共用體概述第二節(jié) 構(gòu)造體類型和構(gòu)造體變量的定義第三節(jié) 構(gòu)造體類型變量的援用第四節(jié) 構(gòu)造體與數(shù)組第五節(jié) 構(gòu)造體與指針第六節(jié) 構(gòu)造體的運(yùn)用-鏈表第七節(jié) 共用體第八節(jié) 運(yùn)用typedef定義數(shù)據(jù)類型2第一節(jié) 構(gòu)造體與共用體概述構(gòu)造體構(gòu)造一個(gè)構(gòu)造體類的數(shù)據(jù)類型的普通方式: struct 構(gòu)造類型名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; : 類型標(biāo)識(shí)符 成員名; ;例: struct studentchar number10; char name20; char sex; int age;
2、float score20; char addr30; ;3共用體構(gòu)造一個(gè)共用體類的數(shù)據(jù)類型的普通方式: union 共用體類型名 類型標(biāo)識(shí)符 成員名; . 類型標(biāo)識(shí)符 成員名; ;例如: union data int i; char c; float f; ;4第二節(jié) 構(gòu)造體類型和構(gòu)造體變量的定義定義構(gòu)造體類數(shù)據(jù)類型變量的三種方式構(gòu)造體類數(shù)據(jù)類型變量的初始化5方式一先構(gòu)造構(gòu)造體類的數(shù)據(jù)類型,后定義具有這種構(gòu)造的變量。 struct 構(gòu)造體類型名 類型標(biāo)識(shí)符 成員名; : 類型標(biāo)識(shí)符 成員名; ; struct 構(gòu)造體類型名 變量名1,變量名2.;例如:struct student char
3、number10; char name20; char sex; int age; float score20; char addr30; ; struct student stud1,stud2;6在構(gòu)造構(gòu)造體類的數(shù)據(jù)類型時(shí)同時(shí)定義具有這種構(gòu)造的變量。 struct 構(gòu)造體類型名 類型標(biāo)識(shí)符 成員名; : 類型標(biāo)識(shí)符 成員名; 變量名1,變量名2,.;方式二例如:struct student char number10; char name20; char sex; int age; float score20; char addr30; stud1,stud2;7利用無(wú)名構(gòu)造體類型定義變量
4、。 struct 類型標(biāo)識(shí)符 成員名; : 類型標(biāo)識(shí)符 成員名; 變量名1,變量名2,.;方式三例如:struct char number10; char name20; char sex; int age; float score20; char addr30; stud1,stud2;8變量的初始化struct stud long num; char name20; char sex; char addr30;stud1=9708,Liwei,F,144BeijingRoad;9闡明構(gòu)造體的類型不分配存儲(chǔ)單元,用構(gòu)造體類數(shù)據(jù)類型定義的變量會(huì)分配存儲(chǔ)空間;對(duì)構(gòu)造體中的成員,可以單獨(dú)運(yùn)用,它的
5、作用與位置相當(dāng)于普通變量;一個(gè)構(gòu)造體的成員名字不能一樣,但兩個(gè)構(gòu)造體中可以運(yùn)用同名成員,成員名也可以與程序中的變量名一樣,二者代表不同的對(duì)象;成員也可以是一個(gè)構(gòu)造體變量(嵌套。10例如: struct date int month; int day; int year; ;struct student char name20; struct date birthday; char sex; char addr30; long number; stud;11第三節(jié) 構(gòu)造體類型變量的援用1、對(duì)構(gòu)造體變量的運(yùn)用是經(jīng)過(guò)對(duì)數(shù)據(jù)類型為根本類型的成員的援用來(lái)實(shí)現(xiàn)的。援用構(gòu)造體成員的普通方式如下: 構(gòu)造變量名
6、.成員名 例如 stud1.age=18; 其中的圓點(diǎn)符號(hào)稱為成員運(yùn)算符,它的運(yùn)算級(jí)別最高。2、援用構(gòu)造體類數(shù)據(jù)類型變量的成員的方式是由“整體到部分來(lái)指明的。假設(shè)指明的構(gòu)造體成員又是一個(gè)構(gòu)造體類數(shù)據(jù)類型,那么可以運(yùn)用多個(gè)成員運(yùn)算符,例如: stud.birthday.month=9;假設(shè)指明的成員是一個(gè)數(shù)組,那么不能整體援用,但可以運(yùn)用該成員的某個(gè)元素,如: stud.score0=65;123、用“&運(yùn)算符可以取構(gòu)造體變量的首地址和某個(gè)成員的首地址。例如: printf(“%dn,&stud); scanf(“%cn,&stud.sex); scanf(“%dn,&stud.birthday
7、.month);對(duì)數(shù)組成員的首地址,可以省略地址運(yùn)算符,如: scanf(“%s,);4、對(duì)成員變量可以象普通變量一樣進(jìn)展各種運(yùn)算,例如: sum=stud.score0+ stud.score1+ stud.score2 13構(gòu)造體變量的輸入和輸出C言語(yǔ)不允許把一個(gè)構(gòu)造體變量作為一個(gè)整體進(jìn)展輸入或輸出的操作。例如: struct long num; char name20; stud;不允許 scanf(%d,&stud); printf(%d,stud;可以用 scanf(%ld%s,&stud.num,); printf(%ld,%s, stud.nu
8、m, ); 14留意: 1、由于構(gòu)造體是由不同類型成員組成的,所以在用scanf函數(shù)輸入不同類型數(shù)據(jù)時(shí)有時(shí)會(huì)出現(xiàn)預(yù)料不到的事情,例如: main() struct int i; char ch1; char ch2; tt; scanf(“%d%c%c,&tt.i,&tt.ch1,&tt.ch2); printf(“i=%d,ch1=%c,ch2=%c,tt.i,tt.ch1,tt.ch2); 輸入125 a b運(yùn)轉(zhuǎn)結(jié)果?i=125,ch1= ,ch2=a152、盡量防止用一個(gè)scanf函數(shù)輸入包含字符數(shù)據(jù)在內(nèi)的一組不同類型的數(shù)據(jù),以免出錯(cuò)。處置方法:各種數(shù)據(jù)都用gets函數(shù)
9、輸入,然后再用轉(zhuǎn)換函數(shù)進(jìn)展轉(zhuǎn)換:atoi() 將字符串轉(zhuǎn)換成整型atof() 將字符串轉(zhuǎn)換成double型實(shí)數(shù)atol() 將字符串轉(zhuǎn)換生長(zhǎng)整型這三個(gè)函數(shù)要用#include命令將“stdlib.h文件包含進(jìn)來(lái)。16輸入例如1:#include stdlib.h#include stdio.hmain() int i; char ch,ch1,ch2; char numstr10; gets(numstr); i=atoi(numstr); ch1=getchar(); ch=getchar(); ch2=getchar(); printf(i=%d,ch1=%c,ch2=%cn,i,ch1,
10、ch2); 程序運(yùn)轉(zhuǎn)結(jié)果如下: 128 a b i=128,ch1=a,ch2=b17輸入例如2:輸入3個(gè)學(xué)生的信息并輸出。#include stdlib.h#include stdio.hstruct stud long num; char name20; char sex; int age; float score; ;18main() struct stud student3; int i; char ch; char numstr20; for(i=0;i3;i+) gets(numstr); studenti.num=atol(numstr); gets()
11、; studenti.sex=getchar(); ch=getchar(); gets(numstr); studenti.age=atoi(numstr); gets(numstr); studenti.score=atof(numstr); for(i=0;i3;i+) printf(%ld %-15s %3c %6d %6.2fn,studenti.num,, studenti.sex,studenti.age,studenti.score); 19第四節(jié) 構(gòu)造體數(shù)組構(gòu)造體數(shù)組的定義構(gòu)造體數(shù)組的初始化 構(gòu)造體數(shù)組的援用20先定義構(gòu)造體類型,再定義構(gòu)造體數(shù)組。
12、struct student long num; char name20; int age; float score; ; struct student stud3;定義方法一21在定義構(gòu)造體類型的同時(shí)定義構(gòu)造體數(shù)組。 struct student long num; char name20; int age; float score; stud3;方法二22直接定義構(gòu)造體數(shù)組。 struct long num; char name20; int age; float score; stud3;方法三23構(gòu)造體數(shù)組在內(nèi)存中的存儲(chǔ):1按數(shù)組下標(biāo)由小到大2在給每個(gè)數(shù)組元素的空間內(nèi)再按照成員的順序延
13、續(xù)存放。 stud0 9701,liMing,20,98 stud1 9702, WangDan, 20,95 stud2 9703, LiHui, 19,809701LiMing20989702WangDan20959703LiHui198024初始化struct student long num; char name20; int age; float score;stud3=9701,liMing,20,98, 9702, WangDan,20,95, 9703, LiHui,19,80;25援用援用某構(gòu)造體數(shù)組元素的一個(gè)成員,可用以下方式: studi.num成員名序號(hào)數(shù)組名26闡明不
14、能將構(gòu)造體數(shù)組元素作為一個(gè)整體直接進(jìn)展輸入或輸出,只能以單個(gè)成員為對(duì)象進(jìn)展輸入輸出。例如: scanf(%s,); printf(%ld,%s,%d,%f, stud1.num , stud1.age, stud1.score); 27 例1 在N名畢業(yè)生中查找上海籍的學(xué)生。 #define N 3 struct char name20; char sex3; int age; int score; char addr30; studN=“張利平,“男,23,79,“上海, “錢龍,“女,24,85,“南京, 劉其山,男,22,66,上海; main(
15、) int i; for(i=0;i成員名例如:p-age=18;(*指針變量名).成員名例如:(*p).age=1831闡明:*p兩冊(cè)的括號(hào)不能省略,由于成員運(yùn)算符“.優(yōu)于“*運(yùn)算符,*p.age等價(jià)于*(p.age)p已定義為指向一個(gè)構(gòu)造體類型的指針變量,它只能指向構(gòu)造體變量而不能指向它其中的一個(gè)成員。如p=&stud1.age是錯(cuò)誤的?!?運(yùn)算符優(yōu)先級(jí)別最高,例如: p-age+1等價(jià)于(p-age)+1 +p-age等價(jià)于+(p-age)32例2:在三個(gè)學(xué)生中查找出成果最好的學(xué)生并顯示該學(xué)生的情況。 struct student char name20; char sex3; int
16、age; int score; char addr30; ; struct student stud1=張利平,男,23,79,上海; struct student stud2=錢 龍,女,24,85,南京; struct student stud3=劉其山,男,22,66,上海; main() int i; struct student *p=&stud1; if(p-scorescorename,p-sex, p-age,p-score,p-addr); 33指向構(gòu)造體數(shù)組的指針一個(gè)指針變量指向一個(gè)構(gòu)造體數(shù)組,也就是將該數(shù)組的起始地址賦給此指針變量。定義一個(gè)構(gòu)造體類型再定義屬于這種構(gòu)造體類
17、型的數(shù)組和指向這種構(gòu)造體類型的指針變量把數(shù)組的首地址賦給指針變量34例3 用指向構(gòu)造體數(shù)組的指針變量改寫例1 #define N 3 struct char name20; char sex3; int age; int score; char addr30; studN=張利平, 男,23,79, 上海, 錢 龍, 女,24,85, 南京, 劉其山, 男,22,66, 上海,*p=stud; main() int i; for(i=0;iN;i+,p+) if(strcmp(*p).addr,上海)=0) printf(%s %s %d %d %sn, (*p).name,(*p).sex,
18、(*p).age,(*p).score,(*p).addr); 35處置構(gòu)造體類數(shù)據(jù)的函數(shù)參數(shù)例4 改寫例1,每查找到一個(gè)上海籍學(xué)生就調(diào)用函數(shù) print把該學(xué)生的情況顯示在屏幕上。 #include stu.h main() int i; for(i=0;iN;i+) if(strcmp(studi.addr,“上海)=0) print(,studi.sex,studi.age, studi.score,studi.addr); void print(char name,char sex,int age,int score,char addr) printf(%s %s
19、%d %d %sn,name,sex,age,score,addr);36例5 改寫例4程序main函數(shù),把調(diào)用函數(shù)print時(shí)的實(shí)參由某個(gè)詳細(xì)構(gòu)造體數(shù)據(jù)的成員變量名.成員名改動(dòng)為指向該詳細(xì)數(shù)據(jù)的指針變量(*指針變量名).成員名 #include stu.h main() int i; for(i=0;iN;i+,p+) if(strcmp(*p).addr,上海)=0) print(*p).name,(*p).sex,(*p).age,(*p).score,(*p).addr); print(char name,char sex,int age,int score,char addr) pr
20、intf(%s %s %d %d %sn,name,sex,age,score,addr);37 例6改寫例題4中函數(shù)print,用指向構(gòu)造體類數(shù)據(jù)類型的指針變量作為函數(shù)的形參。 #include stu.h main() int i; for(i=0;iname,p-sex,p-age, p-score,p-addr); 38 例7改寫例4中函數(shù)print和main,用指向構(gòu)造體類數(shù)據(jù)類型的指針變量作為函數(shù)的形參和實(shí)參。#include stu.h main() int i; for(i=0;iname, p-sex,p-age,p-score,p-addr); 39鏈表概述指針根本操作建立
21、鏈表輸出鏈表第六節(jié) 構(gòu)造體的運(yùn)用-鏈表插入結(jié)點(diǎn)刪除結(jié)點(diǎn)結(jié)點(diǎn)排序40鏈表概述單鏈表head2970165970232829703null21296328212967670循環(huán)單鏈表head2970165970232829703221296328212967670雙向鏈表15062150665232821296null21296328212967670412、單鏈表用包含指針項(xiàng)的構(gòu)造體變量構(gòu)成結(jié)點(diǎn)兩部分組成:對(duì)用戶有用的數(shù)據(jù)用來(lái)存放下一個(gè)結(jié)點(diǎn)地址的一個(gè)指針類型數(shù)據(jù)項(xiàng)struct stud_ score long num; float score; struct stud_score *next;
22、; num和score成員用來(lái)存放學(xué)號(hào)和成果,next是指針變量,它指向struct stud_score類型的變量。next指針項(xiàng)必需指向與next所在的結(jié)點(diǎn)是同一類型的結(jié)點(diǎn)。423、用于動(dòng)態(tài)存儲(chǔ)分配的函數(shù)(1)malloc函數(shù) 其作用是在內(nèi)存開辟指定大小的存儲(chǔ)空間,并將此存儲(chǔ)空間的起始地址作為函數(shù)值帶回。malloc函數(shù)的方式: void *mallocunsigned int size 或 char *mallocunsigned int size它的形參size為無(wú)符號(hào)整型。函數(shù)值為指針地址,例如:用malloc8來(lái)開辟一個(gè)長(zhǎng)度為8個(gè)字節(jié)的內(nèi)存空間,假設(shè)系統(tǒng)分配的此段空間的起始地址為2
23、,那么malloc8的函數(shù)前往值為2。 假設(shè)內(nèi)存缺乏足夠大的空間進(jìn)展分配,那么malloc函數(shù)值為“空指針,即地址為0。(2) calloc函數(shù) 其函數(shù)模型為: void *callocunsigned int n,unsigned int size它有兩個(gè)形參n和size,其作用是分配n個(gè)大小為size字節(jié)的空間,例如:用calloc10,16可以開辟10個(gè)每個(gè)大小為16字節(jié)的空間,共160字節(jié)。函數(shù)前往值為該空間的首地址。43(3) free函數(shù)其函數(shù)模型為: void freevoid *ptr其作用是將指針變量ptr指向的存儲(chǔ)空間釋放,系統(tǒng)可以另分配。留意:ptr值不能是恣意的地址,而
24、是在程序中執(zhí)行過(guò)的malloc或calloc函數(shù)所前往的地址。free函數(shù)無(wú)前往值。44(4) realloc函數(shù)用來(lái)使已分配的空間改動(dòng)大小,即重新分配。其函數(shù)模型為: void *recallocvoid *ptr,unsigned int size其作用是將ptr指向的存儲(chǔ)區(qū)用malloc函數(shù)分配的的大小改為size個(gè)字節(jié)。它的前往值是新的存儲(chǔ)區(qū)的首地址。 運(yùn)用這些函數(shù)時(shí)要用#include命令將stdlib.h文件包含進(jìn)來(lái)。但有的系統(tǒng)用malloc.h而不是stdlib.h。在運(yùn)用時(shí)請(qǐng)留意系統(tǒng)的規(guī)定。有的系統(tǒng)那么不要求包括任何“頭文件。45指針根本操作有定義#define LEN siz
25、eof(struct node)struct node int data; struct node *next; ;struct node *p,*q;46操作(1)p=(struct node *)malloc(size of(LEN)功能懇求一個(gè)結(jié)點(diǎn)的空間,將地址送入p操作后形狀p47操作(2)free(p)功能釋放指針變量pp操作后形狀pnull操作前形狀48操作(3)p=q功能指針變量p指向q所指的結(jié)點(diǎn)p操作前形狀操作后形狀qp49操作(4)p=q-next功能指針變量p指向q所指的結(jié)點(diǎn)的后一個(gè)結(jié)點(diǎn)操作前形狀操作后形狀qp50操作(5)p=p-next功能指針變量p向后挪動(dòng)一個(gè)結(jié)點(diǎn)操作
26、前形狀操作后形狀pp51操作(6)p-next=q功能將指針q所指結(jié)點(diǎn)接到p所指結(jié)點(diǎn)之后操作前形狀操作后形狀pq52操作(7)p-next=null功能將指針p所指結(jié)點(diǎn)與后已結(jié)點(diǎn)截?cái)嗖僮髑靶螤畈僮骱笮螤頿53建立鏈表(方法一)鏈表只能在程序執(zhí)行過(guò)程中動(dòng)態(tài)地生成。有兩種方法:方法一根本思想 假設(shè)前i-1個(gè)元素曾經(jīng)存放到以head為頭指針的單鏈表中,且指針p指向該鏈表中最后一個(gè)結(jié)點(diǎn),那么讀入第i個(gè)元素后,首先動(dòng)態(tài)生成一個(gè)結(jié)點(diǎn),其數(shù)據(jù)域存放元素,然后插入到p結(jié)點(diǎn)之后,并令p指向新插入的結(jié)點(diǎn)。假設(shè)i為1,那么令頭指針head指向新插入的結(jié)點(diǎn)。 54定義:struct student long num;
27、 int score; struct student *next; ; p1=(struct student *)malloc(LEN); scanf(%ld%d,&p1-num,&p1-score); while(p1-num!=0) if(+n=1) head=p1; else p2-next=p1; p2=p1; p1=(struct student *)malloc(LEN); scanf(%ld%d,&p1-num,&p1-score);55head9701p1headp2879701879702p167(n=1)(n=2)headp29701879702p167headp29701
28、87970267p1(a)(b)(c)p256方法一步驟定義構(gòu)造體及指向這種構(gòu)造體的三個(gè)指針變量head,p1,p2head=null,n=0懇求一個(gè)結(jié)點(diǎn),讓p1指向此結(jié)點(diǎn)對(duì)p1指向的結(jié)點(diǎn)的各個(gè)成員賦值當(dāng)p1-num不是零n=n+1if(n=1)head=p1; else p2-next=p1p2=p1開辟一個(gè)新結(jié)點(diǎn)使p1指向它讀入一個(gè)數(shù)據(jù)給p1所指的結(jié)點(diǎn)表尾結(jié)點(diǎn)的指針變量置null 57函數(shù)實(shí)現(xiàn) #include #include #include #define NULL 0 #define LEN sizeof(struct student) struct student long nu
29、m; int score; struct student *next; ; int n; 58struct student *creat() struct student *p1,*p2,*head; head=NULL;n=0; p1=(struct student *)malloc(LEN); scanf(%ld%d,&p1-num,&p1-score); while(p1-num!=0) if(+n=1) head=p1; else p2-next=p1; p2=p1; p1=(struct student *)malloc(LEN); scanf(%ld%d,&p1-num,&p1-s
30、core); p2-next=NULL; free(p1); return(head); 59建立鏈表方法二方法二根本思想 假設(shè)鏈表中曾經(jīng)依次存放第i+1到第N個(gè)數(shù)據(jù),如今輸入第i個(gè)元素,建立第i個(gè)元素的結(jié)點(diǎn)后,將其插入到當(dāng)前鏈表的第一個(gè)結(jié)點(diǎn)之前,成為新鏈表的第一個(gè)結(jié)點(diǎn)。這種鏈表的建立方法是從最后一個(gè)結(jié)點(diǎn)開場(chǎng),從后依次插入結(jié)點(diǎn)。60head9701phead87null970187null9702p67(a)(c)head970187null9702p67head970187null9702p67(b)head=NULL;p=(struct student *)malloc(LEN);scan
31、f(%ld%d,&p-num,&p-score); while(p-num!=0) p-next=head; head=p; p=(struct student *)malloc(LEN); scanf(%ld%d,&p-num,&p-score); 61方法二步驟定義構(gòu)造體及指向這種構(gòu)造體的二個(gè)指針變量head,phead=null懇求一個(gè)結(jié)點(diǎn),讓p指向此結(jié)點(diǎn)對(duì)p指向的結(jié)點(diǎn)的各個(gè)成員賦值當(dāng)p-num不是零p-next=headhead=p懇求一個(gè)結(jié)點(diǎn),讓p指向此結(jié)點(diǎn)對(duì)p指向的結(jié)點(diǎn)的各個(gè)成員賦值 62函數(shù)實(shí)現(xiàn):#include #include #include #define NULL 0#
32、define LEN sizeof(struct student) struct student long num; int score; struct student *next; ; 63struct student *creat() struct student *p,*head; head=NULL; p=(struct student *)malloc(LEN); scanf(%ld%d,&p-num,&p-score); while(p-num!=0) p-next=head; head=p; p=(struct student *)malloc(LEN); scanf(%ld%d
33、,&p-num,&p-score); return(head); 64根本思想:從p指向的第一個(gè)結(jié)點(diǎn)開場(chǎng),檢查該結(jié)點(diǎn)中的num值能否等于要?jiǎng)h除的哪個(gè)學(xué)號(hào)。假設(shè)相等就刪除該結(jié)點(diǎn),如不相等就將p后移一個(gè)結(jié)點(diǎn),再如此進(jìn)展下去。刪除結(jié)點(diǎn)65heada1aiai+1ai-1p2heada1aiai-1p1p2ai+1p1annullannulla1aiai+1a2p2p1annullheada1aiai+1a2p2p1annullheadhead=p1-next;p2-next=p1-next;66刪除結(jié)點(diǎn)步驟定義構(gòu)造體及指向這種構(gòu)造體的二個(gè)指針變量p1,p2p1=head當(dāng)p1-num!=num并且p
34、1不為空/*查找要?jiǎng)h除的結(jié)點(diǎn)*/p2=p1p1=p1-nextif (p1-num等于num)/*刪除結(jié)點(diǎn)*/if(p1是第一個(gè)結(jié)點(diǎn)) head=p1-nextelse p2-next=p1-nextfree(p1)n=n-1else 打印沒有找到要?jiǎng)h除的結(jié)點(diǎn)67struct student *del(struct student *head,long num)struct student *p1,*p2; p1=head; while(p1-num!=num&p1!=NULL) p2=p1; p1=p1-next; if(p1=NULL) printf(nthere is not%ldn,n
35、um); else if(p1=head) head=p1-next; else p2-next=p1-next; free(p1); printf(ndelete:%ldn,num); n=n-1; return(head);68將一個(gè)結(jié)點(diǎn)插入到一個(gè)已有的鏈表中,設(shè)已有的鏈表中各結(jié)點(diǎn)中的成員項(xiàng)num按照學(xué)號(hào)由小到大順序陳列。根本思想:從p指向的第一個(gè)結(jié)點(diǎn)開場(chǎng),檢查要插入結(jié)點(diǎn)的num能否小于p指向結(jié)點(diǎn)中的num值。假設(shè)小于就將要插入的結(jié)點(diǎn)插入在該結(jié)點(diǎn)之前,否那么就將p后移一個(gè)結(jié)點(diǎn),再如此進(jìn)展下去。插入結(jié)點(diǎn)69a1aiai+1a2p1annullheadhead=p0;p0-next=p1;p0
36、numa1aiai+1a2p1annullheadp0num第一種情況,插入位置在第一個(gè)結(jié)點(diǎn)之前:70a1aiai+1ai-1p1annullheadp2-next=p0;p0-next=p1;p0numa1aiai+1ai-1annullheadp0num第二種情況,插入位置在中間某結(jié)點(diǎn)之前:p1p2p271a1aiai+1ai-1annullheadp2-next=p0;p0-next=null;p0numa1aiai+1ai-1anheadp0numnull第三種情況,插入位置在最后結(jié)點(diǎn)之后:p2p272插入結(jié)點(diǎn)步驟定義構(gòu)造體及指向這種構(gòu)造體的三個(gè)指針變量p0 ,p1,p2p1=head
37、,p0=stud當(dāng)p0-num=p1-num并且p1不為空/*查找要插入的位置*/p2=p1p1=p1-nextif (p0-numnum)/*插入結(jié)點(diǎn)*/if(p1是頭結(jié)點(diǎn)) head=p0;p0-next=p1else p2-next=p0;p0-next=p1;if (p1=null)/*即輸入的學(xué)號(hào)大于全部結(jié)點(diǎn)的num,此時(shí)p2指向尾結(jié)點(diǎn)*/if(p1是頭結(jié)點(diǎn),即空表) head=p0;p0-next=null;else p2-next=p0;p0-next=null;73struct student *insert(struct student *head,struct studen
38、t *stud) struct student *p0,*p1,*p2; p1=head; p0=stud; while(p1!=NULL&p0-nump1-num) p2=p1; p1=p1-next; if(p1=NULL) if(p1=head) head=p0;/*空表*/ else p2-next=p0;/*新結(jié)點(diǎn)尾鏈表的尾結(jié)點(diǎn)*/ p0-next=NULL; else if(p1=head) head=p0;/*插入第一各結(jié)點(diǎn)之前*/ else p2-next=p0; p0-next=p1; n+; return(head); 74輸出鏈表步驟順序訪問(wèn)每個(gè)結(jié)點(diǎn):定義指向構(gòu)造體類型結(jié)
39、點(diǎn)的指針變量p,并使它指向鏈表的頭結(jié)點(diǎn)當(dāng)p不為null輸出指針p所指向結(jié)點(diǎn)的數(shù)據(jù)成員使指針p指向后一個(gè)結(jié)點(diǎn)輸出鏈表75 void print(struct student *head) struct student *p; printf(nnumber scoren); p=head; while(p!=NULL) printf(%ld %5dn,p-num,p-score); p=p-next; 76步驟:定義指向構(gòu)造體類型結(jié)點(diǎn)的指針變量p,并使它指向鏈表的頭結(jié)點(diǎn)當(dāng)p不為null結(jié)點(diǎn)個(gè)數(shù)加1使指針p指向后一個(gè)結(jié)點(diǎn)統(tǒng)計(jì)鏈表結(jié)點(diǎn)數(shù)目77 void length(struct student *h
40、ead) struct student *p;int j=0; p=head; while(p!=NULL) j+; p=p-next; return(j); 78由結(jié)點(diǎn)的某各成員值的大小決議結(jié)點(diǎn)在鏈表中的位置。根本思想:不改動(dòng)鏈表中各個(gè)結(jié)點(diǎn)的鏈接關(guān)系,即當(dāng)結(jié)點(diǎn)的學(xué)號(hào)成員大于后繼結(jié)點(diǎn)的學(xué)號(hào)成員時(shí),交換兩個(gè)結(jié)點(diǎn)中除了指針成員外的一切其它成員的值。結(jié)點(diǎn)排序方法一79結(jié)點(diǎn)排序方法一步驟(冒泡法)定義構(gòu)造體及指向這種構(gòu)造體的兩個(gè)指針變量p1,p2p1=head當(dāng)p1不為空讓p2指向p1所指向結(jié)點(diǎn)的后繼結(jié)點(diǎn)p2=p1-next當(dāng)p2不為空時(shí)if(p1-nump2-num)/*比較p1,p2所指結(jié)點(diǎn)num
41、成員*/交換p1,p2所指結(jié)點(diǎn)的數(shù)據(jù)成員向后挪動(dòng)p2向后挪動(dòng)p180sort1(struct student *head)struct student *p1,*p2; long num; int s; p1=head; while(p1!=NULL) p2=p1-next; while(p2!=NULL) if(p1-nump2-num) num=p1-num; p1-num=p2-num; p2-num=num; s=p1-score;p1-score=p2-score;p2-score=s; p2=p2-next; p1=p1-next; 81在主函數(shù)中調(diào)用上述的用于鏈表建立、鏈表輸出、
42、刪除結(jié)點(diǎn)、結(jié)點(diǎn)排序和插入結(jié)點(diǎn)的各函數(shù),構(gòu)成一個(gè)完好的處置單向鏈表的程序?qū)嵗?main() struct student *head,*p0;long num; printf(“input records:n); head=creat(); /*前往頭指針*/ print(head); /*輸出鏈表一切結(jié)點(diǎn)*/ printf( input the deleted numbern); scanf(“%ld,&num);/*輸入要?jiǎng)h除的學(xué)號(hào)*/ while(num!=0) head=del(head,num);/*刪除后的鏈表頭指針*/ print(head); /*輸出鏈表一切結(jié)點(diǎn)*/ prin
43、tf(input the deleted numbern); scanf(%ld,&num); 鏈表操作的主調(diào)函數(shù)82sort1(head);/*對(duì)鏈表結(jié)點(diǎn)排序*/printf(“nsorted:n)print(head); /*打印鏈表全部結(jié)點(diǎn)*/printf(input the inserted recordn);p0=(struct student *)malloc(LEN);scanf(“%ld%d,&p0-num,&p0-score);/*輸入要插入的結(jié)點(diǎn)*/while(p0-num!=0) head=insert(head,p0);/*插入后的鏈表頭指針*/ print(head)
44、; /*打印鏈表全部結(jié)點(diǎn)*/ printf(input the inserted recordn); p0=(struct student *)malloc(LEN); scanf(%ld%d,&p0-num,&p0-score); 83運(yùn)轉(zhuǎn)結(jié)果如下:input records:9703 679701 879705 909704 630 0number score9703 679701 879705 909704 63input deleted number:9704delete:9704number score9703 679701 879705 90input deleted number
45、:084sorted:number score9701 879703 679705 90input inserted record:9702 60number score9701 879702 60 9703 679705 90input inserted record:9706 80number score9701 879702 60 9703 679705 909706 80input inserted record:0 085第七節(jié) 共用體共用體類型和變量的定義共用體類數(shù)據(jù)類型變量的援用共用體類數(shù)據(jù)類型變量的特點(diǎn)共用體類數(shù)據(jù)類型變量的運(yùn)用86方式一:先構(gòu)造共用體類的數(shù)據(jù)類型,后定義具有這
46、種構(gòu)造的變量。 union 共用體類型名 類型標(biāo)識(shí)符 成員名; : 類型標(biāo)識(shí)符 成員名; ; union 共用體類型名 變量名1,變量名2.;例如: union data int i; char c; float f; ; union data a,b,c,d,*p=&a;共用體類型和變量的定義87方式二:在構(gòu)造共用體類的數(shù)據(jù)類型時(shí)同時(shí)定義具有這種構(gòu)造的變量。 union 共用體數(shù)據(jù)類型名 類型標(biāo)識(shí)符 成員名; : 類型標(biāo)識(shí)符 成員名; 變量名;例如: union data int i; char c; float f; a,b,c,d,*p=&a;88方式三:利用無(wú)名共用體類數(shù)據(jù)類型直接定義
47、共用體類數(shù)據(jù)類型的變量 union 類型標(biāo)識(shí)符 成員名; : 類型標(biāo)識(shí)符 成員名; 變量名;例如: union int i; char c; float f; a,b,c,d,*p=&a;89與構(gòu)造體的差別:構(gòu)造體變量所占內(nèi)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度之和,每個(gè)成員分別占用本人的內(nèi)存共用體變量所占內(nèi)存長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度,每個(gè)成員在不同時(shí)間共用此單元90訪問(wèn)共用體變量的普通方式: 變量名.成員名例如,如下程序段: a.i=10; p-f=12.34; printf(“%f,a.f); printf(“%d,a.i);/*本句出錯(cuò)*/不能援用變量的名字,如一下語(yǔ)句是錯(cuò)誤的: printf(“%
48、d,a)共用體類型變量的援用91共用體類數(shù)據(jù)類型的變量中的一切成員變量共同運(yùn)用同一個(gè)存儲(chǔ)空間,因此在共用體類數(shù)據(jù)類型變量的有效作用范圍內(nèi),對(duì)共用體數(shù)據(jù)類型的變量或該變量的任何成員變量取地址得到的結(jié)果是一樣的。對(duì)共用體類數(shù)據(jù)類型的變量也可以在定義時(shí)初始化,但只能對(duì)其第一個(gè)成員初始化。共用體類型變量的特點(diǎn)92共用體類數(shù)據(jù)類型的變量不能作為函數(shù)形參,函數(shù)也不能前往共用體類數(shù)據(jù)類型的數(shù)據(jù),但可以運(yùn)用指向共用體類數(shù)據(jù)類型的數(shù)據(jù)的指針變量作為函數(shù)的形參,函數(shù)也能前往指向共用體類數(shù)據(jù)類型數(shù)據(jù)的指針。在構(gòu)造體類數(shù)據(jù)類型的構(gòu)造中可以包含共用體類數(shù)據(jù)類型的成員,在共用體類數(shù)據(jù)類型的構(gòu)造中也可以包含構(gòu)造體類數(shù)據(jù)類型
49、的成員;可以定義一個(gè)共用體數(shù)組,在共用體類數(shù)據(jù)類型的定義中也可以包含數(shù)組類型的成員。93設(shè)有假設(shè)干人員的數(shù)據(jù),包括教師和學(xué)生。學(xué)生的數(shù)據(jù)包括 :姓名、號(hào)碼、性別、職業(yè)、班級(jí)。教師的數(shù)據(jù)包括姓名、號(hào)碼、性別、職業(yè)、職務(wù)。要求把它們放在一張表中。假設(shè)job項(xiàng)是“S,那么第5項(xiàng)為class,假設(shè)job項(xiàng)是“T,那么第5項(xiàng)為position。struct long num; char name20; char sex; char job; /*職業(yè)*/ union int class; /*班級(jí)*/ char position20; /*單位名*/ category; person10;共用體類型變量的運(yùn)用假設(shè)job項(xiàng)輸入s學(xué)生,那么使程序接納一個(gè)整數(shù)給class班號(hào),假設(shè)job的值為t教師,那么接納一個(gè)字符串給position20。下面是完好的程序,輸入數(shù)據(jù)并輸出。94main() struct message personN; int i,n; char numstr20; char ch; for(i=0;iN;i+) printf(please enter da
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 燒傷整形診所治療師聘用合同
- 鹽城市房屋租賃合同:度假屋租賃
- 環(huán)保設(shè)施弱電施工合同
- 拓展訓(xùn)練基地短期合作協(xié)議
- 橋梁照明施工合同樣本
- 2024年尾礦庫(kù)建設(shè)土方調(diào)配合同
- 園林綠化項(xiàng)目經(jīng)理施工合同
- 養(yǎng)老公寓護(hù)工勞動(dòng)合同
- 2024年廣告發(fā)布合同標(biāo)的及服務(wù)內(nèi)容
- 大型數(shù)據(jù)中心電力供應(yīng)工程合同
- 車間生產(chǎn)計(jì)劃完成情況統(tǒng)計(jì)表
- 品管圈(QCC)降低ICU護(hù)士床頭交接班缺陷率課件
- 《左道:中國(guó)宗教文化中的神與魔》讀書筆記模板
- 2023年初級(jí)游泳救生員理論知識(shí)考試題庫(kù)(濃縮400題)
- 施工現(xiàn)場(chǎng)臨時(shí)用電安全技術(shù)規(guī)范
- 同仁堂藥品目錄
- 社會(huì)問(wèn)題概論
- 高中語(yǔ)文-如何讀懂古詩(shī)詞教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 虛假訴訟刑事控告書(參考范文)
- 部編版道德與法治四年級(jí)上冊(cè)第11課《變廢為寶有妙招》優(yōu)質(zhì)課件
- 2018年考研英語(yǔ)一真題和答案完整版
評(píng)論
0/150
提交評(píng)論