定義結(jié)構(gòu)體類型變量的方法_第1頁(yè)
定義結(jié)構(gòu)體類型變量的方法_第2頁(yè)
定義結(jié)構(gòu)體類型變量的方法_第3頁(yè)
定義結(jié)構(gòu)體類型變量的方法_第4頁(yè)
定義結(jié)構(gòu)體類型變量的方法_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、11.1 概述概述11.2 定義結(jié)構(gòu)體類型變量的方法定義結(jié)構(gòu)體類型變量的方法11.3 結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用11.4 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化11.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組11.6 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針指向結(jié)構(gòu)體類型數(shù)據(jù)的指針11.7 用指針處理鏈表用指針處理鏈表11.8 共用體共用體11.9 枚舉類型枚舉類型11.10 用用typedef定義類型定義類型第十一章第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體與共用體11.1 概述概述 數(shù)據(jù)的基本類型:整、實(shí)、字符。數(shù)據(jù)的基本類型:整、實(shí)、字符。 數(shù)組是構(gòu)造類型:每個(gè)元素為同一類型數(shù)組是構(gòu)造類型:每個(gè)元素為同一類型 有些問題僅用基本類

2、型和數(shù)組來描述是無法實(shí)現(xiàn)的,需要將不有些問題僅用基本類型和數(shù)組來描述是無法實(shí)現(xiàn)的,需要將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體。同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體。 如學(xué)生情況:如學(xué)生情況: numnamesexagescoreaddr整整字符串字符串字符字符整整實(shí)實(shí)字符串字符串11001Zhang xinm1996. 5Shang hai12001Wang lif2098. 5Bei jing這些數(shù)據(jù)類型雖不相同,但它們卻是有機(jī)的整體,若將它們分這些數(shù)據(jù)類型雖不相同,但它們卻是有機(jī)的整體,若將它們分別定義,則難以反映它們之間的內(nèi)在聯(lián)系。別定義,則難以反映它們之間的內(nèi)在聯(lián)系。 在在C語言中,結(jié)構(gòu)體是

3、用戶聲明的一種數(shù)據(jù)類型,一經(jīng)聲明,語言中,結(jié)構(gòu)體是用戶聲明的一種數(shù)據(jù)類型,一經(jīng)聲明,就可用此類型定義相關(guān)的變量。就可用此類型定義相關(guān)的變量。 如上述問題可聲明如下數(shù)據(jù)類型:如上述問題可聲明如下數(shù)據(jù)類型: struct student int num; char name20;char sex; int age; float score; char addr30; ;作為類型名,它就和其它基本類型一樣,用它來定義變量的類作為類型名,它就和其它基本類型一樣,用它來定義變量的類型。型。struct是聲明結(jié)構(gòu)體類型時(shí)所必是聲明結(jié)構(gòu)體類型時(shí)所必須使用的關(guān)鍵字,向編譯系統(tǒng)聲須使用的關(guān)鍵字,向編譯系統(tǒng)聲明這

4、是個(gè)結(jié)構(gòu)體類型,其中包含明這是個(gè)結(jié)構(gòu)體類型,其中包含若干數(shù)據(jù)項(xiàng),這個(gè)類型名的全稱若干數(shù)據(jù)項(xiàng),這個(gè)類型名的全稱是:是: struct student 聲明一個(gè)結(jié)構(gòu)體類型的一般形式:聲明一個(gè)結(jié)構(gòu)體類型的一般形式: struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表列成員表列 ; 結(jié)構(gòu)體名又稱結(jié)構(gòu)體標(biāo)志。結(jié)構(gòu)體名又稱結(jié)構(gòu)體標(biāo)志。 這是用戶自定義的類型,一經(jīng)聲明,就可以和其它基類型一樣這是用戶自定義的類型,一經(jīng)聲明,就可以和其它基類型一樣用來定義此種類型的變量了。用來定義此種類型的變量了。11.2定義結(jié)構(gòu)體類型變量的方法定義結(jié)構(gòu)體類型變量的方法 有三種:有三種: 1、先聲明結(jié)構(gòu)體類型,再定義變量名、先聲明結(jié)構(gòu)體類

