第8章結構體共用體和枚舉類型-PPT課件_第1頁
第8章結構體共用體和枚舉類型-PPT課件_第2頁
第8章結構體共用體和枚舉類型-PPT課件_第3頁
第8章結構體共用體和枚舉類型-PPT課件_第4頁
第8章結構體共用體和枚舉類型-PPT課件_第5頁
已閱讀5頁,還剩84頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第8章 結構體、共用體和枚舉類型教學目的:通過本章的學習,要求了解結構型、鏈表、共用型和枚舉型數據的特點,熟練掌握結構型的定義方法,結構型變量、數組、指針變量的定義、初始化和成員的引用方法;掌握簡單鏈表的基本操作原理和應用;掌握共用型和枚舉型的定義方法及對應變量的定義與引用;掌握用戶自定義類型的定義和使用。學習本章內容可以為今后學習數據結構中的鏈表創建和使用打下基礎。第8章 結構體、共用體和枚舉類型 教學內容 結構型的引入,很好的處理生活總的各種表格或表格中的記錄結構型的定義,結構型變量的定義、賦值、引用及引用鏈表等方法共用型的定義,共用型變量的定義、賦值、引用枚舉型的定義,共用型變量的定義、

2、賦值、引用第8章 結構體、共用體和枚舉類型重點和難點重點: (1)結構型、共用型、枚舉型數據的特點和定義 (2)結構型變量、數組、指針變量的定義、初始化和成員引用方法 (3)共用型和枚舉型變量的定義和引用方法難點: (1)嵌套的結構型數據的處理 (2)用結構體解決鏈表問題(建立、插入、刪除、輸出和查詢)。 8.1 結構體類型結構型是用戶自己定義的數據類型8.1.1 結構體型的實例 前面我們學習過了基本數據類型,例如:short、long、int 、float、double、char等,這些基本數據類型都是系統已經定義好的,用戶可以直接使用它們。但現實世界是復雜的,在我們的日常生活中有很多的表格

3、,各表格之間又有關聯。因此用戶需要自己定義數據類型,用戶自己定義的數據類型一旦定義好之后,就可以像使用系統類型一樣使用它。例如:對一個新生進行入學登記時,就需要填一張表格,填寫的內容包括姓名、性別、學號、年齡、家庭住址、聯系電話、總分等多個數據項,其中姓名是字符串型(可以用字符數組來表示),性別是字符型(用m表示男性、用f表示女性),年齡是整型,總分是實型。 如圖8-1所示, 這些數據項之間關系緊密,每一個學生通過姓名、性別、學號、年齡、家庭地址、聯系電話、總分等屬性構成一個整體反映一個學生的基本情況。如果將姓名、性別、學號、年齡、家庭地址、聯系電話、總分分別定義為互相獨立的簡單變量,難以反映

4、它們之間的內在聯系。為了方便處理此類數據,常常把這些關系密切但類型不同的數據項組織在一起,即“封裝”起來,并為其取一個名字,在語言中就稱其為結構體(也人稱為構造體),結構體是用戶自定義數據類型的一種。8.1.2 結構體類型的定義結構體類型定義的一般形式struct 結構型名數據類型標識符成員; 數據類型標識符成員; 數據類型標識符成員n; ; 請讀者注意結構體定義語句的右花括號后面用分號(;)做語句結束標記。8.1.2 結構體類型的定義結構體型定義實例例如:為了存放一個人的姓名、性別、年齡、工資,可以定義如下的結構型: struct person char name10; char sex;

5、int age; float wage; ; /*這個名為person的結構型共含有4個成員*/8.1.2 結構體類型的定義 結構型嵌套定義【例8.1】一開始所講的例題中的birthday類型和person類型。 struct birthday /*定義含有3個整型成員的結構型 birthday*/ int year; int month; int day;struct person /*定義含有4個成員的結構型 person*/char name20; char sex; struct birthday bir; /*該成員的數據類型是結構型*/ float wage;8.2.1結構型變量的

