版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十一章結(jié)構(gòu)體與共用體鏈表第一頁(yè),共三十八頁(yè),編輯于2023年,星期五例題1:某學(xué)生,姓名是Li,學(xué)號(hào)是9800,化學(xué)成績(jī)是85。請(qǐng)編寫(xiě)程序輸出這些數(shù)據(jù)。見(jiàn)程序:
main(){charname[4]="Li";intnum=9800;intscore=85;printf("%s,%d,%c,%f",name,num,sex,score);}如果有100個(gè)學(xué)生,則更麻煩.TC允許我們定義自己的數(shù)據(jù)類型,以解決特定的實(shí)際問(wèn)題。為了很好地解決例題1,我們可以定義一種叫structstudent的數(shù)據(jù)類型。第二頁(yè),共三十八頁(yè),編輯于2023年,星期五結(jié)構(gòu)體類型也是屬于一種構(gòu)造類型數(shù)據(jù),它將不同類型的數(shù)據(jù)項(xiàng)組織成一個(gè)組合項(xiàng),這些組合項(xiàng)中的數(shù)據(jù)項(xiàng)是互相聯(lián)系的。定義一個(gè)結(jié)構(gòu)體類型的一般形式:
struct結(jié)構(gòu)體名{成員表列};例如:對(duì)于一名學(xué)生,有如下不同類型的屬性:學(xué)號(hào)、姓名、年齡、性別、成績(jī)、地址等。要表示一個(gè)學(xué)生的六個(gè)方面不同類型的有關(guān)數(shù)據(jù),就可以定義一個(gè)結(jié)構(gòu)體類型?!?1.1結(jié)構(gòu)體類型概述第三頁(yè),共三十八頁(yè),編輯于2023年,星期五
structstudent{intnum;charname[10];charsex;intage;floatscore;charaddr[30];};其中:struct是關(guān)鍵字,表示結(jié)構(gòu)體類型。student是結(jié)構(gòu)體類型名,
structstudent和標(biāo)準(zhǔn)類型名(int、float)一樣可以用作定義變量的類型?;ɡㄌ?hào)內(nèi)是結(jié)構(gòu)體中的各個(gè)成員,每個(gè)成員都應(yīng)進(jìn)行類型說(shuō)明?!?1.1結(jié)構(gòu)體類型概述結(jié)構(gòu)體名相當(dāng)float,int分號(hào)不能少成員表列第四頁(yè),共三十八頁(yè),編輯于2023年,星期五一、先定義結(jié)構(gòu)體類型,再定義變量名例如:structstudent{intnum;charname[10];charsex;intage;floatscore;charaddr[30];};
structstudentstudent1,student2;上面的student1和student2是structstudent類型的變量,它們具有structstudent類型的結(jié)構(gòu)。定義結(jié)構(gòu)體變量后,系統(tǒng)為變量分配內(nèi)存單元??捎胹izeof(student1)來(lái)計(jì)student1和student2各占49個(gè)字節(jié)?!?1.2定義結(jié)構(gòu)體類型變量的方法第五頁(yè),共三十八頁(yè),編輯于2023年,星期五二、在定義結(jié)構(gòu)體類型的同時(shí)定義變量例如:structstudent{intnum;charname[10];charsex;intage;floatscore;charaddr[30];}student1,student2;§11.2定義結(jié)構(gòu)體類型變量的方法第六頁(yè),共三十八頁(yè),編輯于2023年,星期五三、直接定義結(jié)構(gòu)體類型變量(不寫(xiě)類型名)
例如:struct{intnum;charname[10];charsex;intage;floatscore;charaddr[30];}student1,student2;§11.2定義結(jié)構(gòu)體類型變量的方法第七頁(yè),共三十八頁(yè),編輯于2023年,星期五說(shuō)明:1.定義類型與定義變量是不同的,在編譯時(shí)對(duì)類型不分配空間,只對(duì)變量分配存儲(chǔ)空間。2.只能對(duì)變量賦值、存取或運(yùn)算,而對(duì)結(jié)構(gòu)體類型不可以。3.對(duì)結(jié)構(gòu)體中的成員可以單獨(dú)使用,它的作用和地位相當(dāng)于普通變量。4.可以用sizeof運(yùn)算符測(cè)一個(gè)類型數(shù)據(jù)的長(zhǎng)度。n=sizeof(structstudent)或n=sizeof(student1)n=sizeof(int)n=sizeof(float)
§11.2定義結(jié)構(gòu)體類型變量的方法第八頁(yè),共三十八頁(yè),編輯于2023年,星期五5.成員也可以是結(jié)構(gòu)體變量。structstudent{intnum;charname[20];charsex;intage;
structdatebirthday;charaddr[30];}student1,student2;
structdate{intmonth;intday;intyear;};numnamesexagebirthdayaddrmonthdayyear第九頁(yè),共三十八頁(yè),編輯于2023年,星期五一個(gè)結(jié)構(gòu)體類型的變量不能作為一個(gè)整體進(jìn)行輸入和輸出,只能對(duì)結(jié)構(gòu)體變量中的各個(gè)成員進(jìn)行輸入、輸出和運(yùn)算。scanf(“%d,%s,%c,%d,%f,%s”,&student1);printf(“%d,%s,%c,%d,%f,%s”,student1);§11.3結(jié)構(gòu)體類型變量的引用引用方式:結(jié)構(gòu)體變量名.成員名例如:scanf(“%d”,&student1.num);student2.num=student1.num;printf(“%d,%d”,student1.num,student2.num);“.”是成員運(yùn)算符,表示在student1結(jié)構(gòu)體變量中找出成員num的值。其優(yōu)先級(jí)最高,結(jié)合性為自左向右。如student1.num+100;第十頁(yè),共三十八頁(yè),編輯于2023年,星期五若結(jié)構(gòu)體類型嵌套一個(gè)結(jié)構(gòu)體類型,則采用逐級(jí)訪問(wèn)的方法,只能對(duì)最低級(jí)的成員進(jìn)行訪問(wèn)。student1.birthday.year訪問(wèn)結(jié)構(gòu)體變量student1的成員出生年份。而不能用student1.birthday訪問(wèn)birthday。結(jié)構(gòu)體變量的成員可以和普通變量一樣進(jìn)行各種運(yùn)算student2.score=student1.score;student1.age++;++student1.age;第十一頁(yè),共三十八頁(yè),編輯于2023年,星期五例如:
structstudent{longintnum;charname[20];
charsex;charaddr[20];}a={89031,"LiLin",'M',"123BeijingRoad"};Printf(“%ld,%s,%c,%s\n”,a.num,,a.sex,a.addr);§11.4結(jié)構(gòu)體類型變量的初始化第十二頁(yè),共三十八頁(yè),編輯于2023年,星期五結(jié)構(gòu)體數(shù)組中的每個(gè)元素都是一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個(gè)成員項(xiàng)。例如:要表示3名學(xué)生的學(xué)號(hào)、姓名和成績(jī)。
structstudent{intnum;charname[20];floatscore;};
structstudentstu[3]={{1000,“l(fā)iming”,70},{1001,“wangfan”,80},{1002,“zhangyan”,65.5}};§11.5結(jié)構(gòu)體數(shù)組第十三頁(yè),共三十八頁(yè),編輯于2023年,星期五程序舉例:有四個(gè)學(xué)生,每個(gè)學(xué)生包括學(xué)號(hào)、姓名、成績(jī),要求找出成績(jī)最高者的姓名和成績(jī)。S11_ex1.cmain(){structstudent{intnum;charname[20];intscore;};structstudentstu[4];inti,k=0,max;printf("請(qǐng)按行輸入學(xué)生的記錄:\n");
§11.5結(jié)構(gòu)體數(shù)組第十四頁(yè),共三十八頁(yè),編輯于2023年,星期五for(i=0;i<4;i++)scanf("%d%s%d”,&stu[i].num,stu[i].name,&stu[i].score);for(max=stu[0].score,i=1;i<4;i++)if(stu[i].score>max){max=stu[i].score;k=i;}printf("\n最高成績(jī)?yōu)?\n");printf(”No.:%d\nname:%s\nscore:%d\n”,stu[k].num,stu[k].name,stu[k].score);}§11.5結(jié)構(gòu)體數(shù)組第十五頁(yè),共三十八頁(yè),編輯于2023年,星期五11.6.1指向結(jié)構(gòu)體變量的指針一個(gè)結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存空間的起始地址,可以設(shè)一個(gè)指針變量指向一個(gè)結(jié)構(gòu)體變量。例如:structstudent{intnum;charname[20];intscore;}stu;structstudent*p=&stu;§11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針第十六頁(yè),共三十八頁(yè),編輯于2023年,星期五
如果要表示stu變量中的num成員項(xiàng)可寫(xiě)成下面三種形式:
1.stu.num2.(*p).num3.p->num§11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針第十七頁(yè),共三十八頁(yè),編輯于2023年,星期五
10.6.2指向結(jié)構(gòu)體數(shù)組的指針對(duì)結(jié)構(gòu)體數(shù)組也可以用指針變量來(lái)指向。例如:已知三名學(xué)生的有關(guān)數(shù)據(jù),現(xiàn)全部輸出。s11_4.cstructstudent{intnum;charname[10];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<=stu+2;p++)printf("%5d%-10s%2c%4d\n",p->num,p->name,p->sex,p->age);}
第十八頁(yè),共三十八頁(yè),編輯于2023年,星期五§10.3共用體unionstudent{intnum;floatscore;};unionstudentb;b.num=1;b.score=2;
sizeof(b)為4structstudent{intnum;floatscore;};structstudenta;a.num=1;a.score=2;sizeof(a)為6abnumscorenumscore┅┅┅┅第十九頁(yè),共三十八頁(yè),編輯于2023年,星期五11.8.1共用體類型的定義和變量的定義方式使幾個(gè)不同的變量共占同一段內(nèi)存單元的結(jié)構(gòu),稱為“共用體”類型的結(jié)構(gòu)。它也是一種構(gòu)造類型的數(shù)據(jù)。共用體類型的定義形式:
union共用體名
{成員表列;};例如:uniondata{inti;charch;floatf;};uniondataa,b,c;§11.8共用體定義形式也可以:uniondata{inti;charch;floatf;}a,b,c;第二十頁(yè),共三十八頁(yè),編輯于2023年,星期五11.8.2共用體變量的引用方式不能直接引用共用體變量本身scanf(“%d”,&a);printf(“%d”,a);而應(yīng)引用共用體變量的成員。例如:a.ia.cha.f
11.8.3共用體類型數(shù)據(jù)的特點(diǎn)1.
共用體與結(jié)構(gòu)體的不同:結(jié)構(gòu)體變量所占內(nèi)存長(zhǎng)度為各成員所占內(nèi)存長(zhǎng)度之和;而共用體變量所占內(nèi)存長(zhǎng)度為最長(zhǎng)的成員的長(zhǎng)度,所有的成員共用同一段內(nèi)存,同一時(shí)刻只有一個(gè)成員起作用?!?1.8共用體第二十一頁(yè),共三十八頁(yè),編輯于2023年,星期五2.共用體變量的地址和它的各成員項(xiàng)的地址是同一地址。如:&a、&a.i、&a.ch、&a.f都是同一地址值。3.共用體變量不能賦初值。4.共用體和結(jié)構(gòu)體可以互相成為其中的成員;5.共用體變量起作用的成員是最后一次存放值的成員。例如:a.i=10;a.ch=‘a(chǎn)’;printf(“%d”,a.i);a.f=1.5;printf(“%f”,a.f);則當(dāng)前共用體變量中,只有a.f是有效的?!?1.8共用體第二十二頁(yè),共三十八頁(yè),編輯于2023年,星期五#include<stdio.h>unionun{inti;charc[2];}main(){unionunx;x.c[0]=10;x.c[1]=1;printf("\n%d",x.i);}266第二十三頁(yè),共三十八頁(yè),編輯于2023年,星期五思考題1:求下面程序的輸出結(jié)果。
main(){uniontime {longi;intk[5];charc;};structdate{intcat;uniontimecow;doubledog;}dt;uniontimemax;
printf("%d\n",sizeof(dt)+sizeof(max));}說(shuō)明:sizeof()是求類型長(zhǎng)度的運(yùn)算符,即在內(nèi)存中所占的字節(jié)數(shù)。20+10=30第二十四頁(yè),共三十八頁(yè),編輯于2023年,星期五思考題2:求下面程序的輸出結(jié)果。structks{inta;int*b;}s[4],*p;main(){intn=1,i;printf("\n");for(i=0;i<4;i++){s[i].a=n;s[i].b=&s[i].a;n=n+2;}p=&s[0];p++;printf("%d,%d\n",(++p)->a,(p++)->a);}s[0].a=1s[1].a=3s[2].a=5s[3].a=77,3右結(jié)合第二十五頁(yè),共三十八頁(yè),編輯于2023年,星期五先觀察鏈表示意圖,后理解鏈表概念。某3位同學(xué)的物理成績(jī)分別為96,89,93。分別用數(shù)組和鏈表存儲(chǔ)這些數(shù)據(jù)的示意圖如下:613609605601938996p指針89空93指針963個(gè)節(jié)點(diǎn)的鏈表:3個(gè)元素的數(shù)組:floata[3];a11.9簡(jiǎn)單鏈表第二十六頁(yè),共三十八頁(yè),編輯于2023年,星期五§11.9.1鏈表的概念鏈表是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),可以用來(lái)表示順序訪問(wèn)的線性群體。鏈表是由系列結(jié)點(diǎn)組成的,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。每一個(gè)結(jié)點(diǎn)包括數(shù)據(jù)域和指向鏈表中下一個(gè)結(jié)點(diǎn)的指針(即下一個(gè)結(jié)點(diǎn)的地址)。如果鏈表每個(gè)結(jié)點(diǎn)中只有一個(gè)指向后繼結(jié)點(diǎn)的指針,則該鏈表稱為單鏈表。鏈表不要求邏輯上相鄰的元素在物理位置上也相鄰,在內(nèi)存允許的范圍內(nèi),占用空間大小不受限制,摒棄了數(shù)組的弱點(diǎn)。第二十七頁(yè),共三十八頁(yè),編輯于2023年,星期五§11.9.2數(shù)組與鏈表的比較數(shù)組:僅能實(shí)現(xiàn)靜態(tài)存儲(chǔ)。鏈表:可以實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)。鏈表的使用步驟:建立鏈表(使用malloc函數(shù))訪問(wèn)鏈表(使用*p表達(dá)式)釋放鏈表(使用free函數(shù))p指針89空93指針96第二十八頁(yè),共三十八頁(yè),編輯于2023年,星期五1.鏈表結(jié)構(gòu)(1)頭指針變量head──指向鏈表的首結(jié)點(diǎn)。(2)每個(gè)結(jié)點(diǎn)由2個(gè)域組成:1)數(shù)據(jù)域──存儲(chǔ)結(jié)點(diǎn)本身的信息。2)指針域──指向后繼結(jié)點(diǎn)的指針。(3)尾結(jié)點(diǎn)的指針域置為“NULL(空)”,作為鏈表結(jié)束的標(biāo)志QianSunLiZhouWuWangHead^第二十九頁(yè),共三十八頁(yè),編輯于2023年,星期五鏈表結(jié)構(gòu)的定義structstudent{charname[10];structstudent*next;};next為structstudent類型指針變量,指向下一個(gè)結(jié)點(diǎn)。結(jié)點(diǎn)的變量或指針變量的定義:
structstudentnode,*head;node可以存放一個(gè)學(xué)生結(jié)點(diǎn)指針head可以存放學(xué)生結(jié)點(diǎn)的地址。第三十頁(yè),共三十八頁(yè),編輯于2023年,星期五相關(guān)庫(kù)函數(shù)1.void*malloc(unsignedintsize);
用途:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)size長(zhǎng)度的連續(xù)存儲(chǔ)空間。返回值:返回一個(gè)指向分配域地址的指針(類型為void);若未成功,則返回空指針(NULL)例如:int*p;p=(int*)malloc(8);p指示系統(tǒng)分配的4個(gè)整型存儲(chǔ)單元的起始地址也可看成包含4個(gè)數(shù)組元素的p數(shù)組:p[0],p[1],p[2],p[3]第三十一頁(yè),共三十八頁(yè),編輯于2023年,星期五2.voidfree(void*p);用途:釋放由指針變量p所指示的內(nèi)存區(qū)域。 例如:free(p);通過(guò)函數(shù)free將已分配的內(nèi)存區(qū)域交還系統(tǒng),使系統(tǒng)可以重新對(duì)其進(jìn)行分配。第三十二頁(yè),共三十八頁(yè),編輯于2023年,星期五§11.9.3建立鏈表尾插法建立單鏈表特點(diǎn):頭指針固定不變,新產(chǎn)生的結(jié)點(diǎn)總是鏈接到鏈表的尾部。操作步驟:(1)設(shè)head為鏈表頭,last為鏈表尾結(jié)點(diǎn),
head=last=NULL;(2)生成新結(jié)點(diǎn),由p指針指示,并將新結(jié)點(diǎn)的地址域清空: p->next=NULL;(3)如果head為NULL,則head=p;
否則last->next=p; (4)last=p;(5)重復(fù)(2)~(4),繼續(xù)建立新結(jié)點(diǎn)。第三十三頁(yè),共三十八頁(yè),編輯于2023年,星期五#include"stdio.h"structs{inta;structs*q;};#defineLENsizeof(structs)main(){structs*head,*p1,*p2;intm,i,n;for(i=1;i<=3;i++){p2=(structs*)malloc(LEN);scanf("%d",&m);p2->a=m;if(i==1)head=p1=p2;else{p1->q=p2;p1=p2;}if(i==3)p2->q=NULL;}for(p1=head;p1!=NULL;){printf("\n%d",p1->a);p1=p1->q;}while(head){p1=head->q;head->q=NULL;free(head);head=p1;}}例三位同學(xué)的化學(xué)成績(jī)分別是90,89,96。請(qǐng)分別用數(shù)組和鏈表存儲(chǔ)這些數(shù)據(jù)。main(){inta[3],i;for(i=0;i<3;i++)scanf("%d",&a[i]);for(i=0;i<3;i++)
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度LED顯示屏產(chǎn)品安全認(rèn)證合同3篇
- 2025版環(huán)保設(shè)施運(yùn)營(yíng)維護(hù)管理承包合同范本4篇
- 2025年度木材市場(chǎng)風(fēng)險(xiǎn)管理與價(jià)格波動(dòng)合同4篇
- 二零二五年度養(yǎng)老產(chǎn)業(yè)項(xiàng)目合伙人分紅及服務(wù)質(zhì)量保障合同
- 2025年度企業(yè)銷(xiāo)售團(tuán)隊(duì)績(jī)效目標(biāo)協(xié)議書(shū)
- 二零二五年度順豐快遞員勞動(dòng)合同爭(zhēng)議解決機(jī)制
- 2025年度輔導(dǎo)員職業(yè)發(fā)展規(guī)劃與激勵(lì)機(jī)制聘用協(xié)議
- 2025年度綠色交通設(shè)施建設(shè)銀行抵押貸款合同
- 二零二五年度美容院品牌形象入股合同
- 二零二五年度汽車(chē)貸款續(xù)貸服務(wù)合同
- 2024生態(tài)環(huán)境相關(guān)法律法規(guī)考試試題
- 有砟軌道施工工藝課件
- 兩辦意見(jiàn)八硬措施煤礦安全生產(chǎn)條例宣貫學(xué)習(xí)課件
- 40篇短文搞定高中英語(yǔ)3500單詞
- 人教版高中數(shù)學(xué)必修二《第九章 統(tǒng)計(jì)》同步練習(xí)及答案解析
- 兒科護(hù)理安全警示教育課件
- 三年級(jí)下冊(cè)口算天天100題
- 國(guó)家中英文名稱及代碼縮寫(xiě)(三位)
- 人員密集場(chǎng)所消防安全培訓(xùn)
- 液晶高壓芯片去保護(hù)方法
- 拜太歲科儀文檔
評(píng)論
0/150
提交評(píng)論