5、型,再定義變量名 聲明聲明 結(jié)構(gòu)體類型不分配存儲(chǔ)單元,用該類型定義變量時(shí),分配結(jié)構(gòu)體類型不分配存儲(chǔ)單元,用該類型定義變量時(shí),分配存儲(chǔ)單元。存儲(chǔ)單元。 struct student int num; char name20;char sex; int age; float score; char addr30; ;則則s1,s2這兩個(gè)結(jié)構(gòu)體變量各占這兩個(gè)結(jié)構(gòu)體變量各占59個(gè)字節(jié)的存儲(chǔ)空間。個(gè)字節(jié)的存儲(chǔ)空間。struct student s1,s2 ;2.在聲明類型的同時(shí)定義變量在聲明類型的同時(shí)定義變量 一般形式:一般形式: struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表列成員表列 變量名表列;變量名表列

6、; 例如:例如: struct student int num; char name20;char sex; int age; float score; char addr30; s1,s2,s3;3.直接定義結(jié)構(gòu)體類型變量直接定義結(jié)構(gòu)體類型變量 一般形式:一般形式: struct 成員表列成員表列 變量名表列;變量名表列; 例如:例如: struct int num; char name20;char sex; int age; float score; char addr30; s1,s2,s3;s1,s2,s3盡管沒有結(jié)構(gòu)名,但每個(gè)盡管沒有結(jié)構(gòu)名,但每個(gè)結(jié)構(gòu)體變量結(jié)構(gòu)體變量s1,s2,s

7、3都具有如定義都具有如定義的各成員。的各成員。 4、結(jié)構(gòu)體類型的幾點(diǎn)說明、結(jié)構(gòu)體類型的幾點(diǎn)說明 (1)、類型與變量意義不同,變量可以賦值、存取、存儲(chǔ)等運(yùn)算、類型與變量意義不同,變量可以賦值、存取、存儲(chǔ)等運(yùn)算,而類型不能運(yùn)算,不分配存儲(chǔ)空間。,而類型不能運(yùn)算,不分配存儲(chǔ)空間。 (2)、結(jié)構(gòu)體變量的使用遵循先聲明結(jié)構(gòu)體類型,再用該類型定、結(jié)構(gòu)體變量的使用遵循先聲明結(jié)構(gòu)體類型,再用該類型定義變量或組數(shù);然后使用這些變量或數(shù)組。義變量或組數(shù);然后使用這些變量或數(shù)組。 (3)、結(jié)構(gòu)體變量中的成員可單獨(dú)使用,方法如普通變量;、結(jié)構(gòu)體變量中的成員可單獨(dú)使用,方法如普通變量; (4)、成員名和程序中的變量名可

8、相同,它們之間互不影響;、成員名和程序中的變量名可相同,它們之間互不影響; (5)、結(jié)構(gòu)體變量中的成員還可以是結(jié)構(gòu)體變量、結(jié)構(gòu)體變量中的成員還可以是結(jié)構(gòu)體變量 11.3 結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用 結(jié)構(gòu)體變量被定義后方可使用;結(jié)構(gòu)體變量被定義后方可使用; 1、引用方法:、引用方法: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名 其中:其中:. 為成員分量運(yùn)算符,其優(yōu)先級(jí)為為成員分量運(yùn)算符,其優(yōu)先級(jí)為1,如,如:s1.num; 2、結(jié)構(gòu)體變量不能進(jìn)行整體輸入輸出、結(jié)構(gòu)體變量不能進(jìn)行整體輸入輸出 編譯雖無錯(cuò),但結(jié)果有誤,如:編譯雖無錯(cuò),但結(jié)果有誤,如: scanf(“%d%s”,&s1);

9、 printf(“%d,%sn”,s1); 3、成員又可以是結(jié)構(gòu)體類型、成員又可以是結(jié)構(gòu)體類型 運(yùn)算時(shí)運(yùn)算符一級(jí)一級(jí)找到最低一級(jí)成員,運(yùn)算只能對(duì)最低一運(yùn)算時(shí)運(yùn)算符一級(jí)一級(jí)找到最低一級(jí)成員,運(yùn)算只能對(duì)最低一級(jí)成員進(jìn)行,如級(jí)成員進(jìn)行,如: struct date int month; int day; int year; ; struct student int num; char name20;char sex; int age; struct date birthday; float score; char addr30; s1,s2,s3;s1.num=11002; s2.birthday.

