版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
結(jié)構(gòu)體與共用體要點一、概述結(jié)構(gòu)體(structure)是一種數(shù)據(jù)類型,它把互相聯(lián)系的數(shù)據(jù)組合成一個整體把不同類型的數(shù)據(jù)組合成一個有機的整體,可以用結(jié)構(gòu)體解決。結(jié)構(gòu)體中的每一項數(shù)據(jù),稱為結(jié)構(gòu)體 成員”(member)或分量”。聲明結(jié)構(gòu)體類型的一般形式:struct結(jié)構(gòu)體名{成員表列};聲明各成員的形式:類型名成員名;例如:學生數(shù)據(jù) structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}; 注意不要忽略最后的分號student結(jié)構(gòu)體類型占 59個字節(jié)。二、定義結(jié)構(gòu)體類型變量的方法1.先聲明結(jié)構(gòu)體類型再定義變量名structstudentstudent1,student2;要求指定為某一特定的結(jié)構(gòu)體類型2.在聲明類型的同時定義變量struct結(jié)構(gòu)體名{成員表列}變量名表列;例如:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;3.直接定義結(jié)構(gòu)體類型變量struct{成員表列}變量名表列;幾點說明:(1)類型與變量是不同的概念;(2)結(jié)構(gòu)體中的成員可單獨使用,其作用與地位相當于普通變量;(3)成員也可以是一個結(jié)構(gòu)體變量;(4)成員名與普通變量名相同,不代表同一對象。三、結(jié)構(gòu)體變量的引用(1)不能將結(jié)構(gòu)體變量整體進行輸入和輸出,只能對各個成員分別進行輸入和輸出。printf("%d,%s,%c,%d,%f,%s\n",student1);錯誤(2)引用成員的方式:結(jié)構(gòu)體變量名.成員名當成員是另一個結(jié)構(gòu)體變量時,應一級一級地引用成員僅在以下兩種情況下,可以把結(jié)構(gòu)體變量作為一個整體來訪問。(1)結(jié)構(gòu)體變量整體賦值例、student2=studentl;(2)取結(jié)構(gòu)體變量地址例、printf("%x",&student1);/*輸出studentl的地址*/四、結(jié)構(gòu)體變量的初始化structstudent{longintnum;/*學號*/char name[20]; /*姓名*/char sex; /*性別*/charaddr[20]; /*地址*/}a={89031,"LiLin",'M',"123BeijingRoad"};注意:不能在結(jié)構(gòu)體內(nèi)賦初值。例、下面程序錯誤structstudent{longintnum=89031;—charname[20]="LiLin";一charsex='M';—charaddr[30]="123BejingRoad";匚}a;五、結(jié)構(gòu)體數(shù)組每個數(shù)組元素都是一個結(jié)構(gòu)體類型數(shù)據(jù).定義結(jié)構(gòu)體數(shù)組和定義結(jié)構(gòu)體變量的方法相仿(三種方法).結(jié)構(gòu)體數(shù)組的初始化在定義數(shù)組的后面加上: ={初始表列};structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];{10102,"ZhangFun",'M',19,99, "130ShanghaiRoaad"),};六、指向結(jié)構(gòu)體類型數(shù)據(jù)的指針結(jié)構(gòu)體變量的指針:就是該變量所占據(jù)的內(nèi)存段的起始地址。.指向結(jié)構(gòu)體變量的指針(*p).num表示:p指向的結(jié)構(gòu)體變量中的成員 num成員運算符“.”優(yōu)先于“*”運算符三三種表示形式:(1)構(gòu)體變量名.成員名(*p).成員名 該方式用得很少p->成員名.指向結(jié)構(gòu)體數(shù)組的指針注息:p=stu;,貝Up++指向stu[1](2)運算符“->”優(yōu)先于“++”運算符++p->num:使p所指向的num成員值加1(++p)->num:先使p+1,然后得到它指向的元素中的 num成員值例:有4個學生,每個學生包括學號、姓名和成績。要求我由成績最高者的姓名和成績。voidmain(){structstudent{intnum; /*學號*/charname[20];/*姓名*/floatscore; /*成績*/};structstudentstu[4];/*4個學生*/structstudent*p;inti;inttemp=0;/* 成績最高學生在數(shù)組中的序號, 0?3*/floatmax;/*最高成績*/for(i=0;i<4;i++)/*輸入4個學生的學號、姓名、成績 */scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score);for(max=stu[0].score,i=1;i<4;i++)/*stu[0]已賦給max*/{if(stu[i].score>max){max=stu[i].score;temp=i;}}p=stu+temp;/*p指向成績最高的學生結(jié)構(gòu)*/、結(jié)構(gòu)體變量、指向結(jié)構(gòu)體的指針均可作為函數(shù)參數(shù)例:有一個結(jié)構(gòu)體變量 stu,內(nèi)含學生學號、姓名和三門課程的成績。要求在main中賦以值,在函數(shù) print中打印輸出。#defineformat"%d\n%s\n%f\n%f\n%f\n"structstudentTOC\o"1-5"\h\z{intnum;/*學號 */charname[20];/* 姓名 */floatscore[3];/*三門課程的成績 */};voidprint(structstudent*p);/*print函數(shù)原型聲明*/voidmain(){structstudentstu;print(&stu); /*如果 stu是結(jié)構(gòu)體數(shù)組,則不要 &符號 */}voidprint(structstudent*p)/*print函數(shù)定義*/{printf(format,p->num,p->name,p->score[0],p->score[1],p->score[2]);printf("\n");}(1)結(jié)構(gòu)體的成員作函數(shù)的參數(shù)。與普通變量作函數(shù)參數(shù)的用法相同。值傳送,不能修改實參的值。(2)結(jié)構(gòu)體指針作函數(shù)的參數(shù)。將結(jié)構(gòu)體的地址傳送給函數(shù),效率高,可以修改實參的值。(3)結(jié)構(gòu)體作函數(shù)的參數(shù)。將結(jié)構(gòu)體的全部成員值傳送給函數(shù),效率低,不能修改實參的值。例:structSTU{charname[10];intnum;};voidf(char*name,intnum){structSTUs[2]={{"SunDan",2004},{"Penghua",20045}};num=s[0].num;strcpy(name,s[0].name);}main(){structSTUs[2]={{"YangSan",20041},{"LiSiGuo",20042}},*p;p=&s[1];f(p->name,p->num);前一個參數(shù)的地址,后一個是數(shù)值printf("%s%d\n",p->name,p->num);getch();}運行結(jié)果:SunDan20042前一個隨子函數(shù)變化,后一個不變?nèi)允侵骱瘮?shù)中的值。七、用指針處理鏈表 (一定要學會畫圖 ).鏈表概述鏈表:動態(tài)地進行存儲分配的一種結(jié)構(gòu),它動態(tài)地進行存儲分配。數(shù)組:存放不同班級的學生數(shù)據(jù),數(shù)組定得足夠大,浪費內(nèi)存。數(shù)組必須事先定義固定的長度(元素個數(shù)),不能適應數(shù)據(jù)動態(tài)地增減的情況。當數(shù)據(jù)增加時,可能超由原先定義的元素個數(shù);當數(shù)據(jù)減少時,造成內(nèi)存浪費。鏈表動態(tài)地進行存儲分配,可以適應數(shù)據(jù)動態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項。(數(shù)組中插入、刪除數(shù)據(jù)項時,需要移動其它數(shù)據(jù)項)。鏈表有單向鏈表、雙向鏈表、環(huán)形鏈表等形式。結(jié)點:鏈表中的每一個元素,包括兩部分①用戶需要的實際數(shù)據(jù)②下一個結(jié)點的地址?r_rn ?head——>1A1?J一1B??J一1C1?J—?D;NULLhead指向第一個元素,第一個元素又指向第二個元素,…直到最后一個元素,該元素不再指向其它元素。表尾:地址部分放一個“NULL”(表示空地址)※結(jié)點應為結(jié)構(gòu)體類型,一個結(jié)點中應包含一個指針變量,用它存放下一個結(jié)點的地址。例:structstudent{intnum;floatscore;structstudentnext;/*next指向structstudent類型數(shù)據(jù)*/};student鏈表.簡單鏈表所有結(jié)點都是在程序中定義的,不是臨時開辟的,是“靜態(tài)鏈表”.處理動態(tài)鏈表所需的函數(shù)malloc(size)作用:在內(nèi)存的動態(tài)存儲區(qū)中。函數(shù)返回值:該分配域的起始地址。不成功,則返回 NULLo⑵calloc(n,size)分配n個長度為size的連續(xù)空間⑶free(p)釋放由p指向的內(nèi)存區(qū)。函數(shù)無返回值。.建立動態(tài)鏈表即從無到有,一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。例、寫一函數(shù)建立一個有3名學生數(shù)據(jù)的單向動態(tài)鏈表過程:開辟單元-輸入數(shù)據(jù)-加入鏈表head:頭指針p1、p2:工作指針,p2跟著p1向后走sizeof:求字節(jié)運算符(structstudent*):返回的指針轉(zhuǎn)換為指向 structstudent類型數(shù)據(jù)的指針。.輸出鏈表一般從鏈表首部依次輸出。.對鏈表的刪除操作刪去結(jié)點,即是把它從鏈表中分離出來即可。(1)刪除頭結(jié)點(2)刪除中后結(jié)點.對鏈表的插入操作將一個結(jié)點按指定次序,插入到一個已有的鏈表中(1)頭部(2)中部(3)后部例:(1)下列程序用來從鍵盤上讀入一行字符,弁按輸入順序建立一個“反式”鏈表。即讀入的第1個字符存入尾結(jié)點,讀入的第2個字符存入倒數(shù)第2個結(jié)點,依此類推,讀入的最后一個字符存入頭結(jié)點。讀入完成后,按鏈表輸出這一行字符,最后釋放全部結(jié)點空間。例如:讀入abcd,建立的鏈表如下圖? ? ?? ? ? ??head——>d?-H—>c?-H-->b?-H—>a01~ 1~~ 1~ 1—~最后輸出的一行字符為dcba#defineNULL0#defineLENsizeof(structnode)structnode{charinfo;structnode*next;}main(){structnode*head,*p;charc;head=NULL;while((c=getchar())!='\n'){p=(structnode*)malloc(LEN);p->info=c;p->next=head;head=p;}while(head!=NULL){p=head;head=head->next或p->next;putchar(p->info);free(p);/*釋放一個結(jié)點*/}}(2)建立一條鏈,鏈中的數(shù)據(jù)按從小到大的順序排列structnode{intdata;structnode*next;};structnode*addx(structnode*head,intx){structnode*p,*p1,*p2;p=(structnode*)malloc(sizeof(structnode));p->data=x;if(head=NULL){head=p;p->next=NULL;return(head);}if(head->data>=p->data){(p->next=head);head=p;return(head);}p1=head;p2=p1->next;if(p2==NULL){p1->next=p;p->next=NULL;return(head);}while(p2->next!=NULL&&(p2->data<p->data)){p1=(p2);p2=p2->next;}if(p2->data<p->data){p2->next=p;p->next=NULL;}else{(p->next=p2);p1->next=p;}return(head);}main(){structnode*head;inti,x;head=NULL;for(i=0;i<5;i++){printf("\nInput%2dthnumber!”,i);scanf("%d",&x);head=addx(head,x);}while(head!=NULL){printf("\n%d",head->data);head=head->next;}}八、共用體1.共用體的概念幾種不同類型的變量共占同一段內(nèi)存單元(同一地址開始)。共用體變量定義的一般形式:struct共用體名{成員
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度內(nèi)陸水路貨物運輸代理合同樣本
- 二零二五年度廣告?zhèn)髅叫袠I(yè)設計人員派遣合同范本2篇
- 二零二五年度土地征收與補償安置合同模板
- 2025年度上市公司人事勞動合同模板2篇
- 2025年度個人旅游線路設計服務合同4篇
- 二零二五年度電梯鋼結(jié)構(gòu)高空作業(yè)安全防護承包合同2篇
- 2025版智慧苗圃基地規(guī)劃設計施工一體化合同4篇
- 二零二五版內(nèi)墻批灰與智能家居照明系統(tǒng)合同4篇
- 課題申報參考:面向破損兵馬俑修復的碎片多尺度全局T o k e n掩碼學習分類研究
- 2025年度商鋪租賃合同(含租賃物安全責任)
- 社區(qū)醫(yī)療抗菌藥物分級管理方案
- 開題報告-鑄牢中華民族共同體意識的學校教育研究
- 《醫(yī)院標識牌規(guī)劃設計方案》
- 公司2025年會暨員工團隊頒獎盛典攜手同行共創(chuàng)未來模板
- 新滬科版八年級物理第三章光的世界各個章節(jié)測試試題(含答案)
- 夜市運營投標方案(技術(shù)方案)
- 電接點 水位計工作原理及故障處理
- 國家職業(yè)大典
- 2024版房產(chǎn)代持協(xié)議書樣本
- 2024年3月計算機等級考試三級數(shù)據(jù)庫技術(shù)筆試真題及答案
- 公眾號運營實戰(zhàn)手冊
評論
0/150
提交評論