6、定義和初始化先定義結構型,后定義變量定義結構型的同時定義變量 定義無名稱的結構型的同時定義變量 8.2 結構體變量的定義和引用 例如:為學生信息定義2個變量x和y , 程序段如下:struct studentlong number; char name20; char sex; float score3;struct student x,y;在定義變量的同時,可以變量賦初值,例如上例中的定義語句可以改寫如下:struct student x=100001L,”Tom”,m,86,94,89, y=100002L,”Lucy”,f,78,88,45;1. 先定義結構型,后定義變量 2. 定義結構

7、型的同時定義變量例如:為學生信息定義2個變量x和y , 并給他們賦初值,程序段如下:struct studentlong number; char name10; char sex; float score3;x=100001L,”Tom”,m,86,94,89, y=100002L,”Lucy”,f,78,88,45,;這種方法是將類型定義和變量定義同時進行。以后仍然可以使用這種結構型來定義其它的變量。 3. 定義無名稱的結構型的同時定義變量例如:為學生信息定義2個變量x和y ,并給它們賦初值,程序段如下:structlong number; char name10; char sex; f

8、loat score3;x=100001L,”Tom”,m,86,94,89, y=100002L,”Lucy”,f,78,88,45,;這種方法是將類型定義和變量定義同時進行,但結構型的名稱省略,以后將無法使用這種結構型來定義其它變量,建議盡量少用。 8.2.2 結構型變量成員的引用1.結構型變量成員的引用方法2.結構型變量成員地址的引用方法3.結構型變量地址的引用方法1. 結構型變量成員的引用方法結構型變量成員的引用格式如下:結構型變量名. 成員名 其中的“.”稱為成員運算符,其運算級別是最高的,和圓括號運算符“()”、下標運算符“”是同級別的,運算順序是自左向右。如果某個結構型變量的成員

9、數據類型又是一個結構型,則其成員的引用方法如下:外層結構型變量. 外層成員名. 內層成員名結構型變量成員的引用實例【例8.2】求Tom的三門課程的成績總分,并在顯示器顯示出來(使用結構型變量成員的引用)。 #include”string.h” struct student long number; char name10; char sex; float score3; ; main() struct student stu1; /*定義student類型的變量stu1*/ stu1.number=100001L; /*給結構型變量stu1的成員number賦值*/ strcpy(stu1.n

10、ame;”Tom”); /*給結構型變量stu1的成員name賦值*/ stu1.sex=f; /*給結構型變量stu1的成員sex賦值*/ stu1.score0=89; /*給結構型變量stu1的成員score賦值*/ stu1.score1=91; stu1.score2=86; printf(“%s的總分是:%fn”,,stu1.score0+stu1.score1+stu1.score2); 2. 結構型變量成員地址的引用方法結構型的變量成員地址引用格式如下: &結構型的變量名.成員名存放結構型變量成員地址的指針變量類型必須和該成員的類型相同。【例8.4】結構型變量成

11、員地址引用。 #include “string.h” /*程序中使用了字符串處理函數*/ sturct student2 /*定義student2結構型*/ long number; char name10; main() struct student2 x; /*定義student2類型的變量x*/ long *p_number; /*定義能指向結構型student成員number的指針變量*/ char *p_name; /*定義能指向結構型student成員namer的指針變量*/ p_number=&x.number; /*讓指針變量指向結構型變量x的成員*/ *p_ number=1

12、00001L; /*用指針變量給結構型變量x的所有成員賦值*/ strucpy(p_ name,”zhongxin”); printf(“number=%1d name=%sn”,*p_number,*p_ name); /*用指針變量輸出結構型變量x所有成員的值*/ 從這個例子可以看出,使用指向結構型變量成員的指針變量來引用成員的方法比較繁瑣,可以直接使用結構型變量的指針成員來引用成員。具體使用方法請參看第8章8.4節。3. 結構型變量地址的引用方法 結構型變量地址的引用格式如下: &結構型變量名 例如:借用例8.4中的結構型struct student2: struct student2