10、month=8; s3.birthday.year=1983; s1.score=s2.score+s3.score;11.4 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 結(jié)構(gòu)體變量可以在定義時(shí)指定初始值結(jié)構(gòu)體變量可以在定義時(shí)指定初始值 main( ) struct student long int num; char name20; char sex; char addr20 ; a=112001, “LiLi”, M , “123 Beijing Road” ; printf(“No.:%ld nname:%snsex:%cnaddress:%sn”, a.num,,a.sex,a.

11、addr); 11.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 11.5.1結(jié)構(gòu)體數(shù)組的定義形式結(jié)構(gòu)體數(shù)組的定義形式 形式一:形式一: struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 成員表列成員表列 ; struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 數(shù)組名表列數(shù)組名表列; 形式二:形式二: struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 成員表列成員表列 數(shù)組名表列數(shù)組名表列; 形式三:形式三: struct 成員表列成員表列 數(shù)組名表列;數(shù)組名表列;11.5.2、結(jié)構(gòu)體數(shù)組的初始化、結(jié)構(gòu)體數(shù)組的初始化 如如 定義一維數(shù)組存放三個(gè)學(xué)生的有關(guān)信息定義一維數(shù)組存放三個(gè)學(xué)生的有關(guān)信息 main( ) int i; struct stud

12、ent long num; char name20;char sex;int age; float score; char add30; stu3=11200111, “LiLin”, M,18,87.5, “123 Beijing Road”, 112002112, “Zhang Fun”, M,19,99, “130 Shang Hai Road”, 11200313, “Wang Min”, F,20,78.5, “1010 Zhong Shan Road”; 也可以先定義結(jié)構(gòu)類型,再定義數(shù)組時(shí)初始化,如:也可以先定義結(jié)構(gòu)類型,再定義數(shù)組時(shí)初始化,如:struct student int

13、 num; struct student stu=,; 11.5.3 結(jié)構(gòu)體數(shù)組應(yīng)用舉例結(jié)構(gòu)體數(shù)組應(yīng)用舉例 例對(duì)侯選人得票的統(tǒng)計(jì)程序。統(tǒng)計(jì)三個(gè)候選人的得票情況例對(duì)侯選人得票的統(tǒng)計(jì)程序。統(tǒng)計(jì)三個(gè)候選人的得票情況 struct person char name20; int count; leader3=“l(fā)i”,0, “zhang”, 0, “fun”,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,leade

14、)=0) leaderj.count+; for(i=0; inum, p-name,p-sex,p-score); 結(jié)構(gòu)體變量的指針就是該結(jié)構(gòu)體變量所占內(nèi)存塊的起始地址,還結(jié)構(gòu)體變量的指針就是該結(jié)構(gòu)體變量所占內(nèi)存塊的起始地址,還可以用指針變量指向結(jié)構(gòu)體內(nèi)的成員,對(duì)結(jié)構(gòu)體成員的操作可可以用指針變量指向結(jié)構(gòu)體內(nèi)的成員,對(duì)結(jié)構(gòu)體成員的操作可歸結(jié)為:歸結(jié)為: 結(jié)構(gòu)體變量結(jié)構(gòu)體變量. 成員名成員名 (*p).成員名成員名 p-成員名成員名 &(*p).成員名成員名(取結(jié)構(gòu)體成員地址取結(jié)構(gòu)體成員地址) -:指向運(yùn)算符,優(yōu)先級(jí)指向運(yùn)算符,優(yōu)先級(jí)1級(jí),級(jí), P-num:得到得到p指向結(jié)

15、構(gòu)體成員指向結(jié)構(gòu)體成員num的值的值 P-num+:得到得到p指向結(jié)構(gòu)體成員指向結(jié)構(gòu)體成員num,用完后使用完后使num值增值增1 +p-num:得到得到p指向結(jié)構(gòu)體成員指向結(jié)構(gòu)體成員num,使之先增使之先增1再使用。再使用。11.6.2 指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針 結(jié)構(gòu)體數(shù)組及其元素可用指針變量來指向結(jié)構(gòu)體數(shù)組及其元素可用指針變量來指向 數(shù)組首地址賦給指向數(shù)組首地址賦給指向結(jié)構(gòu)體類型的指針變量時(shí),當(dāng)指針變量增結(jié)構(gòu)體類型的指針變量時(shí),當(dāng)指針變量增1時(shí),指向下一個(gè)時(shí),指向下一個(gè)數(shù)組元素。數(shù)組元素。指向結(jié)構(gòu)體數(shù)組指針的應(yīng)用指向結(jié)構(gòu)體數(shù)組指針的應(yīng)用 struct student lon

16、g num; char name12; char sex; int age; struct student stu4=11200121, “LiLin”, m,18, 11200222, “zhangFun”, m,19, 11200323, “WangMin”, f,20 11200424, “zhaodan”, f,19; main() struct student *p; printf(“ No Name sex agen”); for(p=stu;pnum, p-name, p-sex, p-age); 11.6.3 用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指

