c10結(jié)構體、共用體及枚舉類型.ppt_第1頁
c10結(jié)構體、共用體及枚舉類型.ppt_第2頁
c10結(jié)構體、共用體及枚舉類型.ppt_第3頁
c10結(jié)構體、共用體及枚舉類型.ppt_第4頁
c10結(jié)構體、共用體及枚舉類型.ppt_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、C語言程序設計,第10章 結(jié)構體、共同體與枚舉類型,問題:實際應用中,通常會將相關的不同類型的數(shù)據(jù)項組成一個有機的整體,這些數(shù)據(jù)項在計算機中如何表示?,學生登錄信息 學生成績表,這些數(shù)據(jù)的特點是: 1、有多項不同類型數(shù)據(jù)組成 2、各項數(shù)據(jù)占用空間大小有可能不同 C語言為了表示這種數(shù)據(jù),定義了一種數(shù)據(jù)結(jié)構:結(jié)構體。,引子,第10章 結(jié)構體、共同體與枚舉類型,本章難點,結(jié)構體類型及變量 結(jié)構體數(shù)組的使用 指針和結(jié)構體 共用體、枚舉、用戶自定義類型,結(jié)構體指針變量的引用 鏈表的建立、插入、刪除、輸出等操作 共用體類型的數(shù)據(jù)特點,本章要點,10.1,10.2,10.3,10.4,10.5,結(jié)構體變量的

2、定義,結(jié)構體變量的引用和初始化,結(jié)構體數(shù)組,結(jié)構體指針變量,結(jié)構體與函數(shù),本章主要內(nèi)容,10.6,10.7,10.8,10.9,10.10,位段結(jié)構體,鏈表,共同體,枚舉類型,用typedef定義類型,本章主要內(nèi)容,結(jié)構體類型定義 結(jié)構體是一種構造數(shù)據(jù)類型 一個“結(jié)構體”類型由若干“成員”組成,每一個成員可以是一個基本數(shù)據(jù)類型或者是一個結(jié)構體類型。 結(jié)構體類型定義,struct 結(jié)構體名 類型標識符 成員名; 類型標識符 成員名; . ;,成員類型可以是 基本型或構造型,struct是關鍵字, 不能省略,合法標識符 可省:無名結(jié)構體,10.1 結(jié)構體變量的定義,定義義結(jié)構體類型時,應注意 成員

3、類型可以是除本身結(jié)構體類型之外的任何已有類型,也可以是任何已有類型(包括本身類型在內(nèi))的指針類型,即構成嵌套的結(jié)構。 當一個結(jié)構體類型定義在函數(shù)之外時,它具有全局作用域;若定義在任一對花括號之內(nèi),則具有局部作用域,其作用范圍是所在花括號構成的塊。 結(jié)構體是一種復雜的數(shù)據(jù)類型,是數(shù)目固定、類型不同的若干成員的集合,結(jié)構體類型的定義只是列出了該結(jié)構的組成情況,編譯系統(tǒng)并未因此而分配存儲空間,當定義了結(jié)構體類型的變量或數(shù)組后,編譯系統(tǒng)才會分配存儲空間。 成員名可以與程序中的變量名相同,二者不代表同一個對象。 如果兩個結(jié)構體的成員類型、名稱、個數(shù)相同,但結(jié)構體名不同,也是兩個不同的結(jié)構類型。,例如,可

4、將日期定義為一個結(jié)構體: struct date int month; int day; int year; ;,結(jié)構體變量的定義 先定義結(jié)構體類型,再定義結(jié)構體變量 先定義結(jié)構體類型,再定義結(jié)構體變量 例如 在定義結(jié)構體類型的同時定義結(jié)構體變量 例如 直接定義結(jié)構體變量 例如,struct stu int num; char name20; char sex; int age; float score; struct date birthday; ; struct stu boy1,boy2;,struct stu int num; char name20; char sex; int ag

