歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > PPT文檔下載  

C語言程序設(shè)計教程第9章結(jié)構(gòu)體與共用體.ppt

  • 資源ID:11494863       資源大?。?span id="vdtxw6x" class="font-tahoma">542.50KB        全文頁數(shù):86頁
  • 資源格式: PPT        下載積分:14.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要14.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

C語言程序設(shè)計教程第9章結(jié)構(gòu)體與共用體.ppt

1,第9章結(jié)構(gòu)體與共用體,北京科技大學計算機系,C語言程序設(shè)計,2020/4/25,2,第9章結(jié)構(gòu)體與共用體,9.1結(jié)構(gòu)體9.2共用體9.3枚舉類型與類型命名,2020/4/25,3,一個學生的信息有學號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關(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)體名是用戶定義的類型標識。中是組成該結(jié)構(gòu)體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。,2020/4/25,5,例如圖書類型的定義:structbookcardcharnum10;/*圖書分類編號是字符數(shù)組類型*/charname30;/*書名是字符數(shù)組類型*/charauthor30;/*作者是字符數(shù)組類型*/charpublisher60;/*出版社是字符數(shù)組類型*/floatprice;/*價格是單精度實型*/intn;/*庫存量是整型*/;,例如學生類型的定義:structstudentcharnum8;/*學號是字符數(shù)組類型*/charname30;/*姓名是字符數(shù)組類型*/charsex;/*性別是字符型*/intage;/*年齡是整型*/charaddr60;/*住址是字符數(shù)組類型*/intscore6;/*成績是整型數(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)體名變量名表;例如:structbookcardbook1100;structstudents30,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)中的成員,可以單獨使用,它的作用與地位相當于普通變量。成員名可與程序中的變量名相同時,也可與不同結(jié)構(gòu)體類型的成員名相同,二者代表不同的對象。,structdateintyear,month,day;structstudentcharnum8;charname30;charsex;structdatebirthday;/*成員為結(jié)構(gòu)體類型*/charaddr60;intscore6;,2020/4/25,8,9.1結(jié)構(gòu)體,9.1.2結(jié)構(gòu)體變量的定義與初始化,1.結(jié)構(gòu)體類型變量的定義,在定義結(jié)構(gòu)體類型的同時定義變量,例如:structstudentcharnum8,name20,sex;intage;floatscore;st30;,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)體類型變量,例如:structcharnum8,name20,sex;intage;floatscore;st30,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)體變量的初始化。structdateintyear,month,day;structstudentcharnum8,name20,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ù)組的初始化。structscharnum8,name20,sex;floatscore;stu3="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)存空間,structdateintyear,month,day;structstudentcharnum8,name20,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)賦值。,structdateintyear,month,day;structstudentcharnum8,name20,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)體變量進行取址運算,structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a;,對結(jié)構(gòu)體變量a進行;structstudentcharnum8,name20,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)計選票的程序。structcandidatecharname20;/*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("Entervoten");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)體指針輸出一組化學元素名稱及其原子量。structlistinti;charname4;floatw;tab4=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("NotNametAtomicWeightn");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é)果的影響。structcodeinti;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("%dt",+p->i);printf("%ct",(+p)->c);printf("%dt",(p+)->i);printf("%ct",+p->c);printf("%dt",p->i+);printf("%dn",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】編制一個復數(shù)乘法函數(shù),采用值傳遞的方法傳送數(shù)據(jù)。structcomplex/*定義存放復數(shù)的結(jié)構(gòu)體類型*/floatre;/*re成員用于存放復數(shù)的實部*/floatim;/*im成員用于存放復數(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+%fin",z.re,z.im);/*以復數(shù)形式輸出*/,2020/4/25,31,9.1結(jié)構(gòu)體,9.1.4函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞,【例9.10】編制一個復數(shù)乘法函數(shù),采用傳遞指針的方法達到傳送數(shù)據(jù)的目的。structcomplexfloatre,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ù)中的目標變量。這樣實參與形參之間的數(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ù)的存取操作則相對復雜。,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ù)的,依靠指針將它們連接起來。,structnodecharc;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標準中,關(guān)鍵字void有兩種用法。第一種用法,可將無返回值的函數(shù)定義為void類型第二種用法,用void*定義指針,這是一個指向非具體數(shù)據(jù)類型的指針,稱為無類型指針。,2020/4/25,35,【例9.11】調(diào)用malloc函數(shù)分配所需存儲單元。#includemain()structstintn;structst*next;*p;p=(structst*)malloc(sizeof(structst);p->n=5;p->next=NULL;printf("p->n=%dtp->next=%xn",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;charname20;h=NULL;printf("name:");gets(name);while(strlen(name)!=0)/*當輸入的姓名不是空串循環(huán)*/p=NEW;/*開辟新結(jié)點*/if(p=NULL)/*p為NULL,新結(jié)點分配失敗*/printf("Allocationfailuren");exit(0);/*結(jié)束程序運行*/,#include#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;structnode*next;,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用鏈表,main()structnode*head;head=create();,2020/4/25,41,【例9.14】輸出學生電話簿鏈表函數(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("%st%sn",p->name,p->tel);p=p->next;,#include#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;structnode*next;,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用鏈表,main()structnode*head;head=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】刪除學生電話簿鏈表中指定學生的信息。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用鏈表,刪除第一個結(jié)點,刪除中間結(jié)點或尾結(jié)點,學生姓名,當姓名不同并且不是尾結(jié)點循環(huán),2020/4/25,45,【例9.15】刪除學生電話簿鏈表中指定學生的信息。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用鏈表,(a)刪除第一個結(jié)點(head=p->next),2020/4/25,46,【例9.15】刪除學生電話簿鏈表中指定學生的信息。,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】刪除學生電話簿鏈表中指定學生的信息。,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)structnodecharname20,tel9;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】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用鏈表,當姓名不同并且不是尾結(jié)點循環(huán),空表時插入結(jié)點,在表尾追加結(jié)點,在表頭插入結(jié)點,在表中間插入結(jié)點,2020/4/25,51,【例9.16】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,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】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,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】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,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;elsep->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)structnodecharname20,tel9;structnode*next;,2020/4/25,55,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用鏈表,【例9.17】學生電話簿鏈表管理程序。,編制此程序可利用例9.13至例9.16的4個函數(shù)完成鏈表的建立、輸出、刪除和插入等功能,這里只需編制一個main函數(shù)完成對這4個函數(shù)的調(diào)用。#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;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;chars80,name20;intc;,2020/4/25,57,9.1結(jié)構(gòu)體,9.1.5結(jié)構(gòu)體的應(yīng)用鏈表,dodoprintf("n*MENU*n");printf("1.Createalistn");printf("2.Printalistn");printf("3.Deleteanoden");printf("4.Insertanoden");printf("0.Quitn");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("nInputanewnoden");printf("name:");gets(stu->name);printf("tel:");gets(stu->tel);stu->next=NULL;printf("nInsertpositionn");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)鍵字;共用體名是用戶定義的類型標識。中是組成該共用體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。,2020/4/25,61,例如:unionutypeinti;charch;longl;charc4;,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.共用體變量的定義,在定義共用體類型的同時定義變量,例如:unionutypeinti;charch;longl;charc4;a,b,c;,union共用體名成員定義表;變量名表;,2020/4/25,64,9.2共用體,9.2.2共用體變量的定義與初始化,1.共用體變量的定義,直接定義共用體類型變量,例如:unioninti;charch;longl;charc4;a,b,c;,union成員定義表;變量名表;,2020/4/25,65,9.2共用體,9.2.2共用體變量的定義與初始化,2.共用體變量的運算,用sizeof運算符計算共用體變量所占內(nèi)存空間,unionutypeinti;charch;longl;charc4;a,b,c;,sizeof(a)的結(jié)果為4sizeof(unionutype)的結(jié)果為4,2020/4/25,66,9.2共用體,9.2.2共用體變量的定義與初始化,2.共用體變量的運算,同類型共用體變量之間的賦值運算,共用體變量之間進行賦值時,系統(tǒng)僅賦當前有效成員的值(即最新存儲的數(shù)據(jù))。,unionutypeinti;charch;longl;charc4;a,*p=,對共用體變量進行取址運算,2020/4/25,67,9.2共用體,9.2.2共用體變量的定義與初始化,3.共用體變量成員的引用,共用體變量成員的引用有三種形式。,例如:unionucharu1;intu2;x,*p=,用共用體變量名的引用形式:x.u1x.u2,用共用體指針變量的引用形式:(*p).u1(*p).u2p->u1p->u2,2020/4/25,68,9.2共用體,9.2.2共用體變量的定義與初始化,4.共用體變量賦初值,【例9.18】共用體變量賦初值。unionucharu1;intu2;main()unionua=0 x9741;printf("1.%c%xn",a.u1,a.u2);a.u1=a;printf("2.%c%xn",a.u1,a.u2);,共用體類型變量在定義時只能對第一個成員進行賦初值。由于第一個成員是字符型,用一個字節(jié),所以對于初值0 x9741僅能接受0 x41,初值的高字節(jié)被截去。,1.A41,2.a61,2020/4/25,69,9.2共用體,9.2.2共用體變量的定義與初始化,main()unionlongn;intk;charc;un;un.n=0 x12345678;printf("%lxn",un.n);printf("%xn",un.k);printf("%xn",un.c);un.c=A;printf("%ldn",un.n);printf("%dn",un.k);printf("%cn",un.c);,12345678,5678,78,305419841,22081,A,2020/4/25,70,enum是關(guān)鍵字;枚舉名和枚舉常量是標識符;枚舉常量之間用逗號分隔。,例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;enumcolor1blue,green,red;enumflagfalse,true;,9.3枚舉類型與類型命名,9.3.1枚舉類型,1.枚舉類型的定義,枚舉類型定義的一般形式:enum枚舉名枚舉常量取值表;,枚舉是一個具有有限個整型符號常量的集合,這些整型符號常量稱為枚舉常量。每個枚舉類型都必須進行類型的定義,定義時必須將其所有的枚舉常量一一列舉,以便限定此枚舉類型變量的取值范圍。,2020/4/25,71,在枚舉類型中,每個枚舉常量都代表一個整型值。在定義枚舉類型的同時可隱式或顯式地定義枚舉常量所代表的值。,例如:enumweekdaySun,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,例如:enumopplus=43,minus=45,multiply=42,divide=47;enumworkdayMon=1,Tue,Wed,Thu,Fri;,9.3枚舉類型與類型命名,9.3.1枚舉類型,2.枚舉常量的整型值,顯式定義:在定義類型的同時指定枚舉常量的值,其中如有未指定值的枚舉常量,則根據(jù)前面的枚舉常量的值依次遞增1。,2,3,4,5,2020/4/25,73,例如:enumflagfg;enumcolor1c1;enumcolor2blank,brown,yellow,whitec2;enumlightblue,lightgreen,lightredc3;,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,取址運算enumcolor2blank,brown,yellow,whitec2;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,enumflagfalse,truefg;char*name="false","true"fg=true;printf("%s",namefg);,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ù)的輸入輸出,枚舉變量的輸出,枚舉常量是標識符,不是字符串,以輸出字符串方式輸出枚舉常量是錯誤的。,2020/4/25,80,9.3枚舉類型與類型命名,9.3.1枚舉類型,【例9.20】編制一個程序。當輸入今天的星期序號后,輸出明天是星期幾。enumweekdayMon=1,Tue,Wed,Thu,Fri,Sat,Sun;char*name8="error","Mon","Tue","Wed","Thu","Fri","Sat","Sun",2020/4/25,81,9.3枚舉類型與類型命名,9.3.1枚舉類型,main()enumweekdayd;printf("Inputtodaysnumeral(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為整型類型名*/typedefstructdateintyear;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;/*相當于floatx,y;*/,以typedef開頭,加上變量定義的形式,并用新類型名替代變量名。,為數(shù)組類型命名例如:typedefcharCHARR80;CHARRc,d4;/*相當于charc80,d480;*/,2020/4/25,85,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,為指針類型命名例如:typedefint*IPOINT;IPOINTip;/*相當于int*ip;*/IPOINT*pp;/*相當于int*pp;*/,typedefint(*FUNpoint)();FUNpointfunp;/*相當于int(*funp)();*/,2020/4/25,86,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,為結(jié)構(gòu)體、共用體類型命名例如:structnodecharc;structnode*next;typedefstructnodeCHNODE;CHNODE*p;/*相當于structnode*p;*/,structCHNODE*p;,

注意事項

本文(C語言程序設(shè)計教程第9章結(jié)構(gòu)體與共用體.ppt)為本站會員(max****ui)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!