17、針作函數(shù)參數(shù) 將一個(gè)結(jié)構(gòu)體變量的值傳遞給另一函數(shù)將一個(gè)結(jié)構(gòu)體變量的值傳遞給另一函數(shù) 方法有方法有3種:種: (1)、結(jié)構(gòu)體變量的成員作實(shí)參結(jié)構(gòu)體變量的成員作實(shí)參傳遞給函數(shù),是單向的值傳遞,傳遞給函數(shù),是單向的值傳遞, 注意形、實(shí)的類型要一致。注意形、實(shí)的類型要一致。 (2)結(jié)構(gòu)體變量作實(shí)參,結(jié)構(gòu)體變量作實(shí)參,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳遞給形參,要求形參與實(shí)參同類型。函數(shù)調(diào)用是單部順序傳遞給形參,要求形參與實(shí)參同類型。函數(shù)調(diào)用是單值傳遞,且形參占用內(nèi)存單元,若形參的值被改變,不會(huì)返值傳遞,且形參占用內(nèi)存單元,若形參的值被改變,不會(huì)返回主調(diào)函數(shù)?;?/p>

18、主調(diào)函數(shù)。 (3)指向結(jié)構(gòu)體變量的指針作實(shí)參指向結(jié)構(gòu)體變量的指針作實(shí)參,傳遞的是結(jié)構(gòu)體變量的地址,傳遞的是結(jié)構(gòu)體變量的地址。結(jié)構(gòu)體變量結(jié)構(gòu)體變量stu有學(xué)號(hào)、姓名和三門課成績(jī),在有學(xué)號(hào)、姓名和三門課成績(jī),在main函數(shù)中賦值函數(shù)中賦值,在,在print函數(shù)中打印輸出(用結(jié)構(gòu)體變量作參數(shù))。函數(shù)中打印輸出(用結(jié)構(gòu)體變量作參數(shù))。 #define FORMAT “%ldn%sn%fn%fn%fn”struct student long num;char name20; float score3; ; main() void print(struct student); struct student

19、 stu; stu.num=112001; strcpy(, “LiLi”); stu.score0=67.5; stu.score1=89; stu.score2=78.6; print(stu); void print(struct student stu) printf(FORMAT,stu.num,,stu.score0,stu.score1, stu.score2); printf(“n”); 結(jié)構(gòu)體變量結(jié)構(gòu)體變量 stu有學(xué)號(hào),姓名和三門課成績(jī),用指向結(jié)構(gòu)體變量有學(xué)號(hào),姓名和三門課成績(jī),用指向結(jié)構(gòu)體變量的指針作實(shí)參。的指針作實(shí)參。 #define F

20、ORMAT “%ldn%sn%fn%fn%fn”struct student long num; char name20; float score3; stu=112002,”LiLi”,67.5,89,78.6; main( ) void print(struct student *); print(&stu); void print(struct student *p) printf(FORMAT ,p-num,p-name, p-score0,p-score1,p-score2); printf(“n”); 11.7 用指針處理鏈表用指針處理鏈表 11.7.1 鏈表概述鏈表概述

21、數(shù)組:靜態(tài)分配存儲(chǔ)單元,容易造成內(nèi)存浪費(fèi)。數(shù)組:靜態(tài)分配存儲(chǔ)單元,容易造成內(nèi)存浪費(fèi)。 鏈表:是重要的數(shù)據(jù)結(jié)構(gòu),它根據(jù)需要,動(dòng)態(tài)分配內(nèi)存單元。鏈表:是重要的數(shù)據(jù)結(jié)構(gòu),它根據(jù)需要,動(dòng)態(tài)分配內(nèi)存單元。 特征:頭指針變量,存放鏈表首地址,鏈表中每個(gè)元素稱結(jié)點(diǎn),特征:頭指針變量,存放鏈表首地址,鏈表中每個(gè)元素稱結(jié)點(diǎn), 其內(nèi)容:其內(nèi)容: 1、數(shù)據(jù)部分:可有若干項(xiàng)(整、實(shí)、字符、結(jié)構(gòu)體類型等)、數(shù)據(jù)部分:可有若干項(xiàng)(整、實(shí)、字符、結(jié)構(gòu)體類型等) 2、指針變量:下一結(jié)點(diǎn)的地址,最后一個(gè)結(jié)點(diǎn)的地址部分為、指針變量:下一結(jié)點(diǎn)的地址,最后一個(gè)結(jié)點(diǎn)的地址部分為NULL。 head1249135614751021A 1

