C語言程序設(shè)計教程第9章結(jié)構(gòu)體與共用體.ppt
《C語言程序設(shè)計教程第9章結(jié)構(gòu)體與共用體.ppt》由會員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計教程第9章結(jié)構(gòu)體與共用體.ppt(86頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1,第9章結(jié)構(gòu)體與共用體,北京科技大學(xué)計算機系,C語言程序設(shè)計,2020/4/25,2,第9章結(jié)構(gòu)體與共用體,9.1結(jié)構(gòu)體9.2共用體9.3枚舉類型與類型命名,2020/4/25,3,一個學(xué)生的信息有學(xué)號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關(guān)數(shù)據(jù)?,9.1結(jié)構(gòu)體,9.1.1結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義,?,信息管理,結(jié)構(gòu)體——一種構(gòu)造類型數(shù)據(jù)結(jié)構(gòu)體由若干不同類型的數(shù)據(jù)項組成,構(gòu)成結(jié)構(gòu)體的各個數(shù)據(jù)項稱為結(jié)構(gòu)體成員。,2020/4/25,4,struct結(jié)構(gòu)體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;};,9.1結(jié)構(gòu)體,9.1.1結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義,結(jié)構(gòu)體類型定義的一般形式:,struct為關(guān)鍵字;結(jié)構(gòu)體名是用戶定義的類型標(biāo)識。{}中是組成該結(jié)構(gòu)體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。,2020/4/25,5,例如圖書類型的定義:structbookcard{charnum[10];/*圖書分類編號是字符數(shù)組類型*/charname[30];/*書名是字符數(shù)組類型*/charauthor[30];/*作者是字符數(shù)組類型*/charpublisher[60];/*出版社是字符數(shù)組類型*/floatprice;/*價格是單精度實型*/intn;/*庫存量是整型*/};,例如學(xué)生類型的定義:structstudent{charnum[8];/*學(xué)號是字符數(shù)組類型*/charname[30];/*姓名是字符數(shù)組類型*/charsex;/*性別是字符型*/intage;/*年齡是整型*/charaddr[60];/*住址是字符數(shù)組類型*/intscore[6];/*成績是整型數(shù)組類型*/};,9.1結(jié)構(gòu)體,9.1.1結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義,2020/4/25,6,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,1.結(jié)構(gòu)體類型變量的定義,利用已定義的結(jié)構(gòu)體類型名定義變量struct結(jié)構(gòu)體名變量名表;例如:structbookcardbook1[100];structstudents[30],t1,t2;,按照結(jié)構(gòu)體類型的組成,系統(tǒng)為定義的結(jié)構(gòu)體變量分配內(nèi)存單元。結(jié)構(gòu)體變量的各個成員在內(nèi)存中占用連續(xù)存儲區(qū)域,結(jié)構(gòu)體變量所占內(nèi)存大小為結(jié)構(gòu)體中每個成員所占用內(nèi)存的長度之和。,2020/4/25,7,9.1結(jié)構(gòu)體,結(jié)構(gòu)體類型與變量的說明,類型與變量是不同的概念。應(yīng)先定義一個結(jié)構(gòu)體類型,而后再定義結(jié)構(gòu)體變量。系統(tǒng)對類型不分配空間,僅對變量分配空間。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。,成員也可以是結(jié)構(gòu)變量。,對結(jié)構(gòu)中的成員,可以單獨使用,它的作用與地位相當(dāng)于普通變量。成員名可與程序中的變量名相同時,也可與不同結(jié)構(gòu)體類型的成員名相同,二者代表不同的對象。,structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;structdatebirthday;/*成員為結(jié)構(gòu)體類型*/charaddr[60];intscore[6];};,2020/4/25,8,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,1.結(jié)構(gòu)體類型變量的定義,在定義結(jié)構(gòu)體類型的同時定義變量,例如:structstudent{charnum[8],name[20],sex;intage;floatscore;}st[30];,struct結(jié)構(gòu)體名{成員定義表;}變量名表;,2020/4/25,9,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,1.結(jié)構(gòu)體類型變量的定義,直接定義結(jié)構(gòu)體類型變量,例如:struct{charnum[8],name[20],sex;intage;floatscore;}st[30],a,b,c;,struct{成員定義表;}變量名表;,2020/4/25,10,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,2.結(jié)構(gòu)體變量的初始化,【例9.4】結(jié)構(gòu)體變量的初始化。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",M,{1977,12,9},83},b={"9608025","Zhangliming",F,{1978,5,10},87},c;,如果初值個數(shù)少于結(jié)構(gòu)體成員個數(shù),則將無初值對應(yīng)的成員賦以0值。如果初值個數(shù)多于結(jié)構(gòu)體成員個數(shù),則編譯出錯。,2020/4/25,11,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,2.結(jié)構(gòu)體變量的初始化,【例9.5】結(jié)構(gòu)體數(shù)組的初始化。structs{charnum[8],name[20],sex;floatscore;}stu[3]={{"9606011","Liming",M,87.5},{"9606012","Zhangjiangguo",M,79},{"9606013","Wangping",F,90}};,元素的個數(shù)可以省略,根據(jù)賦初值時結(jié)構(gòu)體常量的個數(shù)確定數(shù)組元素的個數(shù),2020/4/25,12,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,3.結(jié)構(gòu)體變量的運算,用sizeof運算符計算結(jié)構(gòu)體變量所占內(nèi)存空間,structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;,sizeof(a)的結(jié)果為8+20+1+6+4=39sizeof(structstudent)的結(jié)果為39,2020/4/25,13,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,3.結(jié)構(gòu)體變量的運算,同類型結(jié)構(gòu)體變量之間的賦值運算,結(jié)構(gòu)體變量之間進行賦值時,系統(tǒng)將按成員一一對應(yīng)賦值。,structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",M,{1977,12,9},83},b,c;c=a;,2020/4/25,14,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,3.結(jié)構(gòu)體變量的運算,對結(jié)構(gòu)體變量進行取址運算,structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;,對結(jié)構(gòu)體變量a進行};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;,“.”是分量運算符,運算級別最高。,a.birthday.yeara.birthday.montha.birthday.day,結(jié)構(gòu)體變量的各個成員可進行何種運算,由該成員的數(shù)據(jù)類型決定,2020/4/25,16,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,【例9.6】編寫一個統(tǒng)計選票的程序。structcandidate{charname[20];/*name為候選人姓名*/intcount;/*count為候選人得票數(shù)*/}list[]={{"invalid",0},{"Zhao",0},{"Qian",0},{"Sun",0},{"Li",0},{"Zhou",0}};,2020/4/25,17,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,main(){inti,n;printf("Entervote\n");scanf("%d",/*輸入所投候選人編號*/},2020/4/25,18,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,for(i=1;iyearp->monthp->day,“->”是指向結(jié)構(gòu)體成員運算符,優(yōu)先級為一級,p=}today,*p=},2020/4/25,22,9.1結(jié)構(gòu)體,9.1.3結(jié)構(gòu)體的指針,3.指向結(jié)構(gòu)體數(shù)組的指針,【例9.7】利用結(jié)構(gòu)體指針輸出一組化學(xué)元素名稱及其原子量。structlist{inti;charname[4];floatw;}tab[4]={{1,"H",1.008},{2,"He",4.0026},{3,"Li",6.941},{4,"Be",9.01218}};,2020/4/25,23,9.1結(jié)構(gòu)體,9.1.3結(jié)構(gòu)體的指針,3.指向結(jié)構(gòu)體數(shù)組的指針,main(){structlist*p;printf("No\tName\tAtomicWeight\n");for(p=tab;pi,p->name,p->w);},,NoNameAtomicWeight,1H1.008,2He4.0026,3Li6.941,4Be9.01218,2020/4/25,24,9.1結(jié)構(gòu)體,9.1.3結(jié)構(gòu)體的指針,【例9.8】分析自增自減運算對程序結(jié)果的影響。structcode{inti;charc;}a[]={{100,A},{200,B},{300,C},{400,D}};,2020/4/25,25,9.1結(jié)構(gòu)體,9.1.3結(jié)構(gòu)體的指針,main(){structcode*p=a;printf("%d\t",++p->i);printf("%c\t",(++p)->c);printf("%d\t",(p++)->i);printf("%c\t",++p->c);printf("%d\t",p->i++);printf("%d\n",p->i);},p,,,,,,101,D,301,,101,B,200,D,300,301,2020/4/25,26,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,方法一:在函數(shù)之間直接傳遞結(jié)構(gòu)體數(shù)據(jù)。函數(shù)的形參定義為結(jié)構(gòu)體變量。函數(shù)調(diào)用時,可將主調(diào)函數(shù)的結(jié)構(gòu)體類型實參傳遞給被調(diào)函數(shù)的形參。如果將函數(shù)定義為結(jié)構(gòu)體類型函數(shù),可利用return語句將一個結(jié)構(gòu)體數(shù)據(jù)結(jié)果返回到主調(diào)函數(shù)中。,2020/4/25,27,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,方法二:在函數(shù)之間傳遞結(jié)構(gòu)體指針。形參定義為指向結(jié)構(gòu)體類型的指針變量,可將主調(diào)函數(shù)的結(jié)構(gòu)體指針傳遞給被調(diào)函數(shù)的形參變量,通過指針形參的指向域的擴展,操作主調(diào)函數(shù)中結(jié)構(gòu)體變量及其成員。如果將函數(shù)定義為結(jié)構(gòu)體指針型函數(shù),可利用return語句將被調(diào)函數(shù)中結(jié)構(gòu)體變量的指針返回給主調(diào)函數(shù)的結(jié)構(gòu)體指針變量。方法三:利用全局結(jié)構(gòu)體變量傳遞結(jié)構(gòu)體數(shù)據(jù)。,2020/4/25,28,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,【例9.9】編制一個復(fù)數(shù)乘法函數(shù),采用值傳遞的方法傳送數(shù)據(jù)。structcomplex/*定義存放復(fù)數(shù)的結(jié)構(gòu)體類型*/{floatre;/*re成員用于存放復(fù)數(shù)的實部*/floatim;/*im成員用于存放復(fù)數(shù)的虛部*/};,2020/4/25,29,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,structcomplexmultiplier(structcomplexcx,structcomplexcy){structcomplexcz;cz.re=cx.re*cy.re-cx.im*cy.im;cz.im=cx.re*cy.im+cx.im*cy.re;return(cz);},形參是結(jié)構(gòu)體變量。調(diào)用此函數(shù)時,系統(tǒng)將分別為形參cx和cy各分配一個sizeof(structcomplex)大小的內(nèi)存空間,每個成員都要一一傳遞。,2020/4/25,30,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,main(){structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;z=multiplier(x,y);printf("%f+%fi\n",z.re,z.im);/*以復(fù)數(shù)形式輸出*/},2020/4/25,31,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,【例9.10】編制一個復(fù)數(shù)乘法函數(shù),采用傳遞指針的方法達到傳送數(shù)據(jù)的目的。structcomplex{floatre,im;};voidmultiplier(structcomplex*px,structcomplex*py,structcomplex*pz){pz->re=px->re*py->re-px->im*py->im;pz->im=px->re*py->im+px->im*py->re;},形參定義為指針型參數(shù)。函數(shù)調(diào)用時,實參傳遞的是結(jié)構(gòu)體指針(地址),因此形參px、py可讀取主調(diào)函數(shù)中變量的內(nèi)容,乘積結(jié)果也可通過形參pz指針存到主調(diào)函數(shù)中的目標(biāo)變量。這樣實參與形參之間的數(shù)據(jù)傳遞由多值(每個成員的值)變成了單值(結(jié)構(gòu)體變量的首地址)。,2020/4/25,32,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,main(){structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;multiplier(},2020/4/25,33,鏈表是一種動態(tài)數(shù)據(jù)結(jié)構(gòu),可根據(jù)需要動態(tài)地分配存儲單元。在數(shù)組中,插入或刪除一個元素都比較繁瑣,而用鏈表則相對容易。但是數(shù)組元素的引用比較簡單,對于鏈表中結(jié)點數(shù)據(jù)的存取操作則相對復(fù)雜。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,①鏈表中每個元素稱為一個結(jié)點。②構(gòu)成鏈表的結(jié)點必須是結(jié)構(gòu)體類型數(shù)據(jù)。,1.鏈表的基本結(jié)構(gòu),③相鄰結(jié)點的地址不一定是連續(xù)的,依靠指針將它們連接起來。,structnode{charc;structnode*next;};,2020/4/25,34,C語言提供了相關(guān)的存儲管理庫函數(shù)。這里僅介紹其中三個,它們的原型說明在“stdlib.h”頭文件和“alloc.h”頭文件中,使用這三個函數(shù)時,應(yīng)選擇其中一個頭文件包含到源程序中。,⑴動態(tài)分配存儲區(qū)函數(shù)malloc()函數(shù)原型:void*malloc(unsignedsize);調(diào)用格式:malloc(size)功能:在內(nèi)存分配一個size字節(jié)的存儲區(qū)。調(diào)用結(jié)果為新分配的存儲區(qū)的首地址,是一個void類型指針。若分配失敗,則返回NULL(即0)。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,2.動態(tài)分配和釋放存儲單元,在ANSIC標(biāo)準(zhǔn)中,關(guān)鍵字void有兩種用法。第一種用法,可將無返回值的函數(shù)定義為void類型第二種用法,用void*定義指針,這是一個指向非具體數(shù)據(jù)類型的指針,稱為無類型指針。,2020/4/25,35,【例9.11】調(diào)用malloc函數(shù)分配所需存儲單元。#includemain(){structst{intn;structst*next;}*p;p=(structst*)malloc(sizeof(structst));p->n=5;p->next=NULL;printf("p->n=%d\tp->next=%x\n",p->n,p->next);},9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,2.動態(tài)分配和釋放存儲單元,將函數(shù)返回值轉(zhuǎn)換成結(jié)構(gòu)體指針,2020/4/25,36,⑵動態(tài)分配存儲區(qū)函數(shù)calloc()函數(shù)原型:void*calloc(unsignedintn,unsignedintsize);調(diào)用格式:calloc(n,size)功能:在內(nèi)存分配一個n倍size字節(jié)的存儲區(qū)。調(diào)用結(jié)果為新分配的存儲區(qū)的首地址,是一個void類型指針。若分配失敗,則返回NULL(即0)。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,2.動態(tài)分配和釋放存儲單元,2020/4/25,37,【例9.12】調(diào)用calloc函數(shù)分配所需存儲單元。#includemain(){inti,*ip;ip=(int*)calloc(10,2);for(i=0;i<10;i++)scanf("%d",ip+i);for(i=0;iname,name);/*為新結(jié)點中的成員賦值*/printf("tel:");gets(p->tel);p->next=NULL;if(h==NULL)/*h為空,表示新結(jié)點為第一個結(jié)點*/h=p;/*頭指針指向第一個結(jié)點*/else/*h不為空*/q->next=p;/*新結(jié)點與尾結(jié)點相連接*/q=p;/*使q指向新的尾結(jié)點*/printf("name:");gets(name);}returnh;},structnode*create(){staticstructnode*h;structnode*p,*q;charname[20];h=NULL;printf("name:");gets(name);while(strlen(name)!=0)/*當(dāng)輸入的姓名不是空串循環(huán)*/{p=NEW;/*開辟新結(jié)點*/if(p==NULL)/*p為NULL,新結(jié)點分配失敗*/{printf("Allocationfailure\n");exit(0);/*結(jié)束程序運行*/},#include#include#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,main(){structnode*head;……h(huán)ead=create();……},2020/4/25,41,【例9.14】輸出學(xué)生電話簿鏈表函數(shù)。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,4.輸出單向鏈表中各結(jié)點信息,,,,2020/4/25,42,voidprlist(structnode*head){structnode*p;p=head;while(p!=NULL){printf("%s\t%s\n",p->name,p->tel);p=p->next;}},#include#include#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,main(){structnode*head;……h(huán)ead=create();prlist(head);……},2020/4/25,43,在鏈表中,如果要刪除第i個結(jié)點,一般是將第(i-1)個結(jié)點直接與第(i+1)個結(jié)點相連接,然后再釋放第i個結(jié)點的存儲單元。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,5.刪除單向鏈表中指定的結(jié)點,,2020/4/25,44,【例9.15】刪除學(xué)生電話簿鏈表中指定學(xué)生的信息。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,刪除第一個結(jié)點,刪除中間結(jié)點或尾結(jié)點,學(xué)生姓名,當(dāng)姓名不同并且不是尾結(jié)點循環(huán),2020/4/25,45,【例9.15】刪除學(xué)生電話簿鏈表中指定學(xué)生的信息。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,,,,(a)刪除第一個結(jié)點(head=p->next),,2020/4/25,46,【例9.15】刪除學(xué)生電話簿鏈表中指定學(xué)生的信息。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,,,,(b)刪除中間結(jié)點或尾結(jié)點(q->next=p->next),,2020/4/25,47,【例9.15】刪除學(xué)生電話簿鏈表中指定學(xué)生的信息。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,,,,(c)未找到指定的結(jié)點(strcmp(x,p->name)!=0),,2020/4/25,48,if(strcmp(x,p->name)==0){if(p==head)head=p->next;/*刪除頭結(jié)點*/elseq->next=p->next;/*刪除中間或尾結(jié)點*/free(p);/*釋放被刪除的結(jié)點*/}elseprintf("Notfound.");/*未找到指定的結(jié)點*/h=head;returnh;},#include#include#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,2020/4/25,49,將一個新結(jié)點插入到鏈表中,首先要尋找插入的位置。如果要求在第i個結(jié)點前插入,可設(shè)置三個工作指針p0、p和q,p0是指向待插入結(jié)點的指針。利用p和q指針查找第i個結(jié)點,找到后再將新結(jié)點鏈接到鏈表上。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,6.在單向鏈表中插入結(jié)點,,q,q,,,新的第i個結(jié)點,2020/4/25,50,【例9.16】在學(xué)生電話簿鏈表中插入一個學(xué)生的信息。要求將新的信息插入在指定學(xué)生信息之前,如果未找到指定學(xué)生,則追加在鏈表尾部。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,當(dāng)姓名不同并且不是尾結(jié)點循環(huán),空表時插入結(jié)點,在表尾追加結(jié)點,在表頭插入結(jié)點,在表中間插入結(jié)點,2020/4/25,51,【例9.16】在學(xué)生電話簿鏈表中插入一個學(xué)生的信息。要求將新的信息插入在指定學(xué)生信息之前,如果未找到指定學(xué)生,則追加在鏈表尾部。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,,,,(a)在表頭插入結(jié)點(head=p0;p0->next=p),,2020/4/25,52,【例9.16】在學(xué)生電話簿鏈表中插入一個學(xué)生的信息。要求將新的信息插入在指定學(xué)生信息之前,如果未找到指定學(xué)生,則追加在鏈表尾部。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,,,,(b)在表中間插入結(jié)點(q->next=p0;p0->next=p),,2020/4/25,53,【例9.16】在學(xué)生電話簿鏈表中插入一個學(xué)生的信息。要求將新的信息插入在指定學(xué)生信息之前,如果未找到指定學(xué)生,則追加在鏈表尾部。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,,,,(c)在表尾追加結(jié)點(p->next=p0;p0->next=NULL),,,,2020/4/25,54,if(strcmp(x,p->name)==0){if(p==head)head=p0;/*在表頭插入結(jié)點*/elseq->next=p0;/*在表中間插入結(jié)點*/p0->next=p;}else{p->next=p0;/*在表尾插入結(jié)點*/p0->next=NULL;}}h=head;returnh;},9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,#include#include#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};,2020/4/25,55,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,【例9.17】學(xué)生電話簿鏈表管理程序。,編制此程序可利用例9.13至例9.16的4個函數(shù)完成鏈表的建立、輸出、刪除和插入等功能,這里只需編制一個main函數(shù)完成對這4個函數(shù)的調(diào)用。#include#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};,2020/4/25,56,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,main(){structnode*create(),*delnode(structnode*,char*);structnode*insert(structnode*,structnode*,char*);voidprlist(structnode*);structnode*head=NULL,*stu;chars[80],name[20];intc;,2020/4/25,57,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,do{do{printf("\n****MENU****\n");printf("1.Createalist\n");printf("2.Printalist\n");printf("3.Deleteanode\n");printf("4.Insertanode\n");printf("0.Quit\n");printf("Enteryourchoice(0-4):");gets(s);c=atoi(s);}while(c4);,可以先選擇1建立一個鏈表,然后根據(jù)需要選擇功能2、功能3、功能4、直到選擇0退出程序的運行,2020/4/25,58,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用——鏈表,switch(c){case1:head=create();break;case2:prlist(head);break;case3:printf("\nInputanamedeleted:\n");gets(name);head=delnode(head,name);break;case4:stu=NEW;printf("\nInputanewnode\n");printf("name:");gets(stu->name);printf("tel:");gets(stu->tel);stu->next=NULL;printf("\nInsertposition\n");printf("name:");gets(name);head=insert(head,stu,name);}}while(c);},2020/4/25,59,結(jié)構(gòu)體類型解決了如何描述一個邏輯上相關(guān),但數(shù)據(jù)類型不同的一組分量的集合。在需要節(jié)省內(nèi)存儲空間時,c語言還提供了一種由若干個不同類型的數(shù)據(jù)項組成,但共享同一存儲空間的構(gòu)造類型。,9.2共用體,9.2.1共用體與共用體類型的定義,共用體——一種構(gòu)造類型數(shù)據(jù)共用體由若干不同類型的數(shù)據(jù)項組成,構(gòu)成共用體的各個數(shù)據(jù)項稱為共用體成員。,由于共享的特性,只有最新存儲的數(shù)據(jù)是有效的。,2020/4/25,60,union共用體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;};,9.2共用體,9.2.1共用體與共用體類型的定義,共用體類型定義的一般形式:,union為關(guān)鍵字;共用體名是用戶定義的類型標(biāo)識。{}中是組成該共用體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。,2020/4/25,61,例如:unionutype{inti;charch;longl;charc[4];};,9.2共用體,9.2.1共用體與共用體類型的定義,定義了一個unionutype共用體類型,共用體類型定義不分配內(nèi)存空間,只是說明此類型數(shù)據(jù)的組成情況。,2020/4/25,62,9.2共用體,9.2.2共用體變量的定義與初始化,1.共用體變量的定義,利用已定義的共用體類型名定義變量union共用體名變量名表;例如:unionutypeu1,u2;,按照共用體類型的組成,系統(tǒng)為定義的共用體變量分配內(nèi)存單元。共用體變量所占內(nèi)存大小等于共用體中占用內(nèi)存的長度最長的成員。,2020/4/25,63,9.2共用體,9.2.2共用體變量的定義與初始化,1.共用體變量的定義,在定義共用體類型的同時定義變量,例如:unionutype{inti;charch;longl;charc[4];}a,b,c;,union共用體名{成員定義表;}變量名表;,2020/4/25,64,9.2共用體,9.2.2共用體變量的定義與初始化,1.共用體變量的定義,直接定義共用體類型變量,例如:union{inti;charch;longl;charc[4];}a,b,c;,union{成員定義表;}變量名表;,2020/4/25,65,9.2共用體,9.2.2共用體變量的定義與初始化,2.共用體變量的運算,用sizeof運算符計算共用體變量所占內(nèi)存空間,unionutype{inti;charch;longl;charc[4];}a,b,c;,sizeof(a)的結(jié)果為4sizeof(unionutype)的結(jié)果為4,2020/4/25,66,9.2共用體,9.2.2共用體變量的定義與初始化,2.共用體變量的運算,同類型共用體變量之間的賦值運算,共用體變量之間進行賦值時,系統(tǒng)僅賦當(dāng)前有效成員的值(即最新存儲的數(shù)據(jù))。,unionutype{inti;charch;longl;charc[4];}a,*p=,對共用體變量進行取址運算,2020/4/25,67,9.2共用體,9.2.2共用體變量的定義與初始化,3.共用體變量成員的引用,共用體變量成員的引用有三種形式。,例如:unionu{charu1;intu2;}x,*p=,用共用體變量名的引用形式:x.u1x.u2,用共用體指針變量的引用形式:(*p).u1(*p).u2p->u1p->u2,2020/4/25,68,9.2共用體,9.2.2共用體變量的定義與初始化,4.共用體變量賦初值,【例9.18】共用體變量賦初值。unionu{charu1;intu2;};main(){unionua={0 x9741};printf("1.%c%x\n",a.u1,a.u2);a.u1=a;printf("2.%c%x\n",a.u1,a.u2);},共用體類型變量在定義時只能對第一個成員進行賦初值。由于第一個成員是字符型,用一個字節(jié),所以對于初值0 x9741僅能接受0 x41,初值的高字節(jié)被截去。,,1.A41,2.a61,2020/4/25,69,9.2共用體,9.2.2共用體變量的定義與初始化,main(){union{longn;intk;charc;}un;un.n=0 x12345678;printf("%lx\n",un.n);printf("%x\n",un.k);printf("%x\n",un.c);un.c=A;printf("%ld\n",un.n);printf("%d\n",un.k);printf("%c\n",un.c);},,12345678,5678,78,305419841,22081,A,,2020/4/25,70,enum是關(guān)鍵字;枚舉名和枚舉常量是標(biāo)識符;枚舉常量之間用逗號分隔。,例如:enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumcolor1{blue,green,red};enumflag{false,true};,9.3枚舉類型與類型命名,9.3.1枚舉類型,1.枚舉類型的定義,枚舉類型定義的一般形式:enum枚舉名{枚舉常量取值表};,枚舉是一個具有有限個整型符號常量的集合,這些整型符號常量稱為枚舉常量。每個枚舉類型都必須進行類型的定義,定義時必須將其所有的枚舉常量一一列舉,以便限定此枚舉類型變量的取值范圍。,2020/4/25,71,在枚舉類型中,每個枚舉常量都代表一個整型值。在定義枚舉類型的同時可隱式或顯式地定義枚舉常量所代表的值。,例如:enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};,9.3枚舉類型與類型命名,9.3.1枚舉類型,2.枚舉常量的整型值,隱式定義:按照類型定義時枚舉常量列舉的順序分別代表0、1、2、……等整型值。,0,1,2,3,4,5,6,2020/4/25,72,例如:enumop{plus=43,minus=45,multiply=42,divide=47};enumworkday{Mon=1,Tue,Wed,Thu,Fri};,9.3枚舉類型與類型命名,9.3.1枚舉類型,2.枚舉常量的整型值,顯式定義:在定義類型的同時指定枚舉常量的值,其中如有未指定值的枚舉常量,則根據(jù)前面的枚舉常量的值依次遞增1。,2,3,4,5,2020/4/25,73,例如:enumflagfg;enumcolor1c1;enumcolor2{blank,brown,yellow,white}c2;enum{lightblue,lightgreen,lightred}c3;,9.3枚舉類型與類型命名,9.3.1枚舉類型,3.枚舉變量的定義,枚舉類型變量定義的三種形式:①enum枚舉名枚舉變量名表;②enum枚舉名{枚舉常量取值表}枚舉變量表;③enum{枚舉常量取值表}枚舉變量表;,2020/4/25,74,⑵賦值運算fg=true;c1=red;c2=yellow;c3=lightblue;c3=white;,9.3枚舉類型與類型命名,9.3.1枚舉類型,4.枚舉數(shù)據(jù)的運算,⑴用sizeof運算符計算枚舉變量所占內(nèi)存空間,枚舉變量中存放的是整型值,每個枚舉變量占用2個字節(jié),〤,是enumcolor2類型的枚舉值,2020/4/25,75,⑷取址運算enumcolor2{blank,brown,yellow,white}c2;enumflagfg;printf("%d",fg);,2020/4/25,77,switch(fg){casefalse:printf("false");break;casetrue:printf("true");},9.3枚舉類型與類型命名,9.3.1枚舉類型,5.枚舉數(shù)據(jù)的輸入輸出,⑵枚舉變量的輸出,方法二:利用多分支選擇語句輸出枚舉常量對應(yīng)的字符串。,2020/4/25,78,enumflag{false,true}fg;char*name[]={"false","true"};……fg=true;printf("%s",name[fg]);,9.3枚舉類型與類型命名,9.3.1枚舉類型,5.枚舉數(shù)據(jù)的輸入輸出,⑵枚舉變量的輸出,方法三:依據(jù)枚舉值,運用指針方法輸出對應(yīng)的字符串。,2020/4/25,79,fg=true;printf("%s",fg);,9.3枚舉類型與類型命名,9.3.1枚舉類型,5.枚舉數(shù)據(jù)的輸入輸出,⑵枚舉變量的輸出,枚舉常量是標(biāo)識符,不是字符串,以輸出字符串方式輸出枚舉常量是錯誤的。,〤,2020/4/25,80,9.3枚舉類型與類型命名,9.3.1枚舉類型,【例9.20】編制一個程序。當(dāng)輸入今天的星期序號后,輸出明天是星期幾。enumweekday{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};char*name[8]={"error","Mon","Tue","Wed","Thu","Fri","Sat","Sun"};,2020/4/25,81,9.3枚舉類型與類型命名,9.3.1枚舉類型,main(){enumweekdayd;printf("Inputtoday’snumeral(1-7):");scanf("%d",},2020/4/25,82,9.3枚舉類型與類型命名,9.3.2類型的重新命名,1.為類型名定義別名,為類型名定義別名的一般形式:typedef類型名新類型名或typedef類型定義新類型名,用typedef為已存在的類型名再命名一個新的類型名(即別名)。,typedef是關(guān)鍵字;類型名可以是基本類型、構(gòu)造類型、指針類型或自定義類型名;新類型名是自定義的類型名。,2020/4/25,83,9.3枚舉類型與類型命名,9.3.2類型的重新命名,typedefintCOUNTER;/*定義COUNTER為整型類型名*/typedefstructdate{intyear;intmonth;intday;}DATE;/*定義DATE為structdate結(jié)構(gòu)體類型名*/,新類型名與舊類型名作用相同,并且可同時使用。,inti;與COUNTERi;等價。structdatebirthday;與DATEbirthday;等價。,2020/4/25,84,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,⑴為基本類型命名例如:typedeffloatREAL;REALx,y;/*相當(dāng)于floatx,y;*/,以typedef開頭,加上變量定義的形式,并用新類型名替代變量名。,⑵為數(shù)組類型命名例如:typedefcharCHARR[80];CHARRc,d[4];/*相當(dāng)于charc[80],d[4][80];*/,2020/4/25,85,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,⑶為指針類型命名例如:typedefint*IPOINT;IPOINTip;/*相當(dāng)于int*ip;*/IPOINT*pp;/*相當(dāng)于int**pp;*/,typedefint(*FUNpoint)();FUNpointfunp;/*相當(dāng)于int(*funp)();*/,2020/4/25,86,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,⑷為結(jié)構(gòu)體、共用體類型命名例如:structnode{charc;structnode*next;};typedefstructnodeCHNODE;CHNODE*p;/*相當(dāng)于structnode*p;*/,structCHNODE*p;,〤,- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語言程序設(shè)計 教程 結(jié)構(gòu) 共用
鏈接地址:http://m.kudomayuko.com/p-11494863.html