《C語言程序設計》第8章結構體、共用體與枚舉類型.ppt
《《C語言程序設計》第8章結構體、共用體與枚舉類型.ppt》由會員分享,可在線閱讀,更多相關《《C語言程序設計》第8章結構體、共用體與枚舉類型.ppt(45頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第8章結構體、共用體與枚舉類型,本章要求:理解結構體類型的概念,掌握結構體變量的定義和使用掌握結構體數(shù)組、結構體指針的定義和使用理解共用體的概念,掌握共用體變量的定義和使用了解枚舉數(shù)據(jù)類型及自定義數(shù)據(jù)類型的使用理解鏈表的概念,初步掌握動態(tài)鏈表的常見操作本章重點:結構體變量的定義和使用鏈表的概念本章難點:動態(tài)鏈表的常見操作,8.1結構體類型與結構體變量,8.1.1結構體概述數(shù)組是一種簡單構造類型數(shù)據(jù),數(shù)組中的各元素是屬于同一個類型的。但在實際問題中,常會遇到這樣一類數(shù)據(jù),它由多個類型不相同的數(shù)據(jù)項組成。學生基本情況:學號、姓名、性別、年齡、成績結構體(structure)是一種數(shù)據(jù)類型。C語言本身沒有提供具體的結構體類型,但提供了說明結構體類型的方法。,8.1.2結構體的聲明,聲明結構體類型的一般形式:struct結構體名類型標識符成員名;類型標識符成員名;.;,成員類型可以是基本型或構造型,struct關鍵字,不能省略,合法標識符可省:無名結構體,structstudentintnum;charname20;charsex;intage;,8.1.3結構體變量的定義,定義好一個結構體類型后,我們可以將其看作是和int、char、float等數(shù)據(jù)類型一樣的一個新的數(shù)據(jù)類型。1.先定義結構體類型,再定義結構體變量,struct結構體名類型標識符成員名;類型標識符成員名;.;struct結構體名變量名表列;,structstudentintnum;charname20;charsex;intage;structstudenta,b;,intx;,a,structstudentt;,可多次使用structstudent來定義變量,2.定義結構體類型的同時定義結構體變量,struct結構體名類型標識符成員名;類型標識符成員名;.變量名表列;,structstudentintnum;charname20;charsex;intage;a,b;,3.直接定義結構體變量,structstudentt;,用無名結構體直接定義變量只能一次,8.1.4結構體變量的引用格式,引用規(guī)則:結構體變量不能整體引用,只能引用變量成員引用方式:結構體變量名.成員名,structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;,printf(“%d,%s,%c,%d,%f,%sn”,stu1);stu1=101,“WanLin”,M,19,87.5,“DaLian”;,結構體嵌套,structdateintmonth;intday;intyear;,structpersoncharname20;charsex;structdatebirthday;,若有定義:structpersonperson1;,合法:person1.sex=F;person1.birthday.day=35;,同類型結構體變量間的整體賦值,及變量的初始化,structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,stu1=101,“WanLin”,M,19,87.5,“DaLian”;,stu1=stu2;,初始化:structstudentstua=101,“WanLin”,M,19,87.5,“DaLian”;,=111,“Tom”,M,19,60,“USA”;,8.1.6指向結構體的指針,指向結構體變量的指針的值是該結構體變量所分配的存儲區(qū)域的首地址。結構指針變量的定義,structstudentintnum;charname20;charsex;intage;stu;structstudent*p=,stu,通過指針訪問結構體變量的成員,結構變量名.成員名(名字引用);結構指針-成員名(指針引用);(*結構指針).成員名(將指針轉(zhuǎn)化為名字引用);,structstudentintnum;charname20;charsex;intage;stu;structstudent*p=,stu.age=8;p-age=8;(*p).age=8;,stu,8.2結構體數(shù)組,8.2.1結構體數(shù)組的定義(三種形式),structstudentintnum;charname20;charsex;intage;structstudentstu2;,stu2;,8.2.2結構體數(shù)組的初始化,例如:structstudentintnum;charname20;charsex;intage;structstudentstu=100,“HeLin”,M,20,101,“LiGang”,M,19,110,“LiuYan”,F,19;,引用方式:結構體數(shù)組名下標.成員名,stu0.age=8;printf(“%s”,stu1.name);,8.2.3指向結構體數(shù)組的指針,structstudentintnum;charname20;charsex;intage;structstudentstu9;structstudent*p=stu;,改寫數(shù)組輸出例子,8.3結構體與函數(shù),已知:structstudentstu1,stu10,*p=stu;用結構體變量的成員作參數(shù)-值傳遞函數(shù)聲明:voidfunc(intx);函數(shù)調(diào)用:func(stu1.age);用指向結構體指針變量或數(shù)組的指針作參數(shù)-地址傳遞或st函數(shù)聲明:voidfunc(structstudent*st);函數(shù)調(diào)用:func(stu);或func(p);用結構體變量作參數(shù)-多值傳遞(效率低)函數(shù)聲明:voidfunc(structstudentz);函數(shù)調(diào)用:func(stu1);,編寫:已知5個學生的信息表,包括學號、姓名、性別、年齡。編寫函數(shù)find1,找制定學號的學生姓名。在主函數(shù)中輸入學生學號,調(diào)用find1函數(shù)查找學生信息。編寫函數(shù)find2,找制定姓名的學生信息。在主函數(shù)中輸入學生姓名,調(diào)用find2函數(shù)查找學生信息。,用一個結構體的指針作為find2函數(shù)的返回值,8.4共用體,共用體(也叫聯(lián)合體)是構造數(shù)據(jù)類型,使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋)1.聲明結構體類型的一般形式:union共用體名類型標識符成員名;類型標識符成員名;.;,uniondatainti;charch;floatf;,uniondatainti;charch;floatf;uniondataa;,a,1B,2B,4B,i,ch,f,共用體變量任何時刻-只有一個成員存在共用體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)共用體變量的定義形式有三種(類似結構體變量的定義),2.共用體變量引用(類似結構體變量),uniondatainti;charch;floatf;a,b,d5,*p=d;,a.ia.cha.fp-ip-chp-f(*p).i(*p).ch(*p).fd0.id0.chd0.f,結構體與共用體,區(qū)別:存儲方式不同聯(lián)系:兩者可相互嵌套,變量的各成員同時存在,任一時刻只有一個成員存在,例,8.5枚舉類型,枚舉類型就是將變量可能出現(xiàn)的值放在一起而形成的一個整型常量的集合類型。限制在此集合內(nèi),變量只能取這個集合中的某個值。1枚舉類型的定義:enum枚舉類型名取值表;例enumweekdaysSun,Mon,Tue,Wed,Thu,Fri,Sat;2枚舉變量的定義與結構變量類似(1)間接定義例如,enumweekdaysworkday;(2)直接定義例如,enumSun,Mon,Tue,Wed,Thu,Fri,Satworkday;,3說明,(1)枚舉型僅適應于取值有限的數(shù)據(jù)。(2)取值表中的值稱為枚舉元素,枚舉元素是常量。在編譯器中,按定義的順序取值0、1、2、.。所以枚舉元素可以進行比較,比較規(guī)則是:序號大者為大。例如,上例中的Sun=0、Mon=1、Sat=6,所以MonSun、Sat最大。(3)枚舉元素的值也是可以人為改變的:定義時由程序指定。例如,如果enumweekdaysSun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;則Sun=,Mon=,從Tue=2開始,依次增。,例,8.6typedef的使用,功能:用自定義名字為已有數(shù)據(jù)類型命名簡單形式:typedeftypenewname;,類型定義語句關鍵字,已有數(shù)據(jù)類型名,用戶定義的類型名,例typedefintINTEGER;typedeffloatREAL;,typedef沒有創(chuàng)造新數(shù)據(jù)類型。typedef是編譯時處理為已有類型命名,#define是預編譯時處理時簡單字符置換。,typedef定義類型步驟:,按定義變量方法先寫出定義體,如inti;將變量名換成新類型名,如intINTEGER;他最前面加typedef,如typedefintINTEGER;用新類型名定義變量,如INTEGERi,j;,例:,inta100;intARRAY100;,typedefintARRAY100;,ARRAYa,8.7動態(tài)數(shù)據(jù)結構鏈表,8.7.1鏈表的提出數(shù)組:在內(nèi)存中占用連續(xù)存儲的空間。插入,刪除操作需要移動多個元素。鏈表是動態(tài)的進行存儲分配,鏈表的各個結點在邏輯上是連續(xù)的,但是在內(nèi)存中存儲時不占用連續(xù)的空間。鏈表的使用能有效的避免存儲空間的浪費和數(shù)據(jù)移動的問題。,8.7.2鏈表的基本結構,鏈表是一種常用的、能夠?qū)崿F(xiàn)動態(tài)存儲分配的數(shù)據(jù)結構。頭指針變量head指向鏈表的首結點。每個結點一般由2個域組成:數(shù)據(jù)域存儲結點本身的信息。指針域指向后繼結點的指針。尾結點的指針域置為“NULL(空)”,作為鏈表結束標志,8.7.3鏈表結點的定義,structstudentintnum;floatscore;structstudent*next;,一個結點,單向鏈表,8.7.4單向鏈表的訪問,1.輸出鏈表各個結點的數(shù)據(jù),voidprint_link(structstudent*head)structstudent*p;p=head;while(p!=NULL)printf(“%d,%6.1fn”,p-num,p-score);p=p-next;,2.統(tǒng)計鏈表的長度,voidlen_link(structstudent*head)intn=0;structstudent*p=head;while(p!=NULL)n+;p=p-next;return(n);,8.7.5動態(tài)存儲空間的建立和釋放,1動態(tài)存儲空間的建立malloc函數(shù),其函數(shù)原型為:void*malloc(unsignedintsize);其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。sizeof(type)運算符計算所給數(shù)據(jù)類型type的字節(jié)數(shù),主要用來計算鏈表中結點所占動態(tài)存儲空間的字節(jié)數(shù)。,p=(structstudent*)malloc(sizeof(structstudent);,calloc函數(shù),其函數(shù)原型為:void*calloc(unsignedn,unsignedsize);其作用是在內(nèi)存的動態(tài)區(qū)存儲中分配n個長度為size的連續(xù)空間。2.動態(tài)存儲空間的釋放free函數(shù),其函數(shù)原型為:voidfree(void*p);其作用是釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。p是調(diào)用calloc或malloc函數(shù)時返回的值。,p=(structstudent*)malloc(sizeof(structstudent);,free(p);,8.7.6動態(tài)鏈表的建立,建立鏈表主要步驟:先設三個指針變量:head、p1、p2,它們都是用來指向structstudent類型數(shù)據(jù)的。structstudent*head=NULL,*p1,*p2;head:頭指針變量,指向鏈表第一個結點,作函數(shù)返回值。p1:指向新申請的結點。p2:指向鏈表的尾結點,在將新結點連接到鏈表末尾時需要。,結點,2.malloc函數(shù)開辟第一個結點,并使head和p2都指向它。head=p2=(structstudent*)malloc(sizeof(structstudent);scanf(%d%f,3.再用malloc函數(shù)開辟另一個結點并使p1指向它,接著輸入該結點的數(shù)據(jù),并與上一結點相連,且使p2指向新建立的結點。建立新結點:p1=(structstudent*)malloc(sizeof(structstudent);scanf(%d%f,p1,使新結點與上一結點連接:p2-next=p1;使p2指向新鏈結點:p2=p1;,p2,p2,重復第3步的,建立更多結點:p1=(structstudent*)malloc(sizeof(structstudent);scanf(%d%f,head,1002,87,p1,p2,p1,p1,p2,p2,4.給末結點的指針域賦值NULLp2-next=NULL;,NULL,structstudent*create(intn)inti;structstudent*head=NULL,*p1,*p2;head=p2=(structstudent*)malloc(LEN);scanf(%d%f,#defineLENsizeof(structstudent),1.,2.,3.,4.,8.7.7鏈表的刪除操作,刪除首結點使p1指向第一個結點,用以下語句實現(xiàn)刪除首結點操作。p1=head;head=p1-next;free(p1);,p1,刪除其它結點刪除鏈表的中間結點通過將下一結點地址賦給前一結點地址來實現(xiàn),即將要刪除的p1結點的后繼地址,放入前一結點p2的地址域,同時釋放p1結點。p2-next=p1-next;free(p1);,head,8.7.8鏈表的插入操作,先設四個指針變量:head:要插入鏈表的頭指針。p0:指向要插入的結點。p1:指向當前結點。p2:指向前一結點。,四種情況:,原鏈表為空表,即head=NULL時,用以下語句實現(xiàn)插入操作:head=p0;p0-next=NULL;,NULL,head,NULL,無p1、p2,在頭結點之前插入,若p1=head,表示插入結點在頭結點之前。用以下語句實現(xiàn)插入操作:head=p0;p0-next=p1,head,p0,p1,無p2,在中間插入,表示在在非頭結點之前,非尾節(jié)點之后插入結點,用以下語句實現(xiàn)插入操作:p2-next=p0;p0-next=p1;,head,p0,尾節(jié)點之后插入,用以下語句實現(xiàn)插入操作:p2-next=p0;p0-next=NULL;,head,p0,p1為NULL可理解為無p1,NULL,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- C語言程序設計 語言程序設計 結構 共用 枚舉 類型
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.szxfmmzy.com/p-11498711.html