22、356B 1475C 1021D Null 1249鏈表各結(jié)點(diǎn)的特點(diǎn):鏈表各結(jié)點(diǎn)的特點(diǎn): 1.在內(nèi)存中可以不連續(xù),訪問某結(jié)點(diǎn)應(yīng)找上一結(jié)點(diǎn)提供的地址在內(nèi)存中可以不連續(xù),訪問某結(jié)點(diǎn)應(yīng)找上一結(jié)點(diǎn)提供的地址,每一結(jié)點(diǎn)有一指針變量存放下一結(jié)點(diǎn)的地址。,每一結(jié)點(diǎn)有一指針變量存放下一結(jié)點(diǎn)的地址。 2.鏈表的每個(gè)結(jié)點(diǎn)實(shí)際上是一個(gè)結(jié)構(gòu)體變量,它有若干成員組鏈表的每個(gè)結(jié)點(diǎn)實(shí)際上是一個(gè)結(jié)構(gòu)體變量,它有若干成員組成,包括的內(nèi)容有兩部分:成,包括的內(nèi)容有兩部分: (1)數(shù)據(jù)部分:整、實(shí)、字符、結(jié)構(gòu)體等類型。)數(shù)據(jù)部分:整、實(shí)、字符、結(jié)構(gòu)體等類型。 (2)指針變量:通常具有指向自身結(jié)構(gòu)體類型的指針變量,此)指針變量:通常

23、具有指向自身結(jié)構(gòu)體類型的指針變量,此指針變量用來存放下一結(jié)點(diǎn)的地址,以便一環(huán)扣一環(huán)而形成指針變量用來存放下一結(jié)點(diǎn)的地址,以便一環(huán)扣一環(huán)而形成鏈表。鏈表。 如:如:struct student int num; float score; struct student *next; ; 其中:其中:next 是成員名,又是指針類型,它指向是成員名,又是指針類型,它指向struct student數(shù)數(shù)據(jù)類型,據(jù)類型, 8910189. 589103908910785NULLnumscorenext11.7.2 簡(jiǎn)單鏈表簡(jiǎn)單鏈表例例test11_2:建立簡(jiǎn)單鏈表,它由:建立簡(jiǎn)單鏈表,它由3個(gè)學(xué)生數(shù)據(jù)的

24、結(jié)點(diǎn)組成。輸個(gè)學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成。輸出各結(jié)點(diǎn)中的數(shù)據(jù)。出各結(jié)點(diǎn)中的數(shù)據(jù)。 #define NULL 0 struct student long num; float score; struct student *next; ; main( ) struct student a,b,c,*head,*p; a.num=112001;a.score=89.5;b.num=112002;b.score=90; c.num=112003;c.score=85; head=&a;a.next=&b;b.next=&c; c.next=NULL; p=head; do printf

25、(“%ld %5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); 11200189. 51120029011200385NULLnumscorenextabc每個(gè)結(jié)點(diǎn)都屬于每個(gè)結(jié)點(diǎn)都屬于struct student類型,它的類型,它的next成員存放下一個(gè)結(jié)成員存放下一個(gè)結(jié)點(diǎn)的地址,這樣一環(huán)扣一環(huán),將各結(jié)節(jié)緊密的扣在一起,最后點(diǎn)的地址,這樣一環(huán)扣一環(huán),將各結(jié)節(jié)緊密的扣在一起,最后一次循環(huán),將一次循環(huán),將p=p-next是將是將c結(jié)點(diǎn)的地址賦給結(jié)點(diǎn)的地址賦給p,這時(shí),這時(shí)p指向指向c結(jié)結(jié)點(diǎn),然后將點(diǎn),然后將c結(jié)點(diǎn)的結(jié)點(diǎn)的num,score輸出,之后將

