版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C語言程序設(shè)計(jì)語言程序設(shè)計(jì) Chap.8 Chap.8 結(jié)構(gòu)體、共同體結(jié)構(gòu)體、共同體 和枚舉類型和枚舉類型 桂林電子科技大學(xué)桂林電子科技大學(xué)Chap.8 Chap.8 結(jié)構(gòu)體共同體結(jié)構(gòu)體共同體 和和枚舉類型枚舉類型 一一 概述概述 由不同類型的數(shù)據(jù)項(xiàng)組成的復(fù)合類型,稱為結(jié)構(gòu)體類型由不同類型的數(shù)據(jù)項(xiàng)組成的復(fù)合類型,稱為結(jié)構(gòu)體類型 成員項(xiàng)成員項(xiàng)結(jié)構(gòu)體分量結(jié)構(gòu)體分量 struct struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 類型名類型名1 1 成員名表成員名表1;1; 類型名類型名2 2 成員名表成員名表2;2; 類型名類型名n n 成員名表成員名表n;n; 8.1 8.1 結(jié)構(gòu)體類型結(jié)構(gòu)體類型二二 結(jié)
2、構(gòu)體類型變量的定義結(jié)構(gòu)體類型變量的定義 1 1 先后定義先后定義 先定義類型,后定義變量先定義類型,后定義變量 Ex struct stu Ex struct stu long num; long num; char name20,sex; char name20,sex; int age; int age; float score; float score; char addr30; char addr30; 2 2 同時(shí)定義同時(shí)定義 Ex struct stu Ex struct stu long num; long num; char name20,sex; char name20,se
3、x; int age; int age; float score; float score; char addr30; char addr30; s1,s2; s1,s2;3 3 直接定義直接定義 缺省結(jié)構(gòu)體類型名缺省結(jié)構(gòu)體類型名 Ex struct Ex struct long num; long num; char name20,sex; char name20,sex; int age; int age; float score; float score; char addr30; char addr30; s1,s2; s1,s2; struct stu s1,s2; struct s
4、tu s1,s2;結(jié)構(gòu)體結(jié)構(gòu)體2 2三三 結(jié)構(gòu)體類型變量的初始化結(jié)構(gòu)體類型變量的初始化 struct stu s1=20191,Li Ping,M,18,86,struct stu s1=20191,Li Ping,M,18,86,桂林桂林;四四 結(jié)構(gòu)體類型變量的引用結(jié)構(gòu)體類型變量的引用 成員成員 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名. .成員名成員名五五 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 Ex struct stu s40;Ex struct stu s40; 結(jié)構(gòu)體數(shù)組:數(shù)組元素是結(jié)構(gòu)體變量結(jié)構(gòu)體數(shù)組:數(shù)組元素是結(jié)構(gòu)體變量 先后定義先后定義 同時(shí)定義同時(shí)定義 直接定義直接定義 初始化初始化 struct stu
5、s40=struct stu s40= 20191,Li Ping,M,18,86, 20191,Li Ping,M,18,86,桂林桂林, , 20192,Wang Yifei,F,19,95, 20192,Wang Yifei,F,19,95,柳州柳州 ; ; 對對s0s0、s1s1賦初值賦初值六六 結(jié)構(gòu)體指針結(jié)構(gòu)體指針 struct struct 結(jié)構(gòu)類型名結(jié)構(gòu)類型名 * *結(jié)構(gòu)體指針名結(jié)構(gòu)體指針名 指向運(yùn)算符和圓點(diǎn)運(yùn)算符指向運(yùn)算符和圓點(diǎn)運(yùn)算符 ( (* *p).p).成員名成員名 p-p-成員名成員名 p p是指針,不是結(jié)構(gòu)體變量,不能寫成:是指針,不是結(jié)構(gòu)體變量,不能寫成:p.p.成
6、員名成員名例題例題Ex802 struct person char name9; int age; ;Ex802 struct person char name9; int age; ; struct person class10= Join,17, struct person class10= Join,17, Paul,19, Paul,19, Mary,18, Mary,18, Adam,16 ; Adam,16 ;0Ex804 struct studEx804 struct stud char num6; char num6; int s4
7、; int s4; double ave; double ave; 6 68 822228 8+ +Ex803 struct ex int x; float y; char z; example;Ex803 struct ex int x; float y; char z; example; A) struct A) struct是結(jié)構(gòu)體類型的關(guān)鍵字是結(jié)構(gòu)體類型的關(guān)鍵字 B) exampleB) example是結(jié)構(gòu)體類型名是結(jié)構(gòu)體類型名 C) x,y,zC) x,y,z都是結(jié)構(gòu)體成員名都是結(jié)構(gòu)體成員名 D) struct exD) struct ex是結(jié)構(gòu)體類型是結(jié)構(gòu)體類型Ex801 #in
8、clude Ex801 #include struct abc struct abc int a,b,c; ; int a,b,c; ; main() main() struct abc s2=1,2,3,4,5,6; int t; struct abc s2=1,2,3,4,5,6; int t; t=s0.a+s1.b; t=s0.a+s1.b; printf(%dn,t); printf(%dn,t); s0 s1s0 s1a b c a b ca b c a b cEx805 #include Ex805 #include struct st struct st int x; int
9、int x; int * *y; y; * *p;p; int dt4=10,20,30,40; int dt4=10,20,30,40; struct st aa4= 50,&dt0,60,&dt1, 70,&dt2, struct st aa4= 50,&dt0,60,&dt1, 70,&dt2, 80,&dt3 ;80,&dt3 ; main() main() p=aa; printf(%dn,+(p-x); p=aa; printf(%dn,+(p-x); printf(%dn,(+p)-x); printf(%dn,(+
10、p)-x); printf(%dn,+( printf(%dn,+(* *p-y);p-y); dt0dt0dt1dt1dt2dt2dt3dt3100010001002100210041004100610061010202030304040p aa p aa 505010001000606010021002707010041004808010061006aa0.xaa0.x .y .yaa1.xaa1.x .y .yaa2.xaa2.x .y .yaa3.xaa3.x .y .yEx806 Ex806 以下程序用來輸出結(jié)構(gòu)以下程序用來輸出結(jié)構(gòu) 體變量體變量exex所占存儲(chǔ)單元所占存儲(chǔ)單元 的字
11、節(jié)數(shù)的字節(jié)數(shù) #include #include struct st struct st char name20; double score; char name20; double score; main() main() struct st ex; struct st ex; printf(ex size:%dn, ); printf(ex size:%dn, ); sizeof(ex)sizeof(ex)+(p-x)=51+(p-x)=51例題例題(+ p)-x=60(+ p)-x=60+(+(* *p-y)=21p-y)=218.2 8.2 自定義類型自定義類型Ex2 typedef
12、structEx2 typedef struct int n; int n; char ch8; char ch8; PER; PER; A) PER A) PER是結(jié)構(gòu)體變量名是結(jié)構(gòu)體變量名 B) PERB) PER是結(jié)構(gòu)體類型名是結(jié)構(gòu)體類型名 C) structC) struct是結(jié)構(gòu)體類型名是結(jié)構(gòu)體類型名 D) typedef structD) typedef struct是結(jié)構(gòu)體類型是結(jié)構(gòu)體類型 Ex3 Ex3 對結(jié)構(gòu)體變量定義不正確的是對結(jié)構(gòu)體變量定義不正確的是 A) typedef struct aa B) #define AA struct aaA) typedef struct
13、 aa B) #define AA struct aa int n; AA int n; int n; AA int n; float m; float m; float m; float m; AA; tdl; AA; tdl; AA tdl; AA tdl; C) struct D) struct C) struct D) struct int n; int n; int n; int n; float m; float m; float m; float m; aa; tdl; aa; tdl; struct aa tdl; struct aa tdl;typedef typedef 類
14、型名類型名1 1 類型名類型名2;2; 類型名類型名1 1是已有定義的類型標(biāo)識符,類型名是已有定義的類型標(biāo)識符,類型名2 2是一個(gè)用戶定義的新是一個(gè)用戶定義的新 類型標(biāo)識符類型標(biāo)識符Ex1 typedef int INTEGER;Ex1 typedef int INTEGER; 有了上面的定義以后,有了上面的定義以后, INTEGER m,m; INTEGER m,m; 等價(jià)于等價(jià)于 int m,m;int m,m;Ex807 #include Ex807 #include typedef struct typedef struct int a; char b; ST; int a; char
15、 b; ST; ST ST * *fun(ST x)fun(ST x) ST ST * *px;px; x.a=100; x.b=C; px=&x; x.a=100; x.b=C; px=&x; return px; return px; main() main() ST y, ST y,* *p;p; y.a=999; y.b=X; y.a=999; y.b=X; printf(y.a=%d y.b=%cn,y.a,y.b); printf(y.a=%d y.b=%cn,y.a,y.b); p=fun(y); p=fun(y); printf( printf(* *p).a=
16、%d (p).a=%d (* *p).b=%cn,(p).b=%cn,(* *p).a,p-b);p).a,p-b); Ex808 #include Ex808 #include #define N 5 #define N 5 typedef struct typedef struct char name20; char num10; USER; char name20; char num10; USER; getdata(USER getdata(USER * *sp)sp) int i; int i; printf(Enter name & phone number:n); pri
17、ntf(Enter name & phone number:n); for(i=0;iN;i+) gets(); gets(spi.num); for(i=0;iN;i+) gets(); gets(spi.num); / /* * 輸入時(shí),姓名與電話號碼各占一行輸入時(shí),姓名與電話號碼各占一行 * */ /例題例題例題例題outdata(USER outdata(USER * *sp)sp) int i; int i; printf(After sorted:n); printf(After sorted:n); for(i=0;iN;i+) for(i
18、=0;iN;i+) printf(%s,%sn,,spi.num); printf(%s,%sn,,spi.num); getsort(USER getsort(USER * *sp)sp) int i,j,k; USER temp; int i,j,k; USER temp; for(i=0;iN-1;i+) for(i=0;iN-1;i+) k=i; k=i; for(j=i+1;jN;j+) for(j=i+1;j0) k=j;if(strcmp(,)0) k=j; temp=spk; spk=spi; spi=temp;
19、temp=spk; spk=spi; spi=temp; main()main() USER spN,temp; USER spN,temp; getdata(sp); getsort(sp); outdata(sp); getdata(sp); getsort(sp); outdata(sp); / /* * 輸入輸入 排序排序 輸出輸出 * */ /8.3 8.3 鏈表鏈表指針域指針域 指向下一結(jié)點(diǎn)指向下一結(jié)點(diǎn)a.ch a.pa.ch a.p結(jié)點(diǎn)結(jié)點(diǎn)數(shù)據(jù)域數(shù)據(jù)域Ex809Ex809#include #include struct nodestruct node int data; int
20、data; struct node struct node * *next;next;typedef struct node NODETYPE;typedef struct node NODETYPE;main()main() a ab bc ch hp p1010202030300NODETYPE a,b,c,NODETYPE a,b,c,* *h,h,* *p;p;a.data=10; b.data=20; c.data=30;a.data=10; b.data=20; c.data=30;h=&a;h=&a;a.next=&b; b.next=&c; a.
21、next=&b; b.next=&c; c.next=0;c.next=0;while(p)while(p) printf(%4d,p-data); p=p-next; printf(%4d,p-data); p=p-next; printf(n);printf(n);p=h;p=h;輸出輸出: 10 20 30: 10 20 30struct linkstruct link char ch; char ch; struct link struct link * *p;p;a;a;建立鏈表建立鏈表Ex810 Ex810 建立帶有頭結(jié)點(diǎn)的單向鏈表建立帶有頭結(jié)點(diǎn)的單向鏈表 讀取數(shù)據(jù)
22、讀取數(shù)據(jù) 生成新結(jié)點(diǎn)生成新結(jié)點(diǎn) 存入數(shù)據(jù)存入數(shù)據(jù) 將新結(jié)點(diǎn)插入到鏈表將新結(jié)點(diǎn)插入到鏈表 SLIST SLIST * *creat_slist()creat_slist() int c; int c; SLIST SLIST * *h,h,* *s,s,* *p; p; scanf(%d,&c); / scanf(%d,&c); /* * 設(shè)設(shè)c=10 c=10 * */ / h=(SLIST h=(SLIST * *)malloc(sizeof(SLIST); /)malloc(sizeof(SLIST); /* * 生成頭結(jié)點(diǎn)生成頭結(jié)點(diǎn) * */ / p=h; / p=h;
23、/* * p p:遍歷指針:遍歷指針 * */ / while(c!=-1) / while(c!=-1) /* * -1 -1:讀入數(shù)據(jù)結(jié)束標(biāo)志:讀入數(shù)據(jù)結(jié)束標(biāo)志 * */ / s=(SLIST s=(SLIST * *)malloc(sizeof(SLIST); /)malloc(sizeof(SLIST); /* * 生成新結(jié)點(diǎn)生成新結(jié)點(diǎn) * */ / s-data=c; / s-data=c; /* * 存入數(shù)據(jù)存入數(shù)據(jù) * */ / p-next=s; / p-next=s; /* * 將新結(jié)點(diǎn)連到鏈表末尾將新結(jié)點(diǎn)連到鏈表末尾 * */ / p=s; p=s; scanf(%d,&a
24、mp;c); / scanf(%d,&c); /* * 設(shè)設(shè)c=20 c=20 * */ / p-next=0; / p-next=0; /* * 置鏈表結(jié)束標(biāo)志置鏈表結(jié)束標(biāo)志 * */ / return h; / return h; /* * 返回頭指針返回頭指針 * */ / h hp ps sp p1010s s2020p p輸出鏈表輸出鏈表print_slist(SLIST print_slist(SLIST * *h)h) SLIST SLIST * *p;p; p=h-next; p=h-next; if(p= =0) printf(Linklist is null!n);
25、 if(p= =0) printf(Linklist is null!n); else else printf(Head); printf(Head); do printf(-%d,p-data); do printf(-%d,p-data); p=p-next; p=p-next; while(p!=0); while(p!=0); printf(-Endn); printf(-Endn); h h101020203030 0p pp p插入結(jié)點(diǎn)插入結(jié)點(diǎn)insert_snode(SLIST insert_snode(SLIST * *h)h) int x,y; / int x,y; /* *
26、 在值為在值為x x的結(jié)點(diǎn)前,插入值為的結(jié)點(diǎn)前,插入值為y y的結(jié)點(diǎn)的結(jié)點(diǎn) * */ / SLIST SLIST * *s,s,* *p,p,* *q;q; printf(insert:x,y=); scanf(%d%d ,&x,&y); printf(insert:x,y=); scanf(%d%d ,&x,&y); s=(SLIST s=(SLIST * *)malloc(sizeof(SLIST); /)malloc(sizeof(SLIST); /* * 生成新結(jié)點(diǎn)生成新結(jié)點(diǎn) * */ / s-data=y; / s-data=y; /* * 新結(jié)點(diǎn)中存
27、入值新結(jié)點(diǎn)中存入值y y * */ / q=h; p=h-next; q=h; p=h-next; while( (p!=0) & (p-data!=x) ) while( (p!=0) & (p-data!=x) ) q=p; p=p-next; q=p; p=p-next; s-next=p; q-next=s; s-next=p; q-next=s; h h101020203030 0設(shè)設(shè)x x為為2020,y y為為1515:插在中間:插在中間s s1515q qp ph hq qp= =0 p= =0 :空表,不進(jìn)入循:空表,不進(jìn)入循環(huán)環(huán) s s15150q qp p
28、 插入結(jié)點(diǎn)插入結(jié)點(diǎn)insert_snode(SLIST insert_snode(SLIST * *h)h) int x,y; / int x,y; /* * 在值為在值為x x的結(jié)點(diǎn)前,插入值為的結(jié)點(diǎn)前,插入值為y y的結(jié)點(diǎn)的結(jié)點(diǎn) * */ / SLIST SLIST * *s,s,* *p,p,* *q;q; printf(insert:x,y=); scanf(%d%d ,&x,&y); printf(insert:x,y=); scanf(%d%d ,&x,&y); s=(SLIST s=(SLIST * *)malloc(sizeof(SLIST);
29、/)malloc(sizeof(SLIST); /* * 生成新結(jié)點(diǎn)生成新結(jié)點(diǎn) * */ / s-data=y; / s-data=y; /* * 新結(jié)點(diǎn)中存入值新結(jié)點(diǎn)中存入值y y * */ / q=h; p=h-next; q=h; p=h-next; while( (p!=0) & (p-data!=x) ) while( (p!=0) & (p-data!=x) ) q=p; p=p-next; q=p; p=p-next; s-next=p; q-next=s; s-next=p; q-next=s; h h101020203030 0q qs s1515設(shè)設(shè)x x為
30、為4040,y y為為1515: p=0 p=0 ,插在最后,插在最后0例題例題 Ex Ex 可以將可以將q q所指的結(jié)點(diǎn)從鏈表中刪除和釋放所指的結(jié)點(diǎn)從鏈表中刪除和釋放 A) free(q); p-next=q-next;A) free(q); p-next=q-next; B) ( B) (* *p).next=(p).next=(* *q).next; free(q);q).next; free(q); C) q=( C) q=(* *q).next; (q).next; (* *p).next=q; free(q);p).next=q; free(q); D) q=q-next; p-n
31、ext=q; p=p-next; free(p); D) q=q-next; p-next=q; p=p-next; free(p);p p 8 8 4 4 3 3h hq qdata nextdata nextA)A)p p 8 8 3 3h hq qdata nextdata nextB)B) 4 4q qh hp p 8 8 3 3data nextdata nexth hp p 8 8 3 3data nextdata nextq qC)C)q q 4 4h hp p 8 8 3 3data nextdata next 4 4h hp p 8 8data nextdata nextq
32、qD)D)q q 4 4h h 8 8 3 3data nextdata nextp p 4 4h h 8 8data nextdata nextp p q q8.4 8.4 共同體共同體0000 00100000 00100000 00000000 0000r.i0 r.kr.i0 r.kr.i1r.i1r.k=0000 0000 0000 0010=2r.k=0000 0000 0000 0010=2共同體的類型說明和變量的定義方式和結(jié)構(gòu)體完全相同,不同的是:結(jié)共同體的類型說明和變量的定義方式和結(jié)構(gòu)體完全相同,不同的是:結(jié)構(gòu)體變量中的成員各自占有自己的存儲(chǔ)空間,而共同體變量中的所有成構(gòu)體變
33、量中的成員各自占有自己的存儲(chǔ)空間,而共同體變量中的所有成員占有同一的存儲(chǔ)空間員占有同一的存儲(chǔ)空間 在共同體類型的說明中,與結(jié)構(gòu)體類型不同的是用關(guān)鍵字在共同體類型的說明中,與結(jié)構(gòu)體類型不同的是用關(guān)鍵字unionunion代替代替 structstructE811 main()E811 main() union char i2; int k; r; union char i2; int k; r; r.i0=2; r.i1=0; r.i0=2; r.i1=0; printf(%dn,r.k); printf(%dn,r.k); r.i1=5;r.i1=5;r.k=0000 0101 0000 00
34、10=1282r.k=0000 0101 0000 0010=12820000 01010000 0101 共同體類型數(shù)據(jù)的特點(diǎn)共同體類型數(shù)據(jù)的特點(diǎn) 1 1 同一內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬時(shí)只同一內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬時(shí)只 能存放其中一種,只有一個(gè)成員起作用。能存放其中一種,只有一個(gè)成員起作用。 2 2 共同體變量中起作用的成員是最后一次存放的成員,在存入一個(gè)共同體變量中起作用的成員是最后一次存放的成員,在存入一個(gè) 新成員后,原有的成員就失去作用。新成員后,原有的成員就失去作用。 3 3 共同體變量的地址和它的各成員的地址都是同一地址。共同體變量的地址和它的各成員的地址都是同一地址
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品生產(chǎn)檔案制度
- 安全生產(chǎn)倒查問責(zé)制度
- 火龍果生產(chǎn)管理制度
- 燈廠安全生產(chǎn)規(guī)章制度
- 鉆床安全生產(chǎn)管理制度
- 生產(chǎn)作業(yè)定置管理制度
- 規(guī)范生產(chǎn)崗位管理制度
- 安全生產(chǎn)報(bào)表管理制度
- 汽車車間安全生產(chǎn)制度
- 公寓安全生產(chǎn)管理制度
- 《合理利用網(wǎng)絡(luò)》(優(yōu)質(zhì)課件)
- 中深度鎮(zhèn)靜紅外線全身熱療方法課件
- 第四單元地理信息技術(shù)的應(yīng)用課件 【高效課堂+精研精講】高中地理魯教版(2019)必修第一冊
- 魯科版高中化學(xué)必修一教案全冊
- 管理養(yǎng)老機(jī)構(gòu) 養(yǎng)老機(jī)構(gòu)的服務(wù)提供與管理
- 提高隧道初支平整度合格率
- 2022年環(huán)保標(biāo)記試題庫(含答案)
- 2023年版測量結(jié)果的計(jì)量溯源性要求
- 建筑能耗與碳排放研究報(bào)告
- GB 29415-2013耐火電纜槽盒
- 中國古代經(jīng)濟(jì)試題
評論
0/150
提交評論