13、y,*sty=&y;存放結構型變量地址的指針變量必須是類型相同的結構型指針,關于如何使用結構型變量地址的例子請參見8.4節中介紹的指向結構型數據的指針變量。8.3 結構型數組的定義和引用 在實際應用中,我們經常要處理的是具有 相同數據結構的一個群體。比如一批書,所有員工的通信地址,一個班級的學生等。由相同結構類型變量組成的數組,稱為結構型數組。例如,全班有40人,在總成績單上每人占一行,每行的內容包括學號、姓名、3門功課的成績、平均分、名次,這樣一個總成績單就可以用結構型數組表示。8.3.1 結構型數組的定義和初始化1.先定義結構型,然后再定義結構型數組并賦初值 2.定義結構型的同時定義數組并

14、賦初值 3.定義無名稱的結構型的同時定義數組并賦初值 1.先定義結構型,再定義結構型數組并賦初值運算 struct student /*定義結構型*/ long number; char name10; char sex; float score3; ; struct student s3= 200001L,”Tom”,m,78,86,92 , 200002L,”Lucy”,f,85,69,82 , 200003L,”Jack”,m,84,88,96 ;2. 定義結構型的同時定義數組并賦初值 struct student /*定義結構型*/long number;char name10;cha

15、r sex;float score3;s3= 200001L,”Tom”,m,78,86,92 , 200002L,”Lucy”,f,85,69,82 , 200003L,”Jack”,m,84,88,96 ;3. 定義無名稱的結構型的同時定義數組并賦初值 struct /*定義結構型*/long number;char name10;char sex;float score3;s3= 200001L,”Tom”,m,78,86,92 , 200002L,”Lucy”,f,85,69,82 , 200003L,”Jack”,m,84,88,96 ;8.3.2 結構型數組元素成員的引用1.結構型

16、數組元素的引用格式如下; 結構型數組名下標 . 成員名2.結構型數組元素成員地址的引用格式如下: &結構型數組名下標.成員名1. 結構型數組元素的引用:結構型數組名下標 . 成員名【例8.5】輸入3個學生的數據,每個學生的信息由學號、姓名和三門功課的成績組成,然后計算每一個學生的總分,并輸出總分最高的學生信息。分析:將3個學生定義為結構型類型數組,學號為長整型、成績為實型數組,總分存在成績數組中。#define N 3struct student /*定義結構型*/ long number; char name10; float scoreN+1; /*score數組前三個元素用來存放成績,第