26、輸出,之后將p=p-next實(shí)際上是實(shí)際上是將將c結(jié)點(diǎn)的結(jié)點(diǎn)的next內(nèi)容,即內(nèi)容,即NULL賦給賦給p 再進(jìn)行判斷,再進(jìn)行判斷,P!=NULL條條件不成立,循環(huán)結(jié)束。件不成立,循環(huán)結(jié)束。 本例所有結(jié)點(diǎn)是在程序中定義的,不是臨時(shí)開辟的,用完也不能本例所有結(jié)點(diǎn)是在程序中定義的,不是臨時(shí)開辟的,用完也不能釋放,這種鏈表稱釋放,這種鏈表稱“靜態(tài)鏈表靜態(tài)鏈表”。11.7.3 處理動(dòng)態(tài)鏈表所需的函數(shù)處理動(dòng)態(tài)鏈表所需的函數(shù) 為處理動(dòng)態(tài)鏈表,為處理動(dòng)態(tài)鏈表,C提供了開辟和釋放存儲(chǔ)單元的函數(shù):提供了開辟和釋放存儲(chǔ)單元的函數(shù): 1、malloc函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型:void *malloc(unsign

27、ed int size); 在動(dòng)態(tài)區(qū)分配長(zhǎng)度為在動(dòng)態(tài)區(qū)分配長(zhǎng)度為size的連續(xù)空間,函數(shù)返回值是一個(gè)指向分配的連續(xù)空間,函數(shù)返回值是一個(gè)指向分配域起始地址的指針,如內(nèi)存空間不足,返回空指針域起始地址的指針,如內(nèi)存空間不足,返回空指針NULL。 (此處:此處:void為無確定類型為無確定類型) 2、calloc函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型:void *calloc(unsigned n,unsigned size); 在內(nèi)存動(dòng)態(tài)區(qū)分配在內(nèi)存動(dòng)態(tài)區(qū)分配n個(gè)長(zhǎng)度為個(gè)長(zhǎng)度為size的連續(xù)空間,函數(shù)返回指向分配的連續(xù)空間,函數(shù)返回指向分配域起始地址的指針,若分域起始地址的指針,若分 配不成功,返回配不成

28、功,返回NULL值。值。3、free函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型:void free(void *p); 功能:釋放由功能:釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其它變量使指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其它變量使用。用。P是指向由是指向由calloc或或malloc分配的存儲(chǔ)區(qū)域。分配的存儲(chǔ)區(qū)域。 free函數(shù)無返回值。函數(shù)無返回值。 注:舊版本提供的注:舊版本提供的malloc和和calloc函數(shù)得到的是指向字符型數(shù)據(jù)的函數(shù)得到的是指向字符型數(shù)據(jù)的指針。指針。 ANSI C提供的提供的malloc和和calloc函數(shù)規(guī)定為函數(shù)規(guī)定為void *類型,這并不是說類型,這并不是說該函數(shù)調(diào)用后

29、無返回值,而是返回一個(gè)結(jié)點(diǎn)的地址,該地址的該函數(shù)調(diào)用后無返回值,而是返回一個(gè)結(jié)點(diǎn)的地址,該地址的類型為類型為void(無類型或類型不確定)無類型或類型不確定),即一段存儲(chǔ)區(qū)的首址,其具即一段存儲(chǔ)區(qū)的首址,其具體類型無法確定,只有使用時(shí)根據(jù)各個(gè)域值數(shù)據(jù)再確定。體類型無法確定,只有使用時(shí)根據(jù)各個(gè)域值數(shù)據(jù)再確定。10.7.4 建立鏈表建立鏈表 建立動(dòng)態(tài)鏈表:是指在程序執(zhí)行過程中從無到有地建立起一個(gè)鏈建立動(dòng)態(tài)鏈表:是指在程序執(zhí)行過程中從無到有地建立起一個(gè)鏈表,即一個(gè)一個(gè)地開辟結(jié)點(diǎn)和輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前表,即一個(gè)一個(gè)地開辟結(jié)點(diǎn)和輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相鏈的關(guān)系。后相鏈的關(guān)系。 例例Test1

30、1-3.c 建立單向動(dòng)態(tài)鏈表的函數(shù),每個(gè)結(jié)點(diǎn)有學(xué)號(hào)、成績(jī)建立單向動(dòng)態(tài)鏈表的函數(shù),每個(gè)結(jié)點(diǎn)有學(xué)號(hào)、成績(jī)和指向下一結(jié)點(diǎn)的指針。和指向下一結(jié)點(diǎn)的指針。#include “stdio.h”#include “stdlib.h”#define NULL 0 #define LEN sizeof (struct student) struct student long num; float score; struct student *next; ; int n; struct student *creat(void) struct student *head; struct student *p1, *