5、e; float score; struct date birthday; boy1,boy2;,struct int num; char name20; char sex; int age; float score; struct date birthday; boy1,boy2;,本章主要內(nèi)容,10.1,10.2,10.3,10.4,10.5,結(jié)構體變量的定義,結(jié)構體變量的引用和初始化,結(jié)構體數(shù)組,結(jié)構體指針變量,結(jié)構體與函數(shù),結(jié)構體變量的引用 引用方式: 結(jié)構體變量名.成員名 其中點號“.”稱為成員運算符,它在所有的運算符中優(yōu)先級最高。 引用結(jié)構體變量時,應注意以下幾點 不能將一個結(jié)構體

6、變量作為一個整體進行輸入輸出 如果成員本身又是一個結(jié)構體類型,則要用若干個成員運算符逐級找到最低一級的成員才能引用 對成員變量可以像普通變量一樣進行各種運算 可以引用結(jié)構體變量成員的地址,也可以引用結(jié)構體變量的地址,10.2 結(jié)構體變量的引用和初始化,例如,對前面定義的結(jié)構變量boy1和boy2,其成員的引用形式如下。 boy1.num /* 第一個人的學號 */ boy2.sex /* 第二個人的性別 */,結(jié)構體變量的初始化 本例中,對結(jié)構體變量boy1作了初始化賦值,然后把boy1的值整體賦予boy2,最后用printf函數(shù)輸出boy2各成員的值。,例對結(jié)構變量初始化。 #include

7、 main() struct stu int num; char name20; char sex; int age; float score; boy2,boy1=102,Zhang ping,M,20,78.5; boy2=boy1; printf(Number:%dnName:%sn,boy2.num,); printf(Sex:%cnage:%dScore:%4.1fn,boy2.sex,boy2.age,boy2.score); ,運行結(jié)果: Number:102 Name:Zhang ping Sex:M Age:20 Score:78.5,本章主要內(nèi)容,10.1

8、,10.2,10.3,10.4,10.5,結(jié)構體變量的定義,結(jié)構體變量的引用和初始化,結(jié)構體數(shù)組,結(jié)構體指針變量,結(jié)構體與函數(shù),結(jié)構體數(shù)組的定義 結(jié)構體數(shù)組的每一個元素都具有相同的結(jié)構體類型 三種形式:,形式一: struct student int num; char name20; char sex; int age; ; struct student stu2;,形式二: struct student int num; char name20; char sex; int age; stu2;,形式三: struct int num; char name20; char sex; int

9、 age; stu2;,10.3 結(jié)構體數(shù)組,結(jié)構體數(shù)組初始化 一個結(jié)構體數(shù)組的元素相當于一個結(jié)構體變量,引用結(jié)構體數(shù)組元素的一般形式為 結(jié)構體數(shù)組名下標.成員名 例如,#include struct stu int num; char name20; char sex; float score; boy5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58 ; main() int i,c=0; float ave,s=0; for(i=0;

10、i5;i+) s+=boyi.score; if(boyi.score60) c+=1; ave=s/5; printf(average=%fncount=%dn,ave,c); ,運行結(jié)果: average=69.000000 count=2,本章主要內(nèi)容,10.1,10.2,10.3,10.4,10.5,結(jié)構體變量的定義,結(jié)構體變量的引用和初始化,結(jié)構體數(shù)組,結(jié)構體指針變量,結(jié)構體與函數(shù),指向結(jié)構體變量的指針 定義形式:struct 結(jié)構體名 *結(jié)構體指針名; 例如struct stu boy,*pstu; 定義了結(jié)構體變量boy和結(jié)構體指針變量pstu,通過賦值語句可使pstu指向boy