17、四個元素用來存 放總分*/ stuN; main() float max=0;int i,j,max_i=0;for(i=0;iN;i+)printf(“輸入第%d個學生的信息,依次輸入學號,姓名,三個成績,各數據之間用,隔開”,i);scanf(“%ld,%s,%f,%f,%f”, ,&stui.number,&,&stui.score0, &stui.score1, &stui.score2);stui.score3=stui.score0+ stui.score1+ stui.score2;if (max成員名 方式1比較好理解,其中“*指針變量”就代表了它所指向的結構

18、型變量,利用“成員運算符”來引用,其作用相當于“結構型變量.成員名”。需要注意的是“*指針變量”必須用圓括號括住,因為“*”運算符的級別低于“.”運算符,如果不加括號,則優先處理“.”運算符,將出現“指針變量.成員名”,會造成語法錯誤。 方式2是一種新的引用方法,其中“-”稱為“指向成員運算符”,也簡稱“指向運算符”。其運算級別和“()”、“”、“.”是同級的。指向運算符的左邊必須是已指向某個結構型變量或數組元素的指針變量,其右邊必須是對應結構型數據的成員名。8.4.2 指向結構型數組的指針1.指針變量指向數組元素 如果一個結構型數組元素的地址已賦予相同結構型指針變量(即指針變量指向結構型數組

19、元素),可以使用下列兩種方法來引用數組該元素的成員,其作用完全相同。 方式1 (*指針變量)。成員名 方式2 指針變量-成員名 注意:這里的指針變量必須是指向某個數組元素的。例如,它指向的數組元素為“數組名k”,則上述兩種引用方式均代表“數組名k。成員名”。2.指針變量指向數組首地址 當一個結構型數組的首地址已經賦予相同結構型的指針變量(即指針變量指向結構型數組),可以使用下列兩種方式來引用下標為i的數組元素成員,其作用完全相同。 方式1(*(指針變量+i).成員名 方式2(指針變量+i) 成員名 注意:這里的指針變量必須是指向某個數組首地址的,則上述兩種引用方式均代表“數組名i。成員名8.4

20、.3 在函數間傳遞結構型數據1. 采用“全局外部變量方式傳遞數據” 2. 采用“返回值方式傳遞數據” 3. 采用“形式參數和實際參數結合的地址傳遞方式雙向傳遞數據” 8.5 用指針處理鏈表 我們知道用數組存放數據時,必須事先定義好數組的大小,不能在程序中隨便進行調整。比如有的班有100人,有的班只有30人,如果要用同一個數組先后存放不同班級的學生數據,則必須定義長度為100的數組。如果事先難以確定一個班的最多人數,則必須把數組定義的足夠大,以存放任何班級的學生數據,這顯然非常浪費存儲空間。為此C語言提供了動態數組的構建,即鏈表。8.5.1 什么是鏈表 鏈表如同一條鐵鏈一樣,一環扣一環,中間是不

21、能斷開的。這好比幼兒園的老師帶領孩子出去玩,老師牽著第一個孩子的手,第一個孩子的另一只手牽著第二個孩子的手這就是一個“鏈”,最后一個孩子有一只手空著,他就是“鏈尾”。要找這個隊伍,就必須先找到老師,然后順序找到每一個孩子。 鏈表是一種動態數據結構,在程序的執行過程中可以根據需要隨時間系統申請存儲空間,動態地進行存儲空間的分配。動態數據結構最顯著的特點是包含的數據對象個數及其相互關系都可以按需要改變。常用的動態數據結構有鏈表、循環鏈表、雙向鏈表三種。本章只介紹動態數據結構中最簡單的單鏈表的建立及其基本操作。1.單鏈表的結構 鏈表有一個“頭指針”head,它存放鏈表第一個結點的首地址,它沒有數據,

22、只是一個指針變量。從圖8-2中我們看到它指向鏈表的第一個元素。鏈表的每一個元素稱為一個“結點”(node)。每個結點都分為兩個域,一個是數據域,存放各種實際的數據,如學號num、姓名name、性別sex、和成績score等。另一個域為指針域,存放下一個結點的首地址,即指向下一個結點。鏈表中的每一個結點都是同一個結構類型。最后一個結點稱為“鏈尾”,尾結點無后續點,因此不指向其他的元素,表尾結點的指針為空(NULL)。 2.鏈表結點的構成 由于每個結點包含數據域或者指針域兩部分內容,所以鏈表結點采用結構體表示。例如鏈表結點的數據結構定義如下:struct node int num; char na

23、me10; float score; struct node *next; 在鏈表結構中,除了數據項成員之外,還應包含一個指向本身的指針,該指針在使用時指向具有相同類型結構體的下一個結點。 在鏈表結點的數據結構中,比較特殊的一點就是結構體內指針域的數據類型使用了未定義成功的數據類型。這是在C語言中唯一可以先使用后定義的數據結構。3.如何建立和輸出一個簡單靜態鏈表 【例 8.10】建立一個如圖8-3所示的簡單鏈表,它由三個學生數據結點組成。請輸出各結點中的數據。分析:為方便操作,將學生定義為一個結構體類型student,它有三個成員分別用來表示學生的學號、姓名和下一個結點的地址。在程序中逐個輸入

24、各學生的數據,通過地址賦值操作建立鏈表。利用當型循環用printf語句逐個輸出個結點中成員的值。程序如下:#includestruct student char no6; char name10; struct student *next;void main() struct student A=“02019”,”tom”, B=“02019”,”jane”, C=“02019”,”henry”; struct srudent *head=NULL,*p; head=&A;A.next=&B;B.next=&C;C.next=NULL;p=head;while (p!=NULL) printf

25、(“No:%stName:%sn”,p-no,p-name); p=p-next;在本例中,所有結點都是在程序中定義的、不是臨時開辟的、用完后也不能釋放,我們把這種鏈表稱為“靜態鏈表”4動態存儲分配函數所謂“動態鏈表”就是鏈表的結構是動態分配和存儲的,在程序的執行過程中要根據需要隨時向系統申請存儲空間,動態地進行存儲空間的分配。在C語言中,提供了一下函數完成存儲空間的動態分配和釋放。malloc函數calloc函數free函數malloc函數其函數原型為:void * malloc(unsigned size) 其作用是在內存的動態存儲區中分配一個長度為size的連續空間,并返回指向該空間起始

26、地址的指針。若分配失敗(如系統不能提供所需內存),則返回空指針NULL。calloc函數其函數原型為:void * calloc(unsigned n,unsigned size) 該函數有兩個形參n和size。其作用是在內存的動態存儲區中分配n個長度為size的連續空間,并返回指向該空間首地址的指針。如用calloc(20,20)可以開辟20個(每個大小為20字節)的空間,即空間總長為400字節。若分配失敗,則返回空指針NULL。free函數其函數原型為:void * free(void * ptr)其作用是釋放由malloc、calloc等函數申請的內存空間,使這部分內存區能夠被其他變量所

27、使用。ptr是最近一次調用malloc()或calloc()函數返回的值。Free函數沒有返回值。在使用上述函數時要注意,函數的原型在文件malloc.h和stdlib.h中定義。在程序中必須包含這兩個頭文件。下面的程序就是malloc()和free()兩個函數配合使用的簡單實例。【例 8.11】存儲空間的動態分配。#include#include#includemain() char *str; if(str=(char*) malloc(10)=NULL) printf(“Not enough memory to allocate buffern”);exit(1);strcpy(str,

28、”welcome”);printf(“String is %sn”,str);free(str); 本例中首先用malloc函數向內存申請一塊內存區,并把首地址賦予指針變量str,是str指向該區域。最后用free函數釋放str指向的內存空間。整個程序包含了申請內存空間、使用內存空間、釋放內存空間三個步驟,實現存儲空間的動態分配。8.5.2 動態鏈表的基本操作鏈表有五種基本操作:建立插入刪除輸出查找1.單鏈表的創建建立動態鏈表就是建立結點空間、輸入各結點數據和進行結點鏈接的過程,也就是在程序執行過程中從無到有地建立起一個鏈表。通過以下實例來說明如何建立一個動態鏈表。 【例 8.12】建立一個鏈

29、表存放學生數據。為簡單起見,我們假定學生數據結構中有學號和年齡兩項。編寫一個建立鏈表的函數creat。創建單鏈表的算法單鏈表創建過程分析創建單鏈表實例程序清單#define LEN sizeof(struct stu)sruct stu /*結構stu定義為外部類型,方便程序中的各個函數使用*/ int num; int age; struct stu *next;struct stu *creat(void)/*creat函數用語動態建立一個有n個結點的鏈表,返回與結點相同類型的指針*/ struct stu *p1,*p2,*head;/*head為頭指針,p2指向已建鏈表的最后一個結點,

30、p1始終指向當前新開辟的結點*/ int n=0; p1=p2=(struct stu *) malloc(LEN);/*申請新結點,長度與stu長度相等;同時使指針變量p1、p2指向新結點*/ scanf (“%d %d”,&p1-num,&p1-page); /*輸入結點的值*/ head=NULL; while (p1-num!=0) /*輸入結點的數值不為0*/ n+; if(n=1)head=p1; /*輸入的結點為第一個新結點即空表,將輸入的結點數據接入表頭*/ else p2-next=p1;/*非空表即輸入的結點不是第一個結點,將輸入的結點數據接到表尾*/p2=p1;p1=(s

31、truct stu *)malloc(LEN); /*申請下一個新結點*/scanf(“%d %d”,&p1-num,&p1-page);p2-next=NULL;return(head); /*返回鏈表的頭指針*/建立鏈表的具體步驟(1)定義鏈表的數據結構。(2)創建一個空表。(3)利用malloc()函數向系統申請分配一個結點。(4)若是空表,則將新結點接到表頭;若是非空表,則將新結點接到表尾。(5)判斷一下是否有后續結點要接入鏈表,若有則轉到步驟(3),否則結束。2.單鏈表的插入 鏈表的插入是指將一個結點插入到一個已有的鏈表中。 【例 8.13】以前面建立的動態鏈表為例,編寫一個函數,使

32、其能夠在鏈表中指定的位置插入一個結點。單鏈表插入實例分析要在一個鏈表的指定位置插入結點,要求鏈表本身必須已按某種規律進行了排序。例如學生數據鏈表中,各結點的成員項按學號由小到大順序排列。如果要求按學號順序插入一個結點,則要將插入的結點依次與鏈表中各結點比較,尋找插入位置。結點可以插在表頭、表中、表尾。結點插入存在以下幾種情況。1. 如果原表是空表,只需使鏈表的頭指針head指向被插結點。2. 如果被插結點值最小,則應插入第一個結點之前。將頭指針head指向被插結點,被插結點的指針域指向原來的第一個結點。3. 如果在鏈表中某位置插入,使插入位置的前一結點的指針域指向被插結點,使被插結點的指針域指

33、向插入位置的后一個結點。4. 如果被插結點值最大,則在表尾插入,使原表尾結點指針域指向被插結點,被插結點指針域置為NULL。單鏈表插入實例圖形分析單鏈表插入實例操作步驟單鏈表插入實例程序清單struct stu *insert (struct stu *head,struct stu *p1) struct stu *p2,*p3; p2=head; if(head=NULL) /*空表插入*/ head=p1; p1-next=NULL;else while (p1-nump2-num)&(p2-next!=NULL) p3=p2; p2=p2-next; /*找插入位置*/if ( p1-

34、numnum) if (head=p2) head=p1; /*在第一結點之前插入*/ else p3-next=p1; /*在其他位置插入*/ p1-next=p2; else p2-next=p1;p1-next=NULL; /*在表末插入*/ return head; /*返回鏈表的頭指針*/鏈表插入操作的具體步驟定義一個指針變量p1指向被插結點。首先判斷鏈表是否為空,為空則使head指向被插結點。鏈表若不是空,用當型循環查找插入位置。找到插入位置后判斷是否在第一個結點之前插入,若是則使head指向被插入結點,被插結點指針域指向原第一結點;否則在其他位置插入;若插入的結點大于表中所有結點

35、,則在表末插入。函數返回值為鏈表的頭指針。3.單鏈表的刪除 鏈表中不再使用的數據,可以將其從表中刪除并釋放其所占用的空間,但注意在刪除結點的過程中不能破壞鏈表的結構。【例 8.14】以前面建立的動態鏈表為例,編寫一個刪除鏈表中指定結點的函數delete1。單鏈表的刪除實例分析假設鏈表按學生的學號排列,當某結點的學號與指定值相同時,將該結點從鏈表中刪除。首先從頭到尾依次查找鏈表中給結點,并與各結點的學生學號做比較,若相同,則查找成功,否則,找不到結點。由于結點在鏈表中可以有三種不同位置:位于開頭,中間或結尾,因此從鏈表中刪除一個結點主要分兩種情況,即刪除鏈表頭結點和非表頭結點。1. 如果被刪除的

36、結點是表頭結點,使head指向第二個結點。2. 如果被刪除的結點不是表頭結點,使被刪結點的前一結點指向被刪結點的后一結點。單鏈表的刪除實例圖形分析單鏈表 的刪除實例操作步驟單鏈表的刪除實例程序清單struct stu * delete ( struct stu *head,int num) /*以head為頭指針刪除num所在結點*/ struct stu *p1,*p2; if (head=NULL) /*如為空表,輸出提示信息*/ printf(“nempty list!n”); goto end;p1=head;while ( p1-num!=num & p1-next!=NULL)/*

37、當不是要刪除的結點,而且也不是最后一個結點時,繼續循環*/p2=p1;p1=p1-next; /*p2指向當前結點,p1指向下一結點*/if (p1-num=num) if (p1=head) head=p1-next;/*如找到被刪結點,且為第一結點,則使head指向第二結點,否則使p2所指結點的指針指向下一結點*/else p2-next=p1-next;free(p1);printf (“ The node is deletedn”); else printf (“The node not been found!n”); end: return (head);鏈表刪除操作的具體步驟 定義

38、一個指針變量p指向鏈表的頭結點。用循環從頭到尾依次查找鏈表中各結點并與各結點的學生學號做比較,若相同,則查找成功退出循環。判斷該結點是否為表頭結點,如果是使head指向第二個結點,如果不是使被刪結點的前一結點指向被刪結點的后一結點。同時結點個數減1。4.單鏈表的輸出 鏈表的輸出比較簡單,只要將鏈表中的各個結點數據依次輸出即可 【例 8.15】編寫一個輸出鏈表的函數print。設立一個指針變量p,先指向鏈表的頭結點,輸出該結點的數據域,然后使指針p指向下一個結點,重復上述工作,直到鏈表尾部。具體算法如圖8-9所示。 單鏈表的輸出實例程序清單#define LEN sizeof (struct s

39、tu)struct stu int num; int age; struct stu *next;void print ( struct stu *head) /*print函數用于輸出以head為頭的鏈表各結點的值*/ struct stu *p; p=head; /*取得鏈表的頭指針*/ while (p!=NULL) printf ( “%6d%6d”,p-num,p-page); /*輸出鏈表結點的值*/p=p-next; /*使指針變量p指向下一個結點,跟蹤鏈表增長*/鏈表輸出操作的具體步驟定義一個指針變量p。使p指向鏈表的頭結點。若是非空表,輸出該結點的數據域;若空表則退出。使指針