31、p2; char s120; n=0; p1=p2=(struct student *)malloc(LEN); scanf(“%ld”,&p1-num); gets(s1); p1-score=atof(s1); head=NULL; while(p1 -num !=0) n=n+1; if(n=1)head=p1; else p2-next=p1; p2=p1; p1=(struct student *)malloc (LEN); scanf(“%ld”,&p1-num); gets(s1); p1-score=atof(s1); p2-next=NULL; return(

32、head); 11200189. 51120029011200385NULLnumscorenexthead11.7.5 輸出鏈表輸出鏈表 將鏈表中各結(jié)點(diǎn)數(shù)據(jù)依次輸出的方法是:將鏈表中各結(jié)點(diǎn)數(shù)據(jù)依次輸出的方法是: 首先要有鏈表首地址,即首先要有鏈表首地址,即 head的值,然后設(shè)一指針變量的值,然后設(shè)一指針變量P,先指,先指向第一個(gè)結(jié)點(diǎn),輸出向第一個(gè)結(jié)點(diǎn),輸出P所指向的結(jié)點(diǎn),然后使所指向的結(jié)點(diǎn),然后使P后移一個(gè)結(jié)點(diǎn)再輸后移一個(gè)結(jié)點(diǎn)再輸出,直到鏈表的尾結(jié)點(diǎn)。出,直到鏈表的尾結(jié)點(diǎn)。P=head,使使p指向第一個(gè)結(jié)點(diǎn)指向第一個(gè)結(jié)點(diǎn) P指向的不是尾結(jié)點(diǎn)指向的不是尾結(jié)點(diǎn) 真真 假假輸出輸出p所指向的結(jié)點(diǎn)

33、所指向的結(jié)點(diǎn)p=p-next當(dāng)當(dāng)p指的不是表尾指的不是表尾headNULLPP例例 輸出鏈表的函數(shù)輸出鏈表的函數(shù) void print( struct student *head) struct student *p; printf(“n Now, these %d records are :n”, n); p=head; if(head) !=NULL) do printf(“%ld, %5.2fn”, p-num, p-score); p=p-next; while(p !=NULL); 11200189. 51120029011200385NULLnumscorenexthead11.7

34、.6 對(duì)鏈表的刪除操作對(duì)鏈表的刪除操作 把該結(jié)點(diǎn)從鏈表中分離,并未真正從內(nèi)存中刪除。把該結(jié)點(diǎn)從鏈表中分離,并未真正從內(nèi)存中刪除。 例例 刪除動(dòng)態(tài)鏈表中指定的結(jié)點(diǎn)刪除動(dòng)態(tài)鏈表中指定的結(jié)點(diǎn) p1是要?jiǎng)h除的結(jié)點(diǎn)是要?jiǎng)h除的結(jié)點(diǎn) 是是 否否 鏈表是一個(gè)空表鏈表是一個(gè)空表 真真 假假輸出輸出 “空空 表表”p1=head 當(dāng)當(dāng)num p1 - num 以及以及p1 所指的結(jié)點(diǎn)不是表尾結(jié)點(diǎn)所指的結(jié)點(diǎn)不是表尾結(jié)點(diǎn)p2=p1 (p2后移一個(gè)位置)后移一個(gè)位置) p1 = p1 - next (p1后移一個(gè)位置)后移一個(gè)位置)輸出輸出“找不找不 到到”的信息的信息 P1所指是頭結(jié)點(diǎn)所指是頭結(jié)點(diǎn) 是是 否否head

35、=p1-next (刪除頭結(jié)點(diǎn))刪除頭結(jié)點(diǎn))p2-next=p1-next (刪除一個(gè)結(jié)點(diǎn))刪除一個(gè)結(jié)點(diǎn))刪除結(jié)點(diǎn)的函數(shù)刪除結(jié)點(diǎn)的函數(shù) struct student *del(struct student *head,long num)struct student *p1,*p2; if(head = = NULL) printf(“n list null ! n”); goto end; p1=head; while(num !=p1 -num & p1 -next != NULL) p2=p1; p1=p1-next; if(num = p1 -num) if(p1 = = hea

36、d) head=p1 -next; else p2 - next = p1-next; free(p1); printf(“delete: %dn”,num); n=n-1; else printf(“%ld not been found ! n”,num); end: return(head); 11200189. 51120029011200385numscorenexthead11200485NULLp2p1p1-next11.7.7 對(duì)鏈表的插入操作對(duì)鏈表的插入操作 將一個(gè)結(jié)點(diǎn)插入到按學(xué)號(hào)順序排列的鏈表中將一個(gè)結(jié)點(diǎn)插入到按學(xué)號(hào)順序排列的鏈表中 算法:算法:p1=head, p0=stu