11、, 構體指針可以訪問結(jié)構體變量的各個成員,一般形式為 結(jié)構體指針變量-成員名 運算符“-”的優(yōu)先級比較高,高于算術運算符、關系運算符、邏輯運算符 例如 +pstu-num 等價于 +(pstu-num) 結(jié)構體指針訪問結(jié)構體變量的形式也可以表示為 (*結(jié)構體指針變量).成員名 例如 (*pstu).num 應該注意(*pstu)兩側(cè)的括號不可少,因為成員符“.”的優(yōu)先級高于“*”,10.4 結(jié)構體指針變量,存放結(jié)構體變量在內(nèi)存的起始地址,以下三種形式是等價 結(jié)構體變量名.成員名 (*結(jié)構體指針變量).成員名 結(jié)構體指針變量-成員名,結(jié)構指針變量的引用 #include struct stu i

12、nt num; char name20; char sex; float score; boy=102,Zhang ping,M,78.5,*pstu; main() pstu= ,運行結(jié)果: Number=102 Name= Zhang ping Sex=M Score=78.500000 Number=102 Name= Zhang ping Sex=M Score=78.500000 Number=102 Name= Zhang ping Sex=M Score=78.500000,指向結(jié)構體數(shù)組的指針 普通數(shù)組可以通過指針變量來訪問,同樣,也可以通過結(jié)構體指針訪問結(jié)構體數(shù)組。 例如 p

13、stu=boy;或pstu= pstu就指向了該結(jié)構體數(shù)組的首地址(即第一個元素boy0的地址)。結(jié)構體指針pstu加1則指向下一個元素,用指針變量輸出結(jié)構體數(shù)組。 #include struct stu int num; char name20; char sex; float score; boy5= 101,Zhou ping,M,45, 102,Zhang ping,M,62.5, 103,Liu fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58 ; main() struct stu *ps; printf(NotNamettt

14、SextScoretn); for(ps=boy;psnum,ps-name,ps-sex,ps-score); ,運行結(jié)果: No Name Sex Score 101 Zhou ping M 45.0 102 Zhang ping M 62.5 103 Liu fang F 92.5 104 Cheng ling F 87.0 105 Wang ming M 58.0,本章主要內(nèi)容,10.1,10.2,10.3,10.4,10.5,結(jié)構體變量的定義,結(jié)構體變量的引用和初始化,結(jié)構體數(shù)組,結(jié)構體指針變量,結(jié)構體與函數(shù),結(jié)構體變量作為函數(shù)參數(shù) 結(jié)構體變量的成員可作為函數(shù)的實參,用法和普通變量作

15、實參一樣 例如,10.5 結(jié)構體與函數(shù),顯示學生的基本信息,利用結(jié)構體變量作為函數(shù)參數(shù)編程。 #include #include struct stu int num; char name20; char sex; float score; ; main() void list(struct stu student); struct stu student; student.num=101; strcpy(, Zhou ping); student.sex=M; student.score=45; list(student); void list(struct stu

16、student) printf(Number=%dtName=%sn,student.num,); printf(Sex=%cttScore=%fn,student.sex,student.score); ,運行結(jié)果: Number=101 Name=Zhou ping Sex=M Score=45.000000,返回結(jié)構體類型數(shù)據(jù)的函數(shù) 函數(shù)的返回值可以是整型、實型或指針類型等 例如,顯示學生的基本信息,利用結(jié)構體變量作為函數(shù)參數(shù)編程。輸入數(shù)據(jù)部分用函數(shù)實現(xiàn) #include struct stu int num; char name20; char sex; flo

17、at score; student; main() void list(struct stu student); struct stu newstudent(); student=newstudent(); list(student); void list(struct stu student) printf(Number=%dtName=%sn,student.num,); printf(Sex=%cttScore=%fn,student.sex,student.score); struct stu newstudent() struct stu newstu; sc