40、p指向下一個結點。重復上述操作直到鏈表尾部。鏈表綜合實例【例 8.16】在前面學習的建立鏈表,輸出鏈表,刪除結點,插入結點操作的基礎上,試編一主函數將以上的建立鏈表,輸出鏈表,刪除結點,插入結點的函數組織在一起,并輸出全部結點的值。綜合實例程序清單#define NULL 0main () struct stu *head; struct stu *stu; int del_num; printf (“input records:n”); head=creat(); /*建立鏈表,并返回表頭*/ print (head); /*輸出鏈表 */ printf (“nInput the delet

41、ed number:”); scanf (“%d”,&del_num);綜合實例程序清單(續)while (del_num!=0) head=delete1 (head,del_num); /*從鏈表中刪除del_num結點*/print (head); /*輸出鏈表 */ printf (“nInput the deleted number:”); scanf (“%d”,&del_num);printf (“nInput the inserted record:”);stu=(struct stu *)malloc(LEN);scanf (“%d,%d”,&stu-num,&stu-age

42、);while (stu-num!=0) head=insert (head,stu); /*在鏈表中插入一節結點stu*/ print (head); /*輸出鏈表 */ printf (“nInput the inserted record:”); stu=( struct student *)malloc (LEN); scanf (“%d,%d”,&stu-num,&stu-age); free (stu) /*對于num=0的結點,未插入,應刪除其空間*/8.6 共 用 型共用型和結構型的比較8.6.1 共用型的定義union共用型名 數據類型1 成員名1; 數據類型2 成員名2;