37、d 原來的鏈表是空表原來的鏈表是空表 是是 否否當(dāng)當(dāng)p0 - num p1 - num 以及以及p1所指的不是表尾結(jié)點(diǎn)所指的不是表尾結(jié)點(diǎn) p2=p1 p1=p1-next p0 - num p1 - num 真真 假假 P0指向頭結(jié)點(diǎn)指向頭結(jié)點(diǎn) 是是 否否head=p0 P0-next=p1 (插到表頭之前插到表頭之前)p2-next=p0 P0-next=p1 (插到表中間插到表中間)p1-next=p0 P0-next=NULL (插到表尾之后插到表尾之后)將將p0所所 指的結(jié)指的結(jié) 點(diǎn)作為點(diǎn)作為 唯一結(jié)唯一結(jié) 點(diǎn)點(diǎn) n=n+1struct student *insert(struct s

38、tudent *head, struct student *stud)struct student *p0, *p1, *p2; p1=head; p0=stud; if(head = = NULL) head=p0; p0-next=NULL; else while(p0-num p1 -num) & (p1 -next != NULL) p2=p1; p1=p1-next; if(p0 - num num) if(head = p1) head=p0; p0 - next =p1; else p2 -next=p0; p0 -next = p1; else p1 -next=p0;

39、 p0 -next=NULL; n=n+1; return(head); 11200189. 51120029011200485numscorenexthead11200585NULLp2p111200385p010.7.8 對(duì)鏈表的綜合操作對(duì)鏈表的綜合操作 T11-main.c 鏈表操作綜合程序鏈表操作綜合程序 #include “stdlib.h”#include “stdio.h”#define LEN sizeof (struct student) struct student long num; float score; struct student *next; ; int n=0

40、; #include “T11-8.c” /*建立鏈表的函數(shù)建立鏈表的函數(shù)*/ #include “T11-9.c” /*輸出鏈表的函數(shù)輸出鏈表的函數(shù)*/ #include “T11-10.c” /*刪除鏈表的函數(shù)刪除鏈表的函數(shù)*/ #include “T11-11.c” /*插入鏈表的函數(shù)插入鏈表的函數(shù)*/main( ) struct student *head, *stu; long del_num; char s220; printf(“input records: n”); head=creat(); print(head); printf(“n input delete number

41、:”); scanf(“%ld”, &del_num); while(del_num !=0) head=del(head,del_num); print(head); printf(“input the delete number:”); scanf(“%ld”, &del_num); printf(“n input the inserted record:”); stu=(struct student *) malloc(LEN); scanf(“%ld”,&stu-num); gets(s2); stu-score=atof(s2); while(stu-num

42、!=0) head=insert(head,stu); print(head); printf(“input the inserted record:”); stu=(struct student *)malloc(LEN); scanf(“%ld”, &stu -num); gets(s2); stu-score=atof(s2); 11.8 共用體共用體 11.8.1 共用體的概念共用體的概念 共用體:使用覆蓋技術(shù),使幾個(gè)不同的變量共占用一段內(nèi)存的結(jié)共用體:使用覆蓋技術(shù),使幾個(gè)不同的變量共占用一段內(nèi)存的結(jié)構(gòu)。構(gòu)。定義共用體類型變量的一般形式為:定義共用體類型變量的一般形式為: un

43、ion 共用體名共用體名成員列表成員列表 變量列表;變量列表;如:如: union data 或或union data 或或union int i; int i; int i; char ch; char ch; char ch; float f; float f; float f; a,b,c; a,b,c; union data a,b,c;11.8.2 共用體變量的引用方式共用體變量的引用方式 共用體變量定義后,只能引用共用體變量中的成員,不能引用共共用體變量定義后,只能引用共用體變量中的成員,不能引用共用體變量。如:用體變量。如: a.i (引用共用體變量中的整型變量(引用共用體變量中

44、的整型變量i) a.ch (引用共用體變量中的字符變量(引用共用體變量中的字符變量ch) a.f (引用共用體變量中的實(shí)型變量(引用共用體變量中的實(shí)型變量f)11.8.3 共用體類型數(shù)據(jù)的特點(diǎn)共用體類型數(shù)據(jù)的特點(diǎn) (1)同一個(gè)內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬同一個(gè)內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬間只能存放其中一種。間只能存放其中一種。(2)共用體變量中起作用的成員是最后一次存放的成員。如:共用體變量中起作用的成員是最后一次存放的成員。如: a.i=1; a.c=a; a.f=1.5;(3)共用體變量的地址和它的成員變量的地址都是同一地址。如:共用體變量的地址和它的成員變量的地址都是同一地址。如: &a、&a.i、&a.c、&a.f都是同一地址值都是同一地址值(4)不能對(duì)共用體變量名賦值,也不能引用變量名來得到一個(gè)值,不能對(duì)共用體變量名賦值,也不能引用變量名來得到一個(gè)值,又不能在定義共用體變量時(shí)對(duì)它初始化。如:又不

溫馨提示

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

評(píng)論

0/150

提交評(píng)論