版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
C語言教程第八章結(jié)構(gòu)體第8章結(jié)構(gòu)體
結(jié)構(gòu)體
共用體2024/4/232思考一個問題在程序里表示一個人的信息(姓名、年齡、性別、……),怎么表示?表示多個人呢?如何用計算機程序?qū)崿F(xiàn)下述表格的管理?表8-1某學校學生成績管理表學號姓名性別入學時間計算機原理英語數(shù)學音樂1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女1999789587905……6……數(shù)組的解決方法int studentId[30];/*最多可以管理30個學生,每個學生的學號用數(shù)組的下標表示*/char studentName[30][10]; char studentSex[30][2]; inttimeOfEnter[30];/*入學時間用int表示*/intscoreComputer[30];/*計算機原理課的成績*/intscoreEnglish[30];/*英語課的成績*/ intscoreMath[30]; /*數(shù)學課的成績*/intscoreMusic[30]; /*音樂課的成績*/數(shù)組的解決方法intstudentId[30]={1,2,3,4,5,6};char studentName[30][10]={{"令狐沖"},{"林平之"},{"岳靈珊"},{"任瑩瑩"}};char studentSex[30][2]={{"男"},{"男"},{"女"},{"女"}};int timeOfEnter[30]={1999,1999,1999,1999};int scoreComputer[30]={90,78,89,78};int scoreEnglish[30]={83,92,72,95};int scoreMath[30]={72,88,98,87};int scoreMusic[30]={82,78,66,90};數(shù)組的解決方法數(shù)據(jù)的內(nèi)存管理方式90788978……83927295……72889887……82786690……1234……令狐沖林平之岳靈珊任瑩瑩……男男女女……1999199919991999……數(shù)組的解決方法分配內(nèi)存不集中,尋址效率不高對數(shù)組進行賦初值時,容易發(fā)生錯位結(jié)構(gòu)顯得比較零散,不容易管理希望的內(nèi)存分配圖
1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女199978958790結(jié)構(gòu)體的解決方法structSTUDENT
{
intstudentID;/*每個學生的序號*/ charstudentName[10];/*每個學生的姓名*/ charstudentSex[4];/*每個學生的性別*/ int timeOfEnter;/*每個學生的入學時間*/ int scoreComputer;/*每個學生的計算機原理成績*/ int scoreEnglish;/*每個學生的英語成績*/ int scoreMath; /*每個學生的數(shù)學成績*/ int scoreMusic;/*每個學生的音樂成績*/
};structSTUDENT是一個類型structSTUDENTstudents[4];students[0].studentName
students[0].Sex它們都是變量,一般稱為結(jié)構(gòu)的成員變量§8.1結(jié)構(gòu)體的定義結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型變量的引用結(jié)構(gòu)體變量的初始化structstudent{intnum;charname[20];charsex;intage;charaddr[30];};是數(shù)據(jù)類型,不是變量名對各成員都要進行類型說明;成員名定名規(guī)則與變量名同。一、結(jié)構(gòu)體類型的定義
一般形式為:struct結(jié)構(gòu)體名{
成員表列
};方法一:先定義結(jié)構(gòu)體類型再定義變量名structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstudent1,student2;定義studet1和sudent2為structstudent類型變量結(jié)構(gòu)體類型變量的定義
有時,可用符號常量代表一個結(jié)構(gòu)體類型,如:#defineSTUDENTstructstudentSTUDENT{intnum;charname[20];charsex;intage;charaddr[30];};這樣,可直接用STUDENT定義變量,如:STUDENTstudent1,student2;此時,不必再寫關鍵字struct方法二:在定義類型的同時定義變量structstudent{intnum;charname[20];charsex;intage;charaddr[30];}student1,student2;一般形式是:struct結(jié)構(gòu)體名{成員列表}變量名列表;方法三:直接定義結(jié)構(gòu)類型變量。其一般形式是:struct{
成員表列}變量名表列;此時,不出現(xiàn)結(jié)構(gòu)體名typedef的用法
功能:定義新類型,即為C語言中已有的數(shù)據(jù)類型名定義一個新名字。定義格式:typedef標識符1標識符2structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};typedefstructstudentSTUD;STUDstudent1,student2;用typedef為已存在的類型定義新名字用STUD代替structstudent類型;幾點說明:1.類型與變量是不同概念,不要混淆;2.結(jié)構(gòu)體中的成員,可以單獨使用,其作用與地位相當于普通變量;3.成員名可以與程序中的變量名相同,二者不代表同一對象。structdate{intmonth;intday;intyear;};Structstudent{intnum;charname[20];intage;structdatebirthday;}student1,student2;4.成員也可以是一個結(jié)構(gòu)體變量;例如:規(guī)則:1.不能將一個結(jié)構(gòu)體變量作為一個整體進行賦值和輸出;只能對其各個成員分別輸出printf(“………..”,student1);printf(“%d”,student1.num);錯!正確!
引用形式為:結(jié)構(gòu)體變量名.成員名二、結(jié)構(gòu)體類型變量的引用3.對成員變量可以象普通變量一樣進行各種運算,如:
sumage=student1.age+student2.age;4.可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址,如
scanf(“%d”,&student1.num);printf(“%x”,&student1);scanf(“%d,%s,%c,%d,%s”,&student1);錯!輸入student1.num的值輸出student1的首地址2.若成員本身又屬一個結(jié)構(gòu)體類型,只能對最低級的成員進行賦值或存取以及運算。如:
(一)對外部存儲類型的結(jié)構(gòu)體變量初始化:
structstudent{longintnum;charname[20];charsex;charaddr[20];}a={9801,”Wanghong”,’W’,”2LinggongRoad”};main(){printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,,a.sex,a.addr);}運行結(jié)果為:No.:9801name:Wanghongsex:Waddress:2LinggongRoad三、結(jié)構(gòu)體變量的初始化main(){staticstructstudent{longintnum;charname[20];charsex;charaddr[20];}a={9801,”Wanghong”,’W’,”2LinggongRoad”};printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,,a.sex,a.addr);}(二)對靜態(tài)存儲類型的結(jié)構(gòu)體變量初始化(一)結(jié)構(gòu)體數(shù)組的定義
structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudntstu[3];也可直接定義,如structstudent{intnum;…}stu[3];或struct{intnum;…}stu[3];§8.2結(jié)構(gòu)體數(shù)組(每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù))structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu[3]={{111,”Li”,’M’,18,”Dalian”},{…},{…}};結(jié)構(gòu)體數(shù)組初始化的一般形式是在定義數(shù)組后面加上:={初值表列};也可采用:structstudent{intnum;…};structstudentstu[]={{…},{…},{…}};(二)結(jié)構(gòu)體數(shù)組的初始化(只能對全局的或靜態(tài)存儲類別的數(shù)組初始化)structperson{charname[20];intcount;}leader[3]={{“Li”,0},{”zhang”,0},{”Liu”,0}};main(){inti,j;charleader_name[20];for(i=1;i<=10;i++){scanf(“%s”,leader_name);for(j=0;j<3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i<3;i++)printf(“%5s:%d\n”,leader[i].name,leader[i].count);}例題:設有三個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結(jié)果。例如:
main(){structstudent{longintnum;charname[20];charsex;};structstudentstu_1;structstudent*p;p=&stu_1;Stu_1.num=9901;strcpy(stu_1.name,“LiMin”);stu_1.sex=‘W’;printf(“No.:%ld\nname%s\nsex:%c\n”,stu_1.num,stu_1.name,stu_1.sex);printf(“\nNo.:%ld\nname%s\nsex:%c\n”,(*p).num,(*p).name,(*p).sex);}結(jié)構(gòu)體變量的指針:是該結(jié)構(gòu)體變量所占居的內(nèi)存段的起始地址。§8.3
指向結(jié)構(gòu)體類型數(shù)據(jù)的指針引用結(jié)構(gòu)體成員的三種形式:結(jié)構(gòu)體變量名.成員名(*p).成員名p->成員名指向運算符。其優(yōu)先級高于自增、自減運算符試分析以下運算:成員運算符得到p指向的結(jié)構(gòu)體變量中的成員n的值使其先加1++(p->n)得到p指向的結(jié)構(gòu)體變量中的成員n的值,用完后使它加1;(p->n)++得到p指向的結(jié)構(gòu)體變量中的成員n的值p->nfor(pt=stu;pt<stu+30;pt++){ sum[0]=sum[0]+pt->scoreComputer; sum[1]=sum[1]+pt->scoreEnglish; sum[2]=sum[2]+pt->scoreMath; sum[3]=sum[3]+pt->scoreMusic; }for(i=0;i<4;i++){average[i]=sum[i]/4; printf("%20s:%4.2f\n",name[i],*(average+i)); }例8.2:利用指向結(jié)構(gòu)體數(shù)組的指針計算學生各科的平均成績(教材310頁)學號姓名性別入學時間計算機原理年月日英語數(shù)學音樂例8.2main(){ structSTUDENT*pt; floatsum[4]={0.0},average[4]={0.0}; int i; char*name[]={"scoreofComputer","scoreofEnglish", "scoreofMath","scoreofMusic"}; pt=stu;/*pt指向結(jié)構(gòu)體數(shù)組的第一個元素*/ for(pt=stu;pt<stu+30;pt++) { sum[0]=sum[0]+pt->scoreComputer; sum[1]=sum[1]+pt->scoreEnglish; sum[2]=sum[2]+pt->scoreMath; sum[3]=sum[3]+pt->scoreMusic; } for(i=0;i<4;i++) { average[i]=sum[i]/4; printf("%20s:%4.2f\n",name[i],*(average+i)); }}1.向函數(shù)傳遞結(jié)構(gòu)體的單個成員單向值傳遞,函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu)2.用整個結(jié)構(gòu)體變量作實參和形參,向函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu)單向值傳遞,函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu),開銷大§8.4結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體參與函數(shù)運算的幾種形式:3.向函數(shù)傳遞結(jié)構(gòu)體的首地址用結(jié)構(gòu)體數(shù)組或者結(jié)構(gòu)體指針做函數(shù)參數(shù)除提高效率外,還可以修改結(jié)構(gòu)體指針所指向的結(jié)構(gòu)體的內(nèi)容4、用結(jié)構(gòu)體類型作為函數(shù)返回類型
一付撲克有52張牌,分為4種花色(Suit):黑桃(Spades)、紅桃(Hearts)、草花(Clubs)、方塊(Diamonds)每種花色有13張牌面(Face):A,2,3,4,5,6,7,8,9,10,Jack,Queen,King設計一個結(jié)構(gòu)體表示一張牌,由兩個成分組成:花色、牌面:structCARD{ char suit[10]; char face[10];};
structCARDcard[52];/*順序存放撲克牌*/intresult[52]; /*存放洗牌發(fā)牌結(jié)果*/char*suit[]={"Spades","Hearts","Clubs","Diamonds"};char*face[]={"A","2","3","4","5","6","7","8","9","10","jack","Queen","King"};
例8.1:洗牌和發(fā)牌模擬發(fā)牌過程將52張牌按照隨機的順序存放算法步驟:產(chǎn)生0~51的隨機數(shù),將其放于result[i]內(nèi)。i=i+1如果i<=51,則重復第2步,否則,結(jié)束循環(huán)輸出結(jié)果存在一個致命的問題:在重復第2步時,產(chǎn)生的隨機數(shù)可能與以前產(chǎn)生的隨機數(shù)相同,相同意味著52張牌中出現(xiàn)2張以上相同的牌例8.1:洗牌和發(fā)牌模擬解決方法增加一步,判斷新產(chǎn)生的隨機數(shù)以前是否出現(xiàn)過如果出現(xiàn)過,則放棄;如果以前未出現(xiàn)過,則保留算法步驟:產(chǎn)生0~51的隨機數(shù)m,將其放于result[i]內(nèi)。判斷result[i]在以前(result[0]~result[i-1])是否出現(xiàn)過。如果出現(xiàn)過,則回到第2步;如果沒出現(xiàn)過,則i=i+1如果i<=51,則重復第2~3步,否則,結(jié)束循環(huán)輸出結(jié)果例8.1:洗牌和發(fā)牌模擬算法缺陷:隨著隨機數(shù)數(shù)量的增加,新的隨機數(shù)與已經(jīng)產(chǎn)生的隨機數(shù)相同的可能性越來越大,有可能出現(xiàn)算法延遲問題高效算法將按照花色與牌面的順序存放的牌(card[i])隨機打亂每次循環(huán),程序選擇一個0~51的隨機數(shù)j,然后將數(shù)組中當前的CARD結(jié)構(gòu)card[i]與隨機選出的j所在的數(shù)組元素card[j]結(jié)構(gòu)進行交換例8.1:洗牌和發(fā)牌模擬用結(jié)構(gòu)體數(shù)組做函數(shù)參數(shù)voidFillCard(structCARDwCard[],char*wFace[],char*wSuit[]){ int i; for(i=0;i<52;i++) { strcpy(wCard[i].suit,wSuit[i/13]); strcpy(wCard[i].face,wFace[i%13]); }}例8.1:洗牌和發(fā)牌模擬(P313)用結(jié)構(gòu)體指針做函數(shù)參數(shù)voidShuffle(structCARD*wCard){ inti,j; structcardtemp; for(i=0;i<52;i++) { j=rand()%52;/*j=random(52);TC的庫函數(shù)*/ temp=wCard[i]; wCard[i]=wCard[j]; wCard[j]=temp; /*洗牌過程*/ }}例8.1:洗牌和發(fā)牌模擬(P313)用結(jié)構(gòu)體指針做函數(shù)參數(shù)voidDeal(structCARD*wCard){ inti; for(i=0;i<52;i++) /*輸出發(fā)牌結(jié)果*/ printf("%10s%10s\n",wCard[i].suit,wCard[i].face);}例8.1:洗牌和發(fā)牌模擬(P313)思考題structpoint
{
intx;
inty;
};
structrect
{
structpointpt1;
structpointpt2;
};structrectrt,*rp=&rt;下面表達式哪些合法?(*rp).pt1.xrp->pt1.xrt->pt1.x實驗九結(jié)構(gòu)體編程練習
在屏幕上模擬顯示一個數(shù)字式時鐘定義一個時鐘結(jié)構(gòu)體類型:structclock{inthour;intminute;intsecond;};typedefstructclockCLOCK;voidupdate(CLOCK*t){t->second++;if(t->second==60){t->second=0;t->minute++;}
if(t->minute==60){t->minute=0;t->hour++;}if(t->hour==24)t->hour=0;}voiddisplay(CLOCK*t){printf("%2d:%2d:%2d\r",t->hour, t->minute, t->second);}實驗九結(jié)構(gòu)體編程練習
在屏幕上模擬顯示一個數(shù)字式時鐘
內(nèi)存動態(tài)分配函數(shù)
C語言提供以下幾個動態(tài)存儲分配函數(shù):malloc(size)calloc(n,size)free(ptr)§8.5用指針處理鏈表1.malloc(size)
功能:在內(nèi)存的動態(tài)存儲區(qū)分配一個長度為size的連續(xù)空間。此函數(shù)的返回值是一個指針,它的值是該分配區(qū)域的起始地址。若此函數(shù)未能成功地執(zhí)行,則返回值為0。2.calloc(n,size)
功能:在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為size的連續(xù)空間。3.free(ptr)功能:釋放由ptr指向的內(nèi)存區(qū)。ptr是最近一次調(diào)用malloc或calloc函數(shù)時返回的值。函數(shù)返回分配域的起始地址;若分配不成功,返回0。malloc(size)與calloc(n,size)的區(qū)別
malloc(size)不能初始化所分配的內(nèi)存空間
calloc(n,size)能初始化所分配的內(nèi)存空間
如果由malloc(size)函數(shù)分配的內(nèi)存空間原來沒有被使用過,則其中的每一位都可能是0;如果這部分內(nèi)存空間曾經(jīng)被分配、釋放和重新分配,則其中可能遺留各種各樣的數(shù)據(jù)。calloc(n,size)函數(shù)會將所分配的內(nèi)存空間的每一位都初始化為0malloc(size)與calloc(n,size)的返回值處理malloc(size)與calloc(n,size)的返回值都是void類型的指針,具有一般性,是抽象類型的數(shù)據(jù)若將函數(shù)調(diào)用的返回值賦予某指針,則應先根據(jù)該指針的基類型,對返回的指針進行強制類型轉(zhuǎn)換。鏈表的概念鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)。鏈表有一個“頭指針”變量,它存放一個地址,該地址指向鏈表中的第一個元素。如下圖所示:NULLhead…...鏈表中每一個元素稱為“結(jié)點”每個結(jié)點都應包括兩個部分:數(shù)據(jù)域:用戶需要用的實際數(shù)據(jù)指針域:下一個結(jié)點的地址
結(jié)點1結(jié)點2結(jié)點n可以看出:頭指針head指向第一個元素;第一個元素又指向第二個元素;…...直到最后一個元素,該元素不再指向其它元素,它稱為“鏈尾”,其地址部分存放一個“NULL”(表示“空地址”)。鏈表到此結(jié)束。對于兩個相鄰的結(jié)點p1、p2,p1是p2的直接前驅(qū)結(jié)點,p2是p1的直接后繼結(jié)點NULLhead…...p1p2由此可以看出:鏈表中結(jié)點必須是結(jié)構(gòu)體類型,其中一個成員是指針類型,這個指針類型指向它所在的結(jié)構(gòu)體類型。其中next是成員名,是指針類型,它指向structlink類型數(shù)據(jù)例如:structlink{intdata;structlink*next;};
Datanext數(shù)據(jù)域指針域前面只是定義了一個structlink類型,并未實際分配存儲空間,可用前述方法在需要時動態(tài)地開辟和釋放存儲單元。例如:#include“stdlib.h”p=(structlink*)malloc(sizeof(structlink));if(p!=NULL){p->data=10;p->next=NULL;}10NULLP其中sizeof()的功能是測試某種類型的變量在內(nèi)存中所占用的字節(jié)數(shù)。例如,sizeof(float)的值是4,它表示float型變量在內(nèi)存中占4個字節(jié)。free(p);
structLink{intdata;StructLink*next;};線性表的鏈式存儲結(jié)構(gòu)——可用C語言中的“結(jié)構(gòu)指針”來描述a1a2∧ana3L…..帶頭結(jié)點的線性鏈表datanexta1a2∧ana3L…..不帶頭結(jié)點的線性鏈表1、動態(tài)鏈表的建立(新結(jié)點鏈接在鏈尾)NULLhead初態(tài)第一次插入第n次插入headPrNULLa1headPrNULLa1an2、在頭指針為h的單鏈表中查找結(jié)點xStructlink*dlbcz(Structlink*h,intx){Structlink*p;p=h;while(p!=NULL&&p->data!=x)p=p->next;return(p);}
structLink{intdata;StructLink*next;};3、單鏈表的插入運算(后插)
voiddlbhcr(structLink*p,intx){structLink*s;s=(structLink*)malloc(sizeof(structLink));if(s!=NULL){s->data=x;s->next=p->next;p->next=s;}elseprintf(“unsucess!”);}baPbaxPS∧anaia1a2ai-1xheadSPai-1a1aiai+1LpqVoiddlbsc(structLink*p){structLink*q;if(p->next!=NULL){q=p->next;p->next=q->next;free(q);}}4、單鏈表的刪除運算(在單鏈表中刪除p結(jié)點的直接后繼結(jié)點q)5、單鏈表中直接插入或刪除某個結(jié)點p插入某個結(jié)點p時需考慮:1.插入點p在第一個結(jié)點之前,應修改頭指針head及其指向即:p->next=head;head=p;2.插入點p在鏈表中間,應修改插入點前pr結(jié)點的指向即:p->next=pr->next;pr->next=p;3.插入點p在鏈尾,應修改原鏈表最后一個結(jié)點pr指針域的指向,并將新插入的結(jié)點p的指針域賦為NULL.
即:p->next=NULL;pr->next=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版拼音課件教學
- 濟南版2019學年七年級生物下冊全一冊檢測
- 小學水平一足球教案-足球游戲教案
- 互聯(lián)網(wǎng)公司租賃合同
- 二手房產(chǎn)買賣過戶合同
- 個人與銀行債務轉(zhuǎn)讓合同
- 三人合資合作協(xié)議樣本
- 不動產(chǎn)抵押貸款協(xié)議
- 產(chǎn)學研合作航空航天技術協(xié)議
- 二手車抵押合同書
- 人生觀的主要內(nèi)容講解
- 醫(yī)院培訓課件:《RCA-根本原因分析》
- 苯妥英鋅的合成1(修改)
- 信創(chuàng)醫(yī)療工作總結(jié)
- 高中物理《相互作用》大單元集體備課
- 南仁東和中國天眼課件
- 彩票市場銷售計劃書
- 設備維保的現(xiàn)場維修與故障處理
- 2024《中央企業(yè)安全生產(chǎn)治本攻堅三年行動方案(2024-2026年)》
- 紀委監(jiān)督工作培訓課件
- 蟲害分析分析報告
評論
0/150
提交評論