43、數據類型n 成員名n; ;注意在右花括號的后面有一個語句結束符分號。共用型的定義實例例如:為了節省內存,可以將不同的三個數組定義在一個共用型中,總計可節省300個單元: union c_i_f char c1100; /*該成員占用100個單元*/ int i2100; /*該成員占用200個單元*/ float f3100; /*該成員占用400個單元*/ ; /*該共用型數據共用400個單元*/需要提醒讀者注意的是,共用型數據中每個成員所占用的內存單元都是連續的,而且都是從分配的連續內存單元中第一個內存單元開始存放的。所以,對共用型數據來說,所有成員的首地址都是相同的。這是共用型數據的一個

44、特點。8.6.2 共用型變量的定義定義方法基本上與結構型相同,也存在以下三種方法,但不能在定義時進行初始化。1. 先定義共用型,然后定義變量與數組。2. 定義共用型的同時定義變量與數組3. 定義無名稱的共用型同時定義變量與數組 1.先定義共用型,然后定義變量u1與數組u25。union u int i_a10; /*該成員占用20個單元*/ char c_a34; /*該成員占用12個單元*/ long l; /*該成員占用4個單元*/ double d; /*該成員占用8個單元*/; /*該共用型數據共占用20個單元*/union u u1,u25;2.定義共用型的同時定義變量u1與數組u2