18、anf(%d, ,運行結(jié)果: 101Li ping M 76 Number=101 Name=Li ping Sex=M Score=76.000000,結(jié)構體指針作為函數(shù)參數(shù) 結(jié)構體指針作為函數(shù)的參數(shù)時,傳遞的只是地址,從而減少結(jié)構變量作參數(shù)時引起的空間和時間上的開銷 例如,顯示學生的基本信息,利用結(jié)構體指針變量作為函數(shù)參數(shù)編程。 #include struct stu int num; char name20; char sex; float score; ; main() void list(struct stu *student); struct stu student; studen

19、t.num=101; strcpy(, Zhou ping); student.sex=M; student.score=45; list( ,運行結(jié)果: Number=101 Name=Zhou ping Sex=M Score=45.000000,本章主要內(nèi)容,10.6,10.7,10.8,10.9,10.10,位段結(jié)構體,鏈表,共同體,枚舉類型,用typedef定義類型,位段結(jié)構體類型和位段結(jié)構體變量 C語言允許在一個結(jié)構體中以位為單位來指定其成員所占內(nèi)存長度,這種以位為單位的成員稱為“位段”或稱“位域” 定義 例如 位段結(jié)構體變量的定義與結(jié)構體變量定義方式相同

20、位域的引用 一般形式為:位段結(jié)構體變量.位域名 例如,10.6 位段結(jié)構體,struct 位段結(jié)構體名 類型標識符 位域1:位域長度; 類型標識符 位域2:位域長度; . . . 類型標識符 位域n:位域長度; ,struct bs int a:8; int b:2; int c:6; data;,位域的引用 #include main() struct bs unsigned a:1; unsigned b:3; unsigned c:4; bit,*pbit; bit.a=1; bit.b=7; bit.c=15; printf(%d,%d,%dn,bit.a,bit.b,bit.c);

21、pbit= ,運行結(jié)果: 1,7,15 0,3,15,本章主要內(nèi)容,10.6,10.7,10.8,10.9,10.10,位段結(jié)構體,鏈表,共同體,枚舉類型,用typedef定義類型,鏈表概述 概述,是一種數(shù)據(jù)結(jié)構,可以動態(tài)分配內(nèi)存,鏈表由結(jié)點組成,每個結(jié)點有數(shù)據(jù)域和指針域兩個域。 “頭指針”指向第一個元素結(jié)點,指針域指向下一結(jié)點。 結(jié)構定義,如 形式如右圖所示 例如,10.7 鏈表,struct stu int num; char name20; struct stu * next; ,struct stu int num; char name20; struct stu *next; ;,動

22、態(tài)內(nèi)存管理 內(nèi)存空間分配函數(shù)malloc 原型 void * malloc(unsigned int size) 例 float * pc; pc=(float*)malloc(5*sizeof(float); 內(nèi)存空間函數(shù)calloc 原型 void * calloc(unsigned n, unsigned size); 例 pc=(float *)calloc(8,sizeof(float); 釋放內(nèi)存空間函數(shù)free 原型 void free(void * p); 例如,動態(tài)數(shù)組的建立和使用。 #include #include main() float *pf; int i,n; s

23、canf(%d,/*調(diào)用free函數(shù)時,會自動將指針pf的類型轉(zhuǎn)換為void指針類型 */ ,運行結(jié)果: 5 1.100000 2.200000 3.300000 4.400000 5.500000,創(chuàng)建鏈表 讀取數(shù)據(jù); 生成新結(jié)點; 將數(shù)據(jù)存入新結(jié)點; 將新結(jié)點插入到鏈表中。 例如:從鍵盤讀入學生的信息,包括學號、成績,當輸入的學號為0時,表示建立鏈表結(jié)束。 流程圖如圖,#include #include #define LEN sizeof(struct stu)/*LEN為結(jié)構體類型struct stu的長度*/ struct stu int num; float score; stru

24、ct stu *next; ; struct stu *creat() struct stu *head;/* 用于指向鏈表的第一個結(jié)點,即頭指針 */ struct stu *p; /* 用于指向新生成的結(jié)點 */ struct stu *tail;/* 用于指向鏈表的最后一個結(jié)點 */ int x; tail=head=NULL; scanf(%d, ,順序訪問鏈表中的結(jié)點 所謂“訪問”就是對各結(jié)點的數(shù)據(jù)域中的值進行修改、運算、輸出等 例如:編寫函數(shù),順序輸出鏈表中各結(jié)點數(shù)據(jù)域中的內(nèi)容。順序輸出鏈表的算法比較簡單,只需利用一個工作指針(p)從頭到尾依次指向鏈表中的每個結(jié)點,當指針指向某個結(jié)

25、點時,就輸出該節(jié)點數(shù)據(jù)域中的內(nèi)容,直到遇到鏈表結(jié)束標志為止。如果鏈表為空,就輸出提示信息。,void list(struct stu *head) struct stu *p; p=head; if(head!=NULL) printf(The list records are:n); do printf(%dt%5.1fn,p-num,p-score); p=p-next; /* p指針后移 */ while(p!=NULL); else printf(The list is null); main() struct stu *head; head=creat(); list(head);

26、,運行結(jié)果: 101 90 102 89 0 The list records are: 101 90.0 102 89.0,在鏈表中插入結(jié)點 指將一個結(jié)點插入到一個已有鏈表中,因此,創(chuàng)建鏈表的過程,也可以理解為將一個個結(jié)點插入到空鏈表中。 算法過程 輸入數(shù)據(jù) 生成新結(jié)點 將數(shù)據(jù)存入新結(jié)點 在鏈表中尋找第一個大于新結(jié)點學號的結(jié)點 如果鏈表為空,直接插入新結(jié)點,即新結(jié)點為鏈表的唯一的結(jié)點 查找成功,該結(jié)點為鏈表的第一個結(jié)點,將鏈表的頭指針指向新結(jié)點,新結(jié)點的next域指向原來鏈表的第一個結(jié)點,即插到表頭之前 查找成功,該結(jié)點不是鏈表的第一個結(jié)點,將新結(jié)點插入到該結(jié)點之前,即插到表的中間 查找不成

27、功,插入到鏈表末尾的后面 例如:編寫函數(shù),將一個結(jié)點插入到一個已有學生鏈表中,設已有鏈表按學號由小到大順序排列。 程序運行過程,struct stu * insert(struct stu *head,struct stu *stud) struct stu *p0; /* p0指向要插入的新結(jié)點 */ struct stu *p1; /* p1指向鏈表中第一個學號大于新結(jié)點的學號的結(jié)點 */ struct stu *p2; /*p2指向p1的前驅(qū)結(jié)點,即p2的next域指向p1 */ p0=stud; p1=head; if(head=NULL) /* 情況,原來的鏈表為空表 */ head

28、=p0; p0-next=NULL; else while(p1!=NULL) ,運行結(jié)果: 102 95 100 94 101 93 103 99 0 The list records are: 100 94.0 101 93.0 102 95.0 103 99.0,在鏈表中刪除結(jié)點 過程 從p1指向的第一個結(jié)點開始,檢查其數(shù)據(jù)是否等于給定的關鍵字(如學號),如果相等就將該結(jié)點刪除,否則p1后移一個結(jié)點,再如此進行下去,直到遇到表尾為止。 如果刪除的是第一個結(jié)點(由p1指向),例如,刪除學號為100的學生結(jié)點,頭指針指向第二個結(jié)點,操作為:head=p1-next,如圖10-6所示 如果要刪

29、除的不是第一個結(jié)點,例如,刪除學號為102的學生結(jié)點,即讓學號為101的學生結(jié)點(由p2指向)的next指針域指向?qū)W號為103的學生結(jié)點,操作為:p2-next=p1-next,如圖10-7所示 例如:編寫鏈表刪除函數(shù),根據(jù)輸入的學號刪除學生結(jié)點。,struct stu *del(struct stu *head,int num) struct stu *p1; /*p1指向要刪除的結(jié)點*/ struct stu *p2; /*p2指向要刪除的結(jié)點的前驅(qū)結(jié)點*/ if(head=NULL) /*空鏈表*/ printf(The list is NULLn); else p1=head; whi

30、le(p1!=NULL /*輸出鏈表*/ ,運行結(jié)果: 02 95 100 94 101 93 103 99 0 The list records are: 100 94.0 101 93.0 102 95.0 103 99.0 please input the number for deletion:102 delete:102 The list records are: 100 94.0 101 93.0 103 99.0,本章主要內(nèi)容,10.6,10.7,10.8,10.9,10.10,位段結(jié)構體,鏈表,共同體,枚舉類型,用typedef定義類型,共用體類型及其變量的定義 共用體變量中的

31、所有成員占用同一段內(nèi)存空間,共用體又稱為“聯(lián)合體” 共用體類型定義 例如,union 共用體名 類型標識符 成員名; 類型標識符 成員名; . ;,例 union data int i; char ch; float f; ;,類型定義不分配內(nèi)存,10.8 共同體,先定義共用體類型后定義共用體變量 union data int i; char s6; float f; ; union data a,b,c;,同時定義共用體類型和變量 union data int i; char s6; float f; a,b,c;,直接定義共用體變量 union int i; char s6; float

32、f; a,b,c;,共用體變量的定義有三種方式,共用體變量的引用 引用共用體變量成員方式有如下三種 例如 例如,共用體變量名.成員名= 共用體指針變量名-成員名= (*共用體指針變量名).成員名,程序示例 #include #include main() union char a4; struct bt char c1; char c2; char c3; char c4; chs; d; strcpy(d.a,deab); printf(%c,%cn,d.chs.c2, d.chs.c3); ,共用體變量的地址和它的各個成員的地址相同 d的成員a和chs的首地址相同,即a0、a1、a2和a3

33、的地址依次與c1、c2、c3和c4相同 運行結(jié)果: e,a,程序示例 main() union char a; int b; long c; uu; uu.c=0 x12345678; printf(n1:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c); uu.a=0 x61; printf(n2:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c); uu.b=0 x1234; printf(n3:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c); ,1:a=78,b=12345678,c=12345678 2:a=61,b=12345661,c=12

34、345661 3:a=34,b=1234,c=1234,本章主要內(nèi)容,10.6,10.7,10.8,10.9,10.10,位段結(jié)構體,鏈表,共同體,枚舉類型,用typedef定義類型,枚舉類型及變量 枚舉類型是一個采用標識符表示的整型常數(shù)的集合,其定義類似于結(jié)構體類型。 定義 一般形式為 enum 枚舉名 枚舉常量1,枚舉常量2,枚舉常量n ; 其中,enum為關鍵字,表示枚舉;枚舉名是用戶定義的標識符;枚舉常量是用戶定義的有意義的標識符。 例如: enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat,10.9 枚舉類型,枚舉變量的定義 先定義枚舉類型再定義枚舉變量

35、enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat; enum weekday a,b,c; 直接定義枚舉變量 enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sata,b,c; 同時定義枚舉類型和枚舉變量 enum Sun,Mon,Tue,Wed,Thu,Fri,Sata,b,c;,枚舉變量的賦值和使用 只能取其相應枚舉類型所列出的枚舉常量 例如: enum Sun,Mon,Tue,Wed,Thu,Fri,Sata,b,c; a=Sun; /*正確*/ a=Sunday /*錯誤*/ 例如 注意: 能使用賦值語句對枚舉常量標識符賦值 只能把枚舉常量值賦予枚舉變量,不能把枚舉常量所對應的序號直接賦予枚舉變量 枚舉常量不是字符常量也不是字符串常量,使用時不要加單、雙引號 枚舉常量可以進行比較運算,由它們對應的整數(shù)參加

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論