




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 結(jié)構(gòu)體與共用體,Contents,7.1 結(jié)構(gòu)體,7.2 結(jié)構(gòu)體數(shù)組,7.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,7.4 結(jié)構(gòu)體與鏈表,7.5 共用體,7.6 枚舉,7.7 用typedef定義類型,7.1 結(jié)構(gòu)體,前面已介紹過數(shù)組,它存儲的是一組相同類型的數(shù)據(jù)。但在實際問題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。例如,一個學(xué)生的信息包括學(xué)號、姓名、性別、年齡和成績等。這些數(shù)據(jù)的類型各不相同:姓名為字符型,學(xué)號為整型或字符型,性別為字符型,年齡為整型,成績?yōu)閷嵭?,這顯然不能用一個數(shù)組存放。為了解決這一問題,C語言提供了一種構(gòu)造數(shù)據(jù)類型結(jié)構(gòu)體,它能將不同類型的數(shù)據(jù)存放在一起。,一、結(jié)構(gòu)體類型的定義 s
2、truct 結(jié)構(gòu)體名 成員列表 ; 例如,表示學(xué)生基本信息的結(jié)構(gòu)體類型可定義如下: struct student int num; char name20; char sex; int age; float score; ;,7.1 結(jié)構(gòu)體,二、結(jié)構(gòu)體類型變量的定義 1、先定義結(jié)構(gòu)體再定義變量 struct student ; struct student stu1, stu2; 為了使用方便,可以通過宏定義用一個符號常量來表示一個結(jié)構(gòu)體類型,還可以用typedef來自定義數(shù)據(jù)類型。 #define STUDENT struct student STUDENT int num; ; STUDE
3、NT stu1, stu2;,7.1 結(jié)構(gòu)體,typedef 已有類型名 新類型名; 如:typedef int INTEGER; 則 INTEGER i; 等價于 如:typedef int NUM10; 則 NUM a; 等價于 如:typedef char *STRING; 則 STRING p; 等價于 如:typedef struct int num; STUDENT; STUDENT stu1, stu2;,int i;,int a10;,char *p;,7.1 結(jié)構(gòu)體,由此可見,一個C程序結(jié)構(gòu)一般為: #include /*文件包含處理*/ #define /*宏定義*/ ty
4、pedef struct /*定義結(jié)構(gòu)體類型*/ STUDENT; int max(int x, int y); /*函數(shù)說明*/ main() /*主函數(shù)*/ int max(int x, int y) /*子函數(shù)*/ ,7.1 結(jié)構(gòu)體,注意: (1)結(jié)構(gòu)體類型所占字節(jié)數(shù)=各成員所占字節(jié)數(shù)之和。 (2)如何求結(jié)構(gòu)體類型所占字節(jié)數(shù)? 運算符sizeof求某種數(shù)據(jù)類型所占字節(jié)數(shù)。 如:sizeof(int)=2 sizeof(float)=4 sizeof(struct student)= 2、定義類型同時定義變量 struct student stu1, stu2;,2+20+1+2+4=29
5、,7.1 結(jié)構(gòu)體,3、直接定義結(jié)構(gòu)體類型變量(無結(jié)構(gòu)體名) struct stu1, stu2; 說明: (1)一般采用“先定義類型再定義變量”。 (2)成員名可與程序中的變量同名,但表示的是兩個不同的量。 (3)成員也可以為一個結(jié)構(gòu)體。如: struct date int year; int month; int day; ;,struct student struct date birthday; ;,7.1 結(jié)構(gòu)體,三、結(jié)構(gòu)體變量的初始化 (按順序依次給各成員賦初值) 如:struct student stu=100, “Liu”, M, 19, 95.5; 不能寫成: struct s
6、tudent stu; stu=100, “Liu”, M, 19, 95.5; 說明:C允許對結(jié)構(gòu)體變量進行初始化,但不允許將一組常量通過賦值語句直接賦給一個結(jié)構(gòu)體變量。,7.1 結(jié)構(gòu)體,四、結(jié)構(gòu)體變量的引用 相同類型的結(jié)構(gòu)體變量可相互整體賦值,但一般情況下,不能整體引用,只能對各個成員分別引用。 如: struct student stu1, stu2=100, “Liu”, M, 19, 95.5; stu1=stu2; 如:printf(“ “, stu1); 引用成員方式:結(jié)構(gòu)體變量名成員名 如:printf(“ “, stu1.num, , ); 正確。 注意:若
7、成員本身為一個結(jié)構(gòu)體,則需一級一級展開,只能對最低級的成員進行引用。 如:printf(“ “, stu1.birthday);,正確,錯誤,錯誤,7.1 結(jié)構(gòu)體,printf(“ “, stu1.birthday.year, stu1.birthday.month, stu1.birthday.day); 正確。 【例7-1】設(shè)計一個程序,輸入一個學(xué)生的信息并顯示。 【程序分析】 假設(shè)學(xué)生信息包括:學(xué)號、姓名、性別、年齡和成績,則定義一個結(jié)構(gòu)體類型struct student表示學(xué)生信息。,7.1 結(jié)構(gòu)體,struct student int num; char name20; char s
8、ex; int age; float score; ;,【程序源代碼】 #include stdio.h #include string.h struct student int num; char name20; char sex; int age; float score; main() struct student student1; char ch;float x; printf( input sutdent1 information:n); printf(num name age sex scoren); scanf(%d,7.1 結(jié)構(gòu)體,ch=getchar(); scanf(%c
9、, ,7.1 結(jié)構(gòu)體,結(jié)構(gòu)體數(shù)組是指每個元素為同一結(jié)構(gòu)體類型的數(shù)組。 一、結(jié)構(gòu)體數(shù)組的定義 struct student int num; char name20; char sex; int age; float score; ; struct student stu3; 定義了一個數(shù)組stu,該數(shù)組有3個元素,均為struct student類型,包含5個成員(如圖7-2所示)。,7.2 結(jié)構(gòu)體數(shù)組,7.2 結(jié)構(gòu)體數(shù)組,二、結(jié)構(gòu)體數(shù)組的初始化 如:struct student stu3=100, “Li”, F, 20, 80, 101, “Xiao”, M, 19, 90, 102, “
10、Chen”, M, 18, 95;,【例7-2】求四個學(xué)生的五門課的平均成績并輸出。 【程序分析】 假設(shè)學(xué)生信息包括:學(xué)號、姓名、5門課成績、平均分,則定義一個結(jié)構(gòu)體類型struct chengji表示學(xué)生信息。 struct chengji int num; char name10; float s5; float aver; ; 該題要對4個學(xué)生的信息進行處理,故需定義一個結(jié)構(gòu)體數(shù)組stud4,將4個學(xué)生信息存入。 struct chengji stud = ,;,三、結(jié)構(gòu)體數(shù)組的應(yīng)用,7.2 結(jié)構(gòu)體數(shù)組,求第i個學(xué)生5門課成績(studi.s0,studi.s4)的平均分,賦給studi
11、.aver。 studi.aver=0; for(j=0;j5;j+) studi.aver+=studi.sj; studi.aver/=5.0; 【程序源代碼】 #include”stdio.h” struct chengji int num; char name10; float s5; float aver; ; /*結(jié)構(gòu)體類型定義*/,7.2 結(jié)構(gòu)體數(shù)組,main() int i ,j; struct chengji stud =111, “zhang san”,67,89,76, 54,86,0,105, “l(fā)i si”,87,73,88,75,78,0,109, “wang wu
12、”,79,82,56,64,77,0,107, “zhang na”,60,53,91,75, 65,0; /*結(jié)構(gòu)體數(shù)組定義及初始化*/ for(i=0;i4;i+) for(j=0;j5;j+) studi.aver+=studi.sj; studi.aver/=5.0; printf(“%d % -10s %3.0f %3.0f %3.0f %3.0f %3.0f %5.1f n”,studi.num,, studi.s0, studi.s1, studi.s2, studi.s3,studi.s4, studi.aver); ,7.2 結(jié)構(gòu)體數(shù)組,【例7-3】有三個
13、候選人,10個人投票,每人只能投一個候選人的票,統(tǒng)計三個候選人的總票數(shù)。 【程序分析】 定義一個結(jié)構(gòu)體類型struct person表示候選人信息(包括姓名、票數(shù))。 struct person char name8; int count; ; 定義一個結(jié)構(gòu)體數(shù)組leader3存放3個候選人信息,并進行初始化,首先使票數(shù)都置零。 struct person leader3= ZHANG,0, WANG,0, LI,0;,7.2 結(jié)構(gòu)體數(shù)組,如何統(tǒng)計票數(shù)? 輸入一個被選人的名字(用字符數(shù)組lead_name存放),然后將該名字與3個候選人的名字進行比較,若與某候選人名字(即leaderj.nam
14、e)相同,則該候選人的票數(shù)加1(即leaderj.count+),直至10個人投完票。 【程序源代碼】 #include stdio.h #include string.h struct person char name8; int count; ; main() int i,j; struct person leader3= ZHANG,0, WANG,0, LI,0; char lead_name8;,7.2 結(jié)構(gòu)體數(shù)組,for(i=1;i=10;i+) /*統(tǒng)計票數(shù)*/ scanf(%s,lead_name); for(j=0;j3;j+) if(strcmp(lead_name,lea
15、)=0) leaderj.count+; for(j=0;j3;j+) printf(%8s: %dn,,leaderj.count); ,練習(xí):有3個學(xué)生,每個學(xué)生信息包括:學(xué)號、姓名、三門課成績,請輸入3個學(xué)生的信息并輸出。,7.2 結(jié)構(gòu)體數(shù)組,一、指向結(jié)構(gòu)體變量的指針 如:struct student int num; ; struct student stu=100, “Liu”, M, 98; struct student *p; p=,(*p).num,p-num,7.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,由此可見:結(jié)構(gòu)體成員的引用方式(3種):
16、結(jié)構(gòu)體變量名成員名 (*p)成員名 p-成員名 注意: (*p).num及p-num表示:p所指結(jié)構(gòu)體變量中的成員num 區(qū)分:p-n, p-n+, +p-n,7.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,二、指向結(jié)構(gòu)體數(shù)組的指針 如: struct student int num; char name20; char sex; float score; ; struct student stu3=100, “Li”, F, 80, 101, “Xiao”, M, 90, 102, “Chen”, M, 95; struct student *p=stu;(則p+1指向下一個元素stu1) 通過指針p輸出
17、3個學(xué)生的信息,如何實現(xiàn)? for(; pnum, p-name, p-sex, p-score);,7.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,三、結(jié)構(gòu)體變量作函數(shù)參數(shù) 采取 “值傳遞” ,將實參(各成員)的值傳遞給形參,形參也必須是同類型的結(jié)構(gòu)體變量。 【例7-6】有一個結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號、姓名和3門課程的成績。編程輸出該結(jié)構(gòu)體變量各成員的值。要求定義一個函數(shù)list輸出一個結(jié)構(gòu)體變量的值。 【程序源代碼】 #include stdio.h struct student int num; char name20; float score3; void list(struct studen
18、t stu2) printf(%d,%s,%5.1f,%5.1f,%5.1fn,stu2.num,,stu2.score0,stu2.score1,stu2.score2); ,7.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,main() struct student stu1=1001, LiLin,67.5,89,78; list(stu1);/*調(diào)用list函數(shù)*/ 四、結(jié)構(gòu)體指針作函數(shù)參數(shù) 如:struct student int num; char name20; char sex; float score; ; main() struct student stu3=100, “
19、Li”, F, 80, 101, “Xiao”, M, 90, 102, “Chen”, M, 95; output(stu, 3); ,7.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,void output(struct student *p, int n) /*輸出指針p所指結(jié)構(gòu)體數(shù)組中n個元素的各成員值*/ struct student *p_end=p+n; for(; pnum, p-name, p-sex, p-score); ,7.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,一、鏈表概述 假設(shè)定義這樣一個結(jié)構(gòu)體: struct node int data; struct node *next; /*next
20、是指向該類結(jié)構(gòu)體的指針*/ 再定義3個該類型的結(jié)構(gòu)體變量: NODE n1, n2, n3; 執(zhí)行下列語句: n1.data=10; n2.data=20; n3.data=30; n1.next= n3.next=NULL,typedef NODE;,7.4 結(jié)構(gòu)體與鏈表,通常在鏈表中設(shè)立一個指針head指向第一個結(jié)點,稱為“頭指針”。 當(dāng)head所指鏈表為空時head=NULL,則判鏈表非空的條件是?,使得n1, n2和n3“鏈接”起來(如下圖所示):,我們將這樣的表(通過指針將若干個元素鏈接起來的表)稱為“鏈表”,表中的每一個結(jié)構(gòu)體稱為“結(jié)點”。n2稱為n1的“后繼”結(jié)點,n1稱為n2的
21、“前驅(qū)”結(jié)點。,由此可見,鏈表的每個結(jié)點由兩部分構(gòu)成:數(shù)據(jù)域(data)、指針域(next)。,7.4 結(jié)構(gòu)體與鏈表,二、鏈表的建立 【例7-9】編寫一個創(chuàng)建鏈表的函數(shù):輸入若干學(xué)生的信息存入鏈表中,以學(xué)號為0作為結(jié)束標(biāo)志。 【程序分析】用什么存放這若干學(xué)生的信息?用“數(shù)組”?數(shù)組長度如何確定?可不可以根據(jù)輸入學(xué)生信息的個數(shù)來確定數(shù)組長度?若輸入10個學(xué)生信息,就定義為10,輸入20個,就定義為20? struct student int num; int n=0; scanf(%d%f,7.4 結(jié)構(gòu)體與鏈表,不能。因為C語言中,數(shù)組長度必須預(yù)先定義好,不能動態(tài)定義。如果數(shù)組長度定義得過大則浪
22、費內(nèi)存空間,若過小則不夠用。對于這一類問題(即:用戶所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù)而無法預(yù)先確定),用數(shù)組很難解決。為此,C語言提供了一些動態(tài)分配內(nèi)存空間的函數(shù),稱為“動態(tài)存儲分配函數(shù)”,可以按需要動態(tài)地分配內(nèi)存空間,也可把不再使用的空間回收。,7.4 結(jié)構(gòu)體與鏈表,我們主要介紹2個動態(tài)存儲分配函數(shù): (類型說明符 *)malloc(size) 功能:分配一個長度為size字節(jié)的連續(xù)空間。函數(shù)返回值是一個指針,即該段空間的起始地址。如:char *pc; int *pi; pc=(char *)malloc(100); 或者 pi=(int *)malloc(100); 表示分配100個字
23、節(jié)的內(nèi)存空間,該空間用來存放字符型數(shù)據(jù),函數(shù)返回值強制轉(zhuǎn)換為字符型指針,并將該指針賦給指針變量pc。簡言之,也就是分配一塊大小為100字節(jié)的內(nèi)存空間,用指針pc指向。 free(void *p) 功能:回收(釋放)p所指的內(nèi)存空間。,7.4 結(jié)構(gòu)體與鏈表,【例7-9】建立單鏈表的基本思想:先建立一個空表,再將各結(jié)點逐個插入到表尾。 設(shè)頭指針head,指針p指向當(dāng)前表尾結(jié)點,指針s指向創(chuàng)建的新結(jié)點。 建立一個空表。,p=head=NULL;,7.4 結(jié)構(gòu)體與鏈表,將第1個結(jié)點插入到表尾。 輸入第1個學(xué)生信息 scanf(%d%f,7.4 結(jié)構(gòu)體與鏈表,將其它各結(jié)點插入到表尾。 輸入下一個學(xué)生信息
24、 scanf(%d%f,7.4 結(jié)構(gòu)體與鏈表,將最后一個結(jié)點的next域置空。 p-next=NULL;,7.4 結(jié)構(gòu)體與鏈表,注:可合并在一塊 if(head=NULL) head=s; else p-next=s;,【程序源代碼】 struct student int num; /*學(xué)號*/ float score; /*成績*/ struct student *next; /*指向下一個結(jié)點的指針*/ ; struct student *create() /*創(chuàng)建一個鏈表,返回其頭指針*/ struct student *head,*p,*s; int num; float score;
25、 scanf(%d%f,7.4 結(jié)構(gòu)體與鏈表,while (num!=0) if (head=NULL) head=s; /*若插入第一個結(jié)點*/ else p-next=s; /*若插入其它結(jié)點*/ p=s; /*p指向新的表尾*/ scanf(%d%f, /*返回鏈表的頭指針*/ ,7.4 結(jié)構(gòu)體與鏈表,【例7-10】定義一個函數(shù):輸出頭指針head所指單鏈表中各結(jié)點的值(簡稱為:輸出單鏈表head)。 void print(struct student *head) struct student *p; for(p=head; ; ) printf(%d,%3.1fn,p-num ,p-
26、score ); ,p=p-next,p!=NULL,思考/練習(xí):編程:輸入若干學(xué)生的信息存入鏈表中并輸出,以學(xué)號為0作為結(jié)束標(biāo)志。,7.4 結(jié)構(gòu)體與鏈表,三、鏈表的插入 在*p后插入*s 設(shè)p指向鏈表中某結(jié)點,s指向待插入的新結(jié)點,將*s插入到*p的后面,插入操作如下圖所示。 注意:兩個指針的操作順序不能交換。,s-next=p-next; p-next=s;,7.4 結(jié)構(gòu)體與鏈表,在*p前插入*s 先找到*p的前驅(qū)*q,再插入。,設(shè)鏈表頭指針為head,操作如下: q=head; while ( ) q=q-next; /*找*p的直接前驅(qū)*/ s-next=q-next; q-next=
27、s;,q-next!=p,7.4 結(jié)構(gòu)體與鏈表,由此可見: 在鏈表上進行插入操作,必須首先找到插入位置的前一個結(jié)點。 鏈表的插入,通常是先修改待插結(jié)點*s的next指針,再修改插入位置的前一個結(jié)點的next指針。,【例7-11】已有一個學(xué)生鏈表,各結(jié)點是按照學(xué)號(num)由小到大順序排列的。編寫一個插入函數(shù)insert,插入一個新生的結(jié)點,要求插入后的鏈表依然有序。 【程序分析】 設(shè)s指向待插入結(jié)點(即新生結(jié)點),p指向?qū)W生鏈表的第一個結(jié)點(即第一個學(xué)生),從第一個結(jié)點開始,不斷將p所指結(jié)點的成員num(學(xué)號)與s所指結(jié)點的成員num(學(xué)號)進行比較,若s-num大于p-num,則移動p指針,
28、指向下一個結(jié)點,繼續(xù)比較,直到s-nump-num為止或者p指向尾結(jié)點之后結(jié)束。這時找到了插入位置,將*s插入到*p的前面,而鏈表的插入需要找到插入位置的前一個結(jié)點,所以還需找到*p的前驅(qū),用q指向。,7.4 結(jié)構(gòu)體與鏈表,注意兩種特殊情況:一是鏈表為空,二是s-num第一個結(jié)點的成員num,這兩種情況都需要修改頭指針。 【程序源代碼】 struct student *insert(struct student *head,struct student *s) /*將s所指新生的結(jié)點插入到head所指的學(xué)生鏈表中,插入后使得該鏈表仍然有序,函數(shù)返回插入后的鏈表頭指針*/ struct stud
29、ent *p,*q; if(head=NULL|s-numnum) /*表空或待插結(jié)點第一個結(jié)點時*/ s-next=head;head=s;return; q=head;p=q-next; /*q指向第一個結(jié)點,p指向第二個結(jié)點,即q指向*p的前驅(qū)*/,7.4 結(jié)構(gòu)體與鏈表,while(p!=NULL ,7.4 結(jié)構(gòu)體與鏈表,q=head; while (q-next!=p) q=q-next; /*找*p的直接前驅(qū)*/ q-next=p-next; free(p);,四、鏈表的刪除 設(shè)p指向鏈表中某結(jié)點,刪除*p,操作如下: 先找到*p的前驅(qū)*q,再刪除。,7.4 結(jié)構(gòu)體與鏈表,由此可見:
30、在鏈表上進行刪除操作,必須先找到刪除位置的前一個結(jié)點。,【例7-12】編寫一個刪除函數(shù)del,刪除鏈表中指定學(xué)號所在的結(jié)點。 【程序分析】 設(shè)p指向?qū)W生鏈表的第一個結(jié)點,從第一個結(jié)點開始,不斷將p所指結(jié)點的成員num(學(xué)號)與指定學(xué)號num進行比較,若p-num不等于num,則移動p指針,指向下一個結(jié)點,繼續(xù)比較,直到p-num = num為止或者p指向尾結(jié)點之后結(jié)束。這時找到了待刪除結(jié)點,即*p,而鏈表的刪除需要找到刪除位置的前一個結(jié)點,所以還需找到*p的前驅(qū),用q指向。 注意3種特殊情況:一是鏈表為空時不能刪除;二是找到的待刪結(jié)點是第一個結(jié)點,這時需要修改頭指針;三是待刪結(jié)點不存在。,7.
31、4 結(jié)構(gòu)體與鏈表,【程序源代碼】 struct student *del(struct student *head,int num) /*在head所指的學(xué)生鏈表中刪除其學(xué)號等于num的結(jié)點,返回刪除后的鏈表頭指針*/ struct student *p,*q; if (head=NULL) /*如果是空鏈表*/ printf(“List is nulln”);return(head); p=head; while(p!=NULL ,7.4 結(jié)構(gòu)體與鏈表,練習(xí): 在一個單鏈表中,已知q所指結(jié)點是p所指結(jié)點的前驅(qū),若在*q和*p之間插入s所指結(jié)點,則執(zhí)行_。 A. s-next=p-next;
32、p-next=s; B. p-next=s-next; s-next=p; C. q-next=s; s-next=p; D. p-next=s; s-next=q; 在一個單鏈表中,若刪除p所指結(jié)點的后繼結(jié)點,則執(zhí)行_。 A. p=p-next-next; B. p=p-next; p-next=p-next-next; C. p-next=p-next; D. p-next=p-next-next;,7.4 結(jié)構(gòu)體與鏈表,五、鏈表的應(yīng)用舉例 【例7-13】編寫一個函數(shù):將鏈表L中的元素逆置,逆置前表中元素為(a1,a2,an),逆置后表中元素為(an,a2,a1)。要求用原有結(jié)點,不能重新
33、申請結(jié)點。,7.4 結(jié)構(gòu)體與鏈表,【程序分析】 設(shè)指針p指向表中各結(jié)點,設(shè)指針s指向待插入結(jié)點。首先讓p指向第一個結(jié)點,接著將表L置空,即L=NULL;然后讓s指向*p作為當(dāng)前待插入結(jié)點,p指向下一個結(jié)點,并將*s插入到,L的表頭,接著再讓s指向*p作為當(dāng)前待插入結(jié)點,直到p指向表尾之后,即p為空結(jié)束。此時得到的就是一個逆置的鏈表。 【程序源代碼】 struct node *invert(struct node *L) /*將鏈表L中的元素逆置,逆置后返回頭指針*/ struct node *p,*s; p=L; L=NULL; while(p!=NULL) s=p; p=p-next; /*
34、將*p作為當(dāng)前待插結(jié)點,用s指向,p指向下一個結(jié)點*/ s-next=L; L=s; /*將*s插入到表頭*/ return( L ); ,7.4 結(jié)構(gòu)體與鏈表,【例7-14】將兩個遞增有序的鏈表A、B,歸并成一個遞增有序的單鏈表C,要求用A、B中的原結(jié)點形成,不能重新申請結(jié)點。 如:A=(3,5,8,11) B=(2,6,9,15,20) 歸并后:C=(2,3,5,6,8,9,11,15,20) 【程序分析】 設(shè)指針t指向C表的表尾。先建立一個空表C,即C=t=NULL;再依次比較A、B表中的相應(yīng)元素,將較小者插入到C的表尾,得到的C表則為遞增有序的。 設(shè)三個指針變量p, q和s,其中p,
35、q分別指向A、B表中某個結(jié)點,s指向當(dāng)前待插結(jié)點。若p-datadata,則讓s指向p所,7.4 結(jié)構(gòu)體與鏈表,指結(jié)點作為當(dāng)前待插結(jié)點,并將p指向A的下一個結(jié)點;否則,讓s指向*q作為當(dāng)前待插結(jié)點,并將q指向B的下一個結(jié)點。接著將待插結(jié)點*s插入到C的表尾,然后繼續(xù)比較p-data與q-data,直到其中一個表歸并完。最后將另一個表的剩余部分鏈接到C的表尾。 【程序源代碼】 struct node *merge(struct node *A, struct node *B) /*將兩個遞增有序的鏈表A、B歸并成一個遞增有序的鏈表C,函數(shù)返回C表頭指針*/ struct node *C,*t,*
36、p,*q,*s; p=A; q=B;/*p,q分別指向A,B表中第一個結(jié)點*/ C=t=NULL;/*建立一個空表C*/,7.4 結(jié)構(gòu)體與鏈表,while(p!=NULL ,7.4 結(jié)構(gòu)體與鏈表,一、共用體類型的定義 如:union data int a; float b; char c6; ; 二、共用體變量的定義 1、定義(類似“結(jié)構(gòu)體”,也有3種) 如:union data ; union data udata;,7.5 共用體,2、共用體與結(jié)構(gòu)體的區(qū)別 (1)結(jié)構(gòu)體中各成員占用連續(xù)的不同的內(nèi)存單元,而共用體中各成員占用相同的內(nèi)存單元(故稱為“共用體”多個不同類型的數(shù)據(jù)共同占用同一內(nèi)存單
37、元)。 (2)結(jié)構(gòu)體類型的長度等于各成員長度之和,而共用體類型的長度等于最長成員的長度。如: struct data int a; float b; char c6; a;,union data int a; float b; char c6; b;,問: a占?字節(jié),b占?字節(jié)。 12 6,7.5 共用體,三、共用體變量的引用 1、不能整體引用共用體變量,只能引用成員。 2、不允許對共用體變量進行初始化,每次只能給一個成員賦值。 如: union data int a; float b; char c6; udata=10,85.5, “jsj”; 錯誤。 如:udata.a=10; uda
38、ta.b=85.5; strcpy(udata.c, “jsj”);,如: union data udata; udata =10,85.5, “jsj”; 錯誤。,正確。,7.5 共用體,共用體變量的特點: (1)共用體變量的地址和它各成員的地址相同。 (2)共用體變量不能整體賦值,不能整體輸入輸出。 (3)在共用體變量所占內(nèi)存空間中,任一時刻只能存放其中的一個成員,而不是同時存放所有成員。即任一時刻只有一個成員有效,也就是說共用體變量的所有成員不是同時都存在和有效。 如:union data int i; char ch; float fa; a.i=1; a.ch=A; a.f=3.5;
39、 則:printf(“%d, %c, %fn”, a.i, a.ch, a.f); printf(“%fn”, a.f);,問:此時,哪個成員有效? a.f有效,a.i和a.ch均無意義。,錯誤。,正確。,7.5 共用體,【例7-15】設(shè)有一個教師與學(xué)生通用的表格,教師數(shù)據(jù)有姓名,年齡,職業(yè),教研室四項。學(xué)生有姓名,年齡,職業(yè),班級四項。編程輸入人員數(shù)據(jù),再以表格輸出。 【程序分析】 根據(jù)題意,每個人員信息包含4項,故定義一個結(jié)構(gòu)體類型struct person包含4個成員,其中,“職業(yè)”一項可用“t”表示教師,用“s”表示學(xué)生,故“職業(yè)”定義成字符型;而“單位”這一項學(xué)生應(yīng)填入班級編號,教師
40、應(yīng)填入教研室名,班級編號可用整型表示,教研室名只能用字符型數(shù)組存放。,7.5 共用體,也就是說,此時“單位”這一項中包含了兩種不同類型的數(shù)據(jù),而且這兩種數(shù)據(jù)不可能同時存在,要么填入的是班級編號,要么填入的是教研室名,故需將其定義為共用體類型。類型定義如下: struct person char name10; int age; char job; /*職業(yè)*/ union int class; /*班級編號*/ char office10; /*教研室名*/ depa; /*單位*/ ;,7.5 共用體,struct person body2; /*定義結(jié)構(gòu)體數(shù)組存放兩個人員信息*/ 如果輸入(輸出)的人員是學(xué)生(即bodyi.job=s),則輸入班級編號存入bodyi.depa.class中;否則輸入教研室名存入bodyi.depa.office中。如下所示: if(bodyi.job=s) scanf(%d,7.5 共用體,main() struct person body2; int i; for(i=0;i2;i+) /*輸入*/ printf(input name,age,job and departmentn); scanf(%s %d %c, ,7.5 共用體,for(i=0;i2;i+) /*輸出*/ if(bodyi.job
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電機相關(guān)主題名稱再次續(xù)篇考核試卷
- 灌溉自動化系統(tǒng)在精準(zhǔn)灌溉中的應(yīng)用考核試卷
- 果蔬產(chǎn)品質(zhì)量分級與包裝規(guī)范考核試卷
- 工藝品與收藏品綜合知識競賽考核試卷
- 電子寵物智能穿戴技術(shù)考核試卷
- 皮革制品行業(yè)的市場渠道與銷售網(wǎng)絡(luò)考核試卷
- 文具用品行業(yè)環(huán)保材料研發(fā)與應(yīng)用考核試卷
- 《垂暮腐朽與閉關(guān)鎖國》明清時期課件-1
- 2025屆山西省大學(xué)附屬中學(xué)高三第一次高考模擬考試數(shù)學(xué)試題試卷
- 2025一月份智能倉儲系統(tǒng)對接購銷協(xié)議技術(shù)條款
- 學(xué)習(xí)通《《詩經(jīng)》導(dǎo)讀》習(xí)題(含答案)
- 2025-2030智能代步車產(chǎn)業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 《10 水培綠蘿》(教案)-2024-2025學(xué)年三年級上冊勞動人教版
- 2025屆廣東省燕博園聯(lián)考(CAT)高三下學(xué)期3月模擬測試物理試題(含答案)
- 2025年常州工程職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試題庫及參考答案
- 華陽煤礦考試試題及答案
- 2025民法典婚姻家庭編司法解釋二解讀
- 2025年中國鐵路投資集團有限公司招聘(28人)筆試參考題庫附帶答案詳解
- 八項規(guī)定試題及答案
- 江蘇省蘇州市2023-2024學(xué)年五年級下學(xué)期期中綜合測試數(shù)學(xué)試卷(蘇教版)
- 《思想道德與法治》 課件 第四章 明確價值要求 踐行價值準(zhǔn)則
評論
0/150
提交評論