45、5 union u int i_a10; /*該成員占用20個單元*/ char c_a34; /*該成員占用12個單元*/ long l; /*該成員占用4個單元*/ double d; /*該成員占用8個單元*/ u1,u25; 3. 定義無名稱的共用型同時定義變量u1與數組u25 union /*無名稱*/int i_a10; /*該成員占用20個單元*/ char c_a34; /*該成員占用12個單元*/ long l; /*該成員占用4個單元*/ double d; /*該成員占用8個單元*/ u1,u25; 8.6.3 共用型變量的引用共用型變量或數組元素成員的引用格式如下: 共

46、用型變量名.成員名共用型變量成員地址的引用和指針變量的使用格式如下: 指針變量=&共用型變量名.成員名共用型變量地址的引用和指針變量的使用格式如下: 指針變量=&共用型變量名8.7 枚舉型顧名思義,就是把有限的數據一一例舉出來,例如:一個星期7天性別只有”男”和”女” 中國有23個省,5個自治區,4個直轄市,2個特別行政區等。如下圖:在填寫用戶資料中的所在城市時,把中國的23個省,5個自治區,4個直轄市,2個特別行政區都列舉出來,供注冊者選擇,這樣有利于數據的規范且不會出錯。枚舉型和結構型、共用型一樣,也是一種用戶自定義的數據類型,在使用時必須先定義后使用。8.7.1 枚舉型的定義enum 枚

47、舉型名 枚舉常量1,枚舉常量2,枚舉常量n;注意在右花括號的后面有一個語句結束符分號。其中:枚舉型名是用戶取的標識符; 枚舉常量是用戶給常量取的標識符。該語句定義了一個名為“枚舉型名”的枚舉類型,該枚舉型中含有n個枚舉常量,每個枚舉型常量均有值。C語言規定枚舉常量的值依次等于0、1、2、n-1.枚舉型定義實例例如:定義一個表示星期的枚舉型: enum week sun,mon,tue,wed,thu,fri,sat; 定義的這個枚舉型共有7個枚舉常量,它們的值依次為0、1、2、3、4、5、6。 C語言規定,在定義枚舉型時,可以給枚舉常量賦初值,方法是在枚舉常量的后面跟上“=整型常量”。例如:表示三原色的枚舉型可定義如下: enum color1 red=2,yellow=4,blue=7; 則枚舉常量red的值為2,yellow的值為4,blue的值為7。8.7.2 枚舉型變量的定義當某個枚舉型定義后,可以用這種枚舉型來定義變量、數組。定義的方法有三種。1. 先定義枚舉型,后定義枚舉型變量、數組enum colorred,yellow,blue;enum color color_1,color_22; /*定義一個枚舉型變量

溫馨提示

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

最新文檔

評論

0/150

提交評論