版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
十、構(gòu)造數(shù)據(jù)類型
結(jié)構(gòu)體
2結(jié)構(gòu)體與函數(shù)3共用體6
任務(wù)91結(jié)構(gòu)體與指針4鏈表5十、構(gòu)造數(shù)據(jù)類型
typedef類型聲明
8小型案例9
枚舉類型7任務(wù)分析1
有時(shí)需要編寫(xiě)一個(gè)函數(shù)print,用來(lái)打印一批學(xué)生的成績(jī)信息,定義一個(gè)學(xué)生成績(jī)數(shù)組,假如在該數(shù)組中有5個(gè)學(xué)生的數(shù)據(jù)記錄,每個(gè)記錄又包括num、name、score[3],則可用主函數(shù)輸入這些記錄,再用print函數(shù)輸出這些記錄。返回首頁(yè)任務(wù)分析1分析數(shù)據(jù)需求問(wèn)題輸入structstudent{charnum[6];charname[8];intscore[3];}stu[N];/*定義一成績(jī)數(shù)組用來(lái)表示學(xué)生的成績(jī)信息*/問(wèn)題輸出編寫(xiě)print函數(shù)用以輸出記錄返回首頁(yè)任務(wù)分析1設(shè)計(jì)定義一函數(shù),采用結(jié)構(gòu)數(shù)組作為函數(shù)參數(shù),實(shí)現(xiàn)結(jié)構(gòu)體變量作為函數(shù)參數(shù)的應(yīng)用方法算法1.先定義一個(gè)結(jié)構(gòu)數(shù)組2.再引用結(jié)構(gòu)體數(shù)組完成一批學(xué)生的成績(jī)信息的輸入3.最后運(yùn)用結(jié)構(gòu)數(shù)組作為函數(shù)參數(shù),實(shí)現(xiàn)對(duì)這批信息的輸出
返回首頁(yè)任務(wù)分析1/*編寫(xiě)一個(gè)函數(shù)print,打印一個(gè)學(xué)生的成績(jī)數(shù)組,該數(shù)組中有5個(gè)學(xué)生的數(shù)據(jù)記錄,每個(gè)記錄包括num、name、score[3],用主函數(shù)輸入這些記錄,用print函數(shù)輸出這些記錄。*/#include<stdlib.h>#include<stdio.h>#defineN5structstudent{charnum[6];charname[8];intscore[3];}stu[N];返回首頁(yè)任務(wù)分析1voidprint(structstudentstu[]){inti,j;printf("\nNo.NameScore1Score2Score3\n");for(i=0;i<N;i++){printf("%-6s%-10s",stu[i].num,stu[i].name);for(j=0;j<3;j++)printf("%-8d",stu[i].score[j]);返回首頁(yè)任務(wù)分析1printf("\n");}}voidmain(){inti,j;for(i=0;i<N;i++){printf("num:");scanf("%s",stu[i].num);printf("name:");返回首頁(yè)任務(wù)分析1scanf("%s",stu[i].name);for(j=0;j<3;j++){printf("score%d:",j+1);scanf("%d",&stu[i].score[j]);}}print(stu);}返回首頁(yè)任務(wù)分析1運(yùn)行結(jié)果:Num:Name:Score1:Score2:Score3:……返回首頁(yè)結(jié)構(gòu)體1概念提出:
我們已學(xué)習(xí)了一些簡(jiǎn)單數(shù)據(jù)類型(整型、實(shí)型、字符型)的定義和應(yīng)用,還學(xué)習(xí)了數(shù)組(一維、二維)的定義和應(yīng)用,從中我們認(rèn)識(shí)到C的基本數(shù)據(jù)類型及數(shù)組這種構(gòu)造數(shù)據(jù)類型,認(rèn)識(shí)到構(gòu)造數(shù)據(jù)結(jié)構(gòu)作為一個(gè)整體在處理多個(gè)相關(guān)數(shù)據(jù)時(shí)非常方便,然而數(shù)組只能按順序組織多個(gè)同類型的數(shù)據(jù),在實(shí)際應(yīng)用中往往會(huì)涉及到一組不同類型的數(shù)據(jù)的問(wèn)題。結(jié)構(gòu)體1例如通訊地址表、學(xué)生登記表、成績(jī)表等,在通訊地址表中我們會(huì)寫(xiě)下姓名、郵編、郵箱地址、電話號(hào)碼、E-mail等項(xiàng)目。這些表中集合了各種數(shù)據(jù),因此不能用一個(gè)數(shù)組來(lái)存放這一組數(shù),由于數(shù)組中各元素的類型和長(zhǎng)度須是一致的,為了解決這個(gè)問(wèn)題,C語(yǔ)言引入了一種新的構(gòu)造數(shù)據(jù)類型-----“結(jié)構(gòu)體”。它相當(dāng)于其他高級(jí)語(yǔ)言中的記錄(record)。假設(shè)程序中用到如下表所示數(shù)據(jù)結(jié)構(gòu),C語(yǔ)言中可由用戶在程序中去定義這種類型,即構(gòu)造一個(gè)結(jié)構(gòu)體數(shù)據(jù)類型。結(jié)構(gòu)體1通訊地址表各數(shù)據(jù)項(xiàng)姓名工作單位家庭住址郵編電話號(hào)碼E-mail字符串字符串字符串長(zhǎng)整型字符串或長(zhǎng)整型字符串結(jié)構(gòu)體1上述表格用C提供的結(jié)構(gòu)體類型描述如下:通訊地址表:structaddr{charname[20];chardepartment[30];/*部門(mén)*/charaddress[30];/*住址*/longbox;/*郵編*/longphone;/*電話號(hào)碼*/charemail[30];/*Email*/};結(jié)構(gòu)體1諸如住宿表:structaccommod{charname[20];/*姓名*/charsex;/*性別*/charjob[40];/*職業(yè)*/intage;/*年齡*/longnumber;/*身份證號(hào)碼*/};等等結(jié)構(gòu)體1這一系列對(duì)不同登記表的數(shù)據(jù)結(jié)構(gòu)的描述類型稱為結(jié)構(gòu)體類型。由于不同的問(wèn)題有不同的數(shù)據(jù)成員,也就是說(shuō)有不同描述的結(jié)構(gòu)體類型。我們也可以理解為結(jié)構(gòu)體類型根據(jù)所針對(duì)的問(wèn)題其成員是不同的,可以有任意多的結(jié)構(gòu)體類型描述?!敖Y(jié)構(gòu)體”是一種構(gòu)造數(shù)據(jù)類型,它是由若干“成員”所組成的,每個(gè)成員可以是一個(gè)基本數(shù)據(jù)類型,也可以是一個(gè)構(gòu)造數(shù)據(jù)類型,結(jié)構(gòu)體既然是一種“構(gòu)造”而成的數(shù)據(jù)類型,就表明了它必須服從先定義(先構(gòu)造),再使用。結(jié)構(gòu)體1下面給出C對(duì)結(jié)構(gòu)體類型的定義形式:struct結(jié)構(gòu)體名{成員項(xiàng)表列};有了結(jié)構(gòu)體類型,我們就可以定義結(jié)構(gòu)體類型變量,以對(duì)不同變量的各成員進(jìn)行引用。而成員項(xiàng)列表由若干個(gè)成員組成,每個(gè)成員都是該結(jié)構(gòu)的一個(gè)組成部分,對(duì)每個(gè)成員也必須作類型說(shuō)明,其形式為:類型說(shuō)明符成員名;結(jié)構(gòu)體1結(jié)構(gòu)體數(shù)據(jù)類型的特點(diǎn):1)結(jié)構(gòu)體有關(guān)鍵字struct作為其標(biāo)志;2)結(jié)構(gòu)體由若干個(gè)數(shù)據(jù)項(xiàng)組成,每個(gè)數(shù)據(jù)項(xiàng)都屬于一種已有定義的類型;3)結(jié)構(gòu)體類型并非只有一種,而是成千上萬(wàn)種,不同于基本數(shù)據(jù)類型;4)一個(gè)結(jié)構(gòu)體的定義并不意味著系統(tǒng)為它分配內(nèi)存空間來(lái)存放其數(shù)據(jù)項(xiàng),因?yàn)樗x的只是一個(gè)數(shù)據(jù)類型,是不分配內(nèi)存單元的,只有定義了結(jié)構(gòu)體類型的變量,其變量才占據(jù)存儲(chǔ)單元;結(jié)構(gòu)體15)結(jié)構(gòu)體類型可以嵌套定義,即允許結(jié)構(gòu)體中的一個(gè)或多個(gè)成員是其他結(jié)構(gòu)體類型的變量,如:structworker{charname[20];charsex;intage;floatwage;structbirthday{intyear;intmonth;intday;};char*p_addr;};結(jié)構(gòu)體1在結(jié)構(gòu)體工人中又定義了一個(gè)工人出生年月的結(jié)構(gòu)體。注意:結(jié)構(gòu)體的定義只是描述了該結(jié)構(gòu)體的組織形式,結(jié)構(gòu)體的說(shuō)明不產(chǎn)生內(nèi)存空間的分配,真正占有存儲(chǔ)空間的是具有相應(yīng)結(jié)構(gòu)體類型的變量。結(jié)構(gòu)體1結(jié)構(gòu)體變量前面只是指定了一個(gè)結(jié)構(gòu)體類型,它相當(dāng)于一個(gè)模型,但其中并無(wú)具體數(shù)據(jù),系統(tǒng)對(duì)它也不分配實(shí)際的內(nèi)存單元。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù)??刹扇∫韵?種方法定義結(jié)構(gòu)體類型的變量。1.先聲明結(jié)構(gòu)體類型再定義變量名結(jié)構(gòu)體1如前面已定義了一結(jié)構(gòu)體類型structstudent,可用它來(lái)定義變量。如下:structstu/*定義學(xué)生結(jié)構(gòu)體類型*/{charname[20];/*學(xué)生姓名*/charsex;/*性別*/longnum;/*學(xué)號(hào)*/floatscore[3];/*三科考試成績(jī)*/};structstustudent1,student2;/*定義結(jié)構(gòu)體類型變量*/structstustudent3,student4;用此結(jié)構(gòu)體類型,可以定義更多的該結(jié)構(gòu)體類型變量。結(jié)構(gòu)體12.定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體類型變量:structdata{intday;intmonth;intyear;}time1,time2;也可以再定義如下變量:structdatatime3,time4;用此結(jié)構(gòu)體類型結(jié)構(gòu)體13.直接說(shuō)明結(jié)構(gòu)變量。例如:Struct{
intnum;
charname[20];
charsex;
floatscore;}boy1,boy2;第三種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)名,而直接給出結(jié)構(gòu)變量。說(shuō)明boy1,boy2變量為stu類型后,即可向這兩個(gè)變量中的各個(gè)成員賦值。在上述stu結(jié)構(gòu)定義中,所有的成員都是基本數(shù)據(jù)類型或數(shù)組類型。結(jié)構(gòu)體1成員也可以又是一個(gè)結(jié)構(gòu),即構(gòu)成了嵌套的結(jié)構(gòu)。例如:structdate{
intmonth;
intday;
intyear;}struct{
intnum;
charname[20];
charsex;
structdatebirthday;
floatscore;}boy1,boy2;結(jié)構(gòu)體1
首先定義一個(gè)結(jié)構(gòu)date,由month(月)、day(日)、year(年)三個(gè)成員組成。在定義并說(shuō)明變量boy1和boy2時(shí),其中的成員birthday被說(shuō)明為data結(jié)構(gòu)類型。成員名可與程序中其它變量同名,互不干擾。結(jié)構(gòu)變量成員的表示方法在程序中使用結(jié)構(gòu)變量時(shí),往往不把它作為一個(gè)整體來(lái)使用。結(jié)構(gòu)體1結(jié)構(gòu)體變量的使用在ANSIC中除了允許具有相同類型的結(jié)構(gòu)變量相互賦值以外,一般對(duì)結(jié)構(gòu)變量的使用,包括賦值、輸入、輸出、運(yùn)算等都是通過(guò)結(jié)構(gòu)變量的成員來(lái)實(shí)現(xiàn)的。表示結(jié)構(gòu)變量成員的一般形式是:結(jié)構(gòu)變量名·成員名,其中“·”是結(jié)構(gòu)成員的運(yùn)算符,在所有運(yùn)算符中優(yōu)先級(jí)別最高。對(duì)于成員運(yùn)算符的運(yùn)用例如:boy1.num即第一個(gè)人的學(xué)號(hào)boy2.sex即第二個(gè)人的性別,如果成員本身又是一個(gè)結(jié)構(gòu)則必須逐級(jí)找到最低級(jí)的成員才能使用。例如:boy1.birthday.month即第一個(gè)人出生的月份成員可以在程序中單獨(dú)使用,與普通變量完全相同。結(jié)構(gòu)體1結(jié)構(gòu)變量的賦值前面已經(jīng)介紹,結(jié)構(gòu)變量的賦值就是給各成員賦值??捎幂斎胝Z(yǔ)句或賦值語(yǔ)句來(lái)完成。
結(jié)構(gòu)體1例10.1給結(jié)構(gòu)變量賦值并輸出其值。main(){
structstu
{
intnum;
char*name;
charsex;
floatscore;
}boy1,boy2;
boy1.num=102;
="Zhangping";
結(jié)構(gòu)體1printf("inputsexandscore\n");
scanf("%c%f",&boy1.sex,&boy1.score);
boy2=boy1;
printf("Number=%d\nName=%s\n",boy2.num,);
printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}structstu{結(jié)構(gòu)體1intnum;
char*name;
charsex;
floatscore;}boy1,boy2;boy1.num=102;="Zhangping";printf("inputsexandscore\n");scanf("%c%f",&boy1.sex,&boy1.score);boy2=boy1;結(jié)構(gòu)體1printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);本程序中用賦值語(yǔ)句給num和name兩個(gè)成員賦值,name是一個(gè)字符串指針變量。用scanf函數(shù)動(dòng)態(tài)地輸入sex和score成員值,然后把boy1的所有成員的值整體賦予boy2。最后分別輸出boy2的各個(gè)成員值。本例表示了結(jié)構(gòu)變量的賦值、輸入和輸出的方法。結(jié)構(gòu)體1結(jié)構(gòu)變量的初始化如果結(jié)構(gòu)變量是全局變量或?yàn)殪o態(tài)變量,則可對(duì)它作初始化賦值。對(duì)局部或自動(dòng)結(jié)構(gòu)變量不能作初始化賦值。結(jié)構(gòu)體1例10.2給靜態(tài)結(jié)構(gòu)變量初始化。main(){
staticstructstu/*定義靜態(tài)結(jié)構(gòu)變量*/
{
intnum;
char*name;
charsex;
floatscore;結(jié)構(gòu)體1}boy2,boy1={102,"Zhangping",'M',78.5};
boy2=boy1;
printf("Number=%d\nName=%s\n",boy2.num,);
printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}staticstructstu{
intnum;結(jié)構(gòu)體1char*name;
charsex;
floatscore;}boy2,boy1={102,"Zhangping",'M',78.5};
結(jié)構(gòu)體與函數(shù)1和普通變量一樣,結(jié)構(gòu)體變量也可作為函數(shù)的參數(shù)用于在函數(shù)之間傳遞數(shù)據(jù),同時(shí)函數(shù)的返回值也可以是結(jié)構(gòu)變量。10.3.1結(jié)構(gòu)變量與數(shù)組結(jié)構(gòu)作函數(shù)參數(shù)結(jié)構(gòu)變量作為函數(shù)參數(shù)的傳遞方式與簡(jiǎn)單變量作函數(shù)參數(shù)的處理方式完全相同,即采用值傳遞方式(形參結(jié)構(gòu)變量中各成員值的改變對(duì)相應(yīng)實(shí)參結(jié)構(gòu)變量不產(chǎn)生影響,但在函數(shù)定義時(shí)需要對(duì)其類型進(jìn)行相應(yīng)的說(shuō)明),如:intget_month(x)structmonthx;{…x.day=23;…}結(jié)構(gòu)體與函數(shù)1它說(shuō)明了形參x是structmonth型結(jié)構(gòu)變量。在函數(shù)調(diào)用時(shí),為結(jié)構(gòu)類型的形參分配相應(yīng)的存儲(chǔ)區(qū),并將對(duì)應(yīng)實(shí)參變量中的各成員的值賦值到形參中對(duì)應(yīng)的成員中。10.3.2結(jié)構(gòu)變量作為函數(shù)的返回值結(jié)構(gòu)變量也可以作為函數(shù)的返回值,這時(shí)在函數(shù)定義時(shí),需說(shuō)明返回值的類型為相應(yīng)的結(jié)構(gòu)類型。如:structdatafunc(n)floatm;{structdataf;結(jié)構(gòu)體與函數(shù)1…return(f);}其中,函數(shù)名func前面的類型說(shuō)明符就是用于對(duì)函數(shù)返回值f的類型進(jìn)行說(shuō)明。結(jié)構(gòu)體與函數(shù)1例10.3編寫(xiě)程序,在主程序中為一結(jié)構(gòu)體的各成員賦值,在一函數(shù)中顯示結(jié)構(gòu)體變量中各成員的值。#include<stdio.h>structgoods{ charcode; floatprice; };structgoodsg2;voidmain(){ structgoodsg1;結(jié)構(gòu)體與函數(shù)1 voidshow(); scanf("%c",&g1.code); scanf("%f",&g1.price); show(g1);}voidshow(structgoodsg2){ printf("code=%c",g2.code); printf("price=%f",g2.price);}結(jié)構(gòu)體與指針1
結(jié)構(gòu)變量被定義后,編譯時(shí)就為其在內(nèi)存中分配一片連續(xù)的單元。該內(nèi)存單元的起始地址就稱為該結(jié)構(gòu)變量的指針。可以設(shè)立一個(gè)指針變量,用來(lái)存放這個(gè)地址,當(dāng)把一個(gè)結(jié)構(gòu)變量的起始地址賦給一個(gè)指針變量時(shí),就稱為該指針變量指向這個(gè)結(jié)構(gòu)變量。結(jié)構(gòu)體指針變量還可以用來(lái)指向結(jié)構(gòu)體數(shù)組中的元素。結(jié)構(gòu)體指針與以前介紹過(guò)的指針用法一樣,結(jié)構(gòu)體指針的運(yùn)算也按照C語(yǔ)言的地址計(jì)算規(guī)則。結(jié)構(gòu)體與指針1結(jié)構(gòu)體變量指針結(jié)構(gòu)體變量指針是指向結(jié)構(gòu)體變量的指針,結(jié)構(gòu)體變量指針的一般定義格式為:struct結(jié)構(gòu)體類型名*結(jié)構(gòu)體變量名;例如:structstudent{floatave;}stu1;結(jié)構(gòu)體與指針1structstudent*pa;定義stu1是類型為structstudent的結(jié)構(gòu)體變量,pa是可以指向該類型對(duì)象的指針變量,但應(yīng)該注意的是:經(jīng)過(guò)上面的定義,此時(shí)pa尚未指向任何具體的對(duì)象,為使pa指向stu1,必須把stu1的地址賦給pa;pa=&stu1;注意,在定義了*pa之后,應(yīng)該知道:(1)*pa不是結(jié)構(gòu)變量,因此不能寫(xiě)成pa.ave,必須加上圓括號(hào)(*pa).ave,為此C語(yǔ)言引入一個(gè)指向運(yùn)算符“->”,連接指針變量與其指向的結(jié)構(gòu)體變量的成員。結(jié)構(gòu)體與指針1“->”為間接成員運(yùn)算符,其一般引用的格式為:指針變量名->結(jié)構(gòu)成員名說(shuō)明:運(yùn)算符“->”是由連字符和大于號(hào)組成的字符序列,它們要連在一起使用,C語(yǔ)言把它們作為單個(gè)運(yùn)算符使用,所以可以將(*ps).ave改寫(xiě)為ps->ave。(2)pa只能指向一個(gè)結(jié)構(gòu)體變量,而不能指向結(jié)構(gòu)體變量中的一個(gè)成員。(3)指向運(yùn)算符“->”的優(yōu)先級(jí)別最高,如:ps->ave+1相當(dāng)于(ps->ave)+1,即返回ps->ave之值加1的結(jié)果;結(jié)構(gòu)體與指針1Ps->ave++相當(dāng)于(ps->ave)++,即將ps所指向的結(jié)構(gòu)體成員的值自增1。由此可知:引用結(jié)構(gòu)體中的成員有如下三種方法結(jié)構(gòu)變量量.成員名(*結(jié)構(gòu)指針變量名).成員名結(jié)構(gòu)指針變量名->成員名例如:structpoint{floatx[2];structpoint*next;}fp,lp,*top;結(jié)構(gòu)體與指針1top=&fplfp.x[0]=3.14;fp.next=&lp;(*fp.next).x[0]=0.369;lp.next=9;top->x[1]=2.698;top->fp.x[0];結(jié)構(gòu)體與指針1結(jié)構(gòu)體數(shù)組指針從前面的學(xué)習(xí)可知,數(shù)組和指針有著密切的關(guān)系,同樣對(duì)于結(jié)構(gòu)數(shù)組和結(jié)構(gòu)數(shù)組指針也緊密相關(guān),當(dāng)定義了一個(gè)結(jié)構(gòu)數(shù)組后,還可以定義一個(gè)結(jié)構(gòu)指針變量,使該指針變量指向這個(gè)數(shù)組,這樣在程序中既可用數(shù)組下標(biāo)訪問(wèn)一個(gè)數(shù)組元素,也可通過(guò)指針變量的操作來(lái)存取結(jié)構(gòu)數(shù)組元素。結(jié)構(gòu)體與指針1例如,定義一個(gè)結(jié)構(gòu)類型worker和結(jié)構(gòu)數(shù)組class:structworker{charname[20];floatsalary;intage;intnum[12];};structworkerclass[10];structworker*pa;pa=&class[0];結(jié)構(gòu)體與指針1使用結(jié)構(gòu)體數(shù)組指針pa時(shí)應(yīng)注意如下幾點(diǎn):(1)當(dāng)執(zhí)行pa=&class語(yǔ)句后,指針pa指向class數(shù)組的第一個(gè)元素;當(dāng)執(zhí)行pa++后,表示指針pa指向下一個(gè)元素的起始地址。(++pa)->age先將pa增1,然后取得它指向的元素中age的成員的值;若原來(lái)pa指向class[0],則表達(dá)式返回class[1].age的值,之后pa指向class[1].(pa++)->age先取得pa->age的值,然后再使pa自增1。若原來(lái)pa指向class[0],則該表達(dá)式返回class[0].age的值,之后pa指向class[1]。(2)pa只能指向該結(jié)構(gòu)體數(shù)組中的一個(gè)元素,然后再用指向運(yùn)算符->取其成員之值,而不是直接指向一個(gè)成員。結(jié)構(gòu)體與指針1例10.4輸入5本書(shū)的名稱和單價(jià),按單價(jià)進(jìn)行排序輸出。/*輸入5本書(shū)的名稱和單價(jià),按照單價(jià)進(jìn)行排序后輸出。*/#include<stdio.h>structbook{charname[20];floatprice;};/*形式參數(shù),結(jié)構(gòu)變量term*//*指向結(jié)構(gòu)數(shù)組首地址的指針pbook*/結(jié)構(gòu)體與指針1voidsort(structbookterm,structbook*pbook,intcount){inti;structbook*q,*peng=pbook;for(i=0;i<count;i++,peng++)for(;pbook<peng;pbook++)if(pbook->price>term.price)break;結(jié)構(gòu)體與指針1for(q=peng-1;q>=pbook;q--)*(q+1)=term;}voidprintbook(structbook*pbook)/*輸出指針?biāo)赶虻慕Y(jié)構(gòu)數(shù)組元素的值*/{printf("%-20s%6.2f\n",pbook->name,pbook->price);}結(jié)構(gòu)體與指針1voidmain(){structbookterm,books[5];intcount;for(count=0;count<5;){printf("pleaseenterbooknameandprice%d=",count+1);scanf("%s%f",,&term.price);sort(term,books,count++);結(jié)構(gòu)體與指針1/*調(diào)用函數(shù),傳給結(jié)構(gòu)變量term和結(jié)構(gòu)數(shù)組book數(shù)組的首地址*/}printf("----------BOOKLIST--------------\n");for(count=0;count<5;count++)printbook(&books[count]);/*調(diào)用函數(shù),傳遞數(shù)組中的一個(gè)元素的地址*/運(yùn)行結(jié)果:Pleaseenterbooknameandprice1=db10Pleaseenterbooknameandprice2=c20Pleaseenterbooknameandprice3=ds15Pleaseenterbooknameandprice4=os18Pleaseenterbooknameandprice5=java22結(jié)構(gòu)體與指針1輸出結(jié)果:--------------------BOOKLIST----------------------Db10.00Ds15.00Os18.00C20.00Java22.00鏈表1
鏈表是C語(yǔ)言中很容易實(shí)現(xiàn)且非常有用的數(shù)據(jù)結(jié)構(gòu),它是動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的一種結(jié)構(gòu)。鏈表有若干種形式,如單鏈表、雙鏈表等,每種形式適合于一定的數(shù)據(jù)存儲(chǔ)類型。鏈表的一個(gè)共同特點(diǎn)是:數(shù)據(jù)項(xiàng)之間的關(guān)聯(lián)由包含在數(shù)據(jù)項(xiàng)自身的信息所定義,就是說(shuō)在每個(gè)數(shù)據(jù)項(xiàng)內(nèi)部有指向該數(shù)據(jù)類型的指針變量。這種數(shù)據(jù)項(xiàng)恰好要引用自身的結(jié)構(gòu)來(lái)實(shí)現(xiàn)。以下是單鏈表的學(xué)習(xí)。鏈表1鏈表概述鏈表是將若干數(shù)據(jù)項(xiàng)按一定規(guī)則連接起來(lái)的表,鏈表中的每個(gè)數(shù)據(jù)稱為一個(gè)結(jié)點(diǎn),即鏈表是由稱為結(jié)點(diǎn)的元素組成的,結(jié)點(diǎn)的多少根據(jù)需要確定。鏈表連接的規(guī)則是:前一個(gè)結(jié)點(diǎn)指向下一個(gè)結(jié)點(diǎn);只有通過(guò)前一結(jié)點(diǎn)才能找到下一個(gè)結(jié)點(diǎn),因此,每個(gè)結(jié)點(diǎn)都應(yīng)包括兩個(gè)方面的內(nèi)容:(1)數(shù)據(jù)部分,該部分可以根據(jù)需要由多少個(gè)成員組成,它存放的是需要處理的數(shù)據(jù)。(2)指針部分,該部分存放的是一個(gè)結(jié)點(diǎn)的地址,鏈表中的每個(gè)結(jié)點(diǎn)通過(guò)指針連接在一起。鏈表1說(shuō)明:(1)頭指針變量head指向鏈表的首結(jié)點(diǎn)(2)每個(gè)結(jié)點(diǎn)由兩部分組成即數(shù)據(jù)和指針(3)尾結(jié)點(diǎn)的指針域?yàn)榭誑ULL,作為鏈表結(jié)束的標(biāo)志鏈表與結(jié)構(gòu)數(shù)組有相似之處,即都是由相同數(shù)據(jù)類型的結(jié)構(gòu)變量組成,結(jié)構(gòu)變量間有一定的順序關(guān)系,但它們又有區(qū)別:(1)結(jié)構(gòu)數(shù)組中各元素是連續(xù)存放的,而鏈表中的結(jié)點(diǎn)可以是不連續(xù)存放的鏈表1(2)結(jié)構(gòu)數(shù)組元素可通過(guò)下標(biāo)或相應(yīng)的指針變量的移動(dòng)進(jìn)行順序或隨機(jī)的訪問(wèn)(3)結(jié)構(gòu)數(shù)組在定義時(shí)就確定其元素的個(gè)數(shù),不能動(dòng)態(tài)增長(zhǎng);而鏈表的長(zhǎng)度往往是不確定的,根據(jù)問(wèn)題求解過(guò)程中的實(shí)際需要?jiǎng)討B(tài)地創(chuàng)建結(jié)點(diǎn)并為其分配存儲(chǔ)空間鏈表1鏈表的基本操作對(duì)鏈表的基本操作有建立、查找、刪除和修改等。(1)建立鏈表是指從無(wú)到有建立一個(gè)鏈表,即往空鏈表中依次插入一個(gè)結(jié)點(diǎn),并保持結(jié)點(diǎn)間的前驅(qū)和后繼的關(guān)系。(2)查找操作是指在給定的鏈表中,查找具有檢索條件的結(jié)點(diǎn)。(3)插入操作是指在某兩個(gè)結(jié)點(diǎn)間插入一個(gè)新的結(jié)點(diǎn)。(4)刪除操作是指在給定的鏈表中,刪除某個(gè)特定的結(jié)點(diǎn),也就是插入的逆過(guò)程。(5)修改操作是指在給定的鏈表中,首先根據(jù)某已知的條件查找到該結(jié)點(diǎn),再修改數(shù)據(jù)域中的某些數(shù)據(jù)項(xiàng)。鏈表1由于C語(yǔ)言允許結(jié)構(gòu)成員可以是本結(jié)構(gòu)類型的指針,所以鏈表中的每個(gè)結(jié)點(diǎn)可以用一個(gè)結(jié)構(gòu)變量來(lái)描述,利用C語(yǔ)言處理鏈表是非常方便的。我們將鏈表中每個(gè)結(jié)點(diǎn)的結(jié)構(gòu)類型定義如下:Structnode{intdata;/*數(shù)據(jù)部分*/Structnode*next;/*指針部分*/};共用體1在編程時(shí),有時(shí)會(huì)碰到這樣的情況,需要把不同數(shù)據(jù)類型的變量放在同一存儲(chǔ)區(qū)域,例如,在編制程序的符號(hào)表中,常量可以是整常量,浮點(diǎn)常量或指向字符的指針,它們的類型及大小不同,為了便于管理,可把它們放在足夠大的同一存儲(chǔ)區(qū)域,這就用到共用類型,它也是一種數(shù)據(jù)類型。與結(jié)構(gòu)體類型定義相似,共用體一般定義格式為:Union共用類型名{數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;…數(shù)據(jù)類型成員名n;};共用體1可以看出,共用體與結(jié)構(gòu)體的定義在形式上非常相似,只是關(guān)鍵字變?yōu)榱薾uion,nuion就是定義共用體的標(biāo)識(shí)符。同樣在定義共用體變量時(shí),也可將類型定義和變量定義分開(kāi),或直接定義共用變量。其常用形式為:Union共用體類型名共用體變量;例如:(1)直接定義變量(共用體名可以省略);unionnum{charch;共用體1inta;floatf;charc;int*p;}x,y,z,*pa;(2)先定義類型,再定義變量unionunmx,y,z;(3)共用體與結(jié)構(gòu)體可嵌套使用unionstu{intname[10];共用體1floatave;}st;intage;charbir[10];}stu1;要訪問(wèn)成員ave,,可用stu1.st.ave的形式。定義好共用體后,對(duì)其中成員的引用與結(jié)構(gòu)體一樣,滿足三種方式:(1)共用體變量名.成員名;如x.ch、stu1.age(2)共用體指針變量名->成員名;如pa->f共用體1(3)(*共用體指針變量名).成員名;如(*pa).c使用共用體的注意事項(xiàng)如下:(1)由于共用體變量中的所有成員共享存儲(chǔ)空間,因此變量中的所有成員的首址相同(2)由于共用體變量中的所有成員共享存儲(chǔ)空間,所以在任意時(shí)刻,只能有一種類型的數(shù)據(jù)存放在共用體變量中(3)共用體變量不能作為函數(shù)參數(shù),在定義共用體變量時(shí)不能進(jìn)行初始化。共用體1例10.5驗(yàn)證共用體的應(yīng)用實(shí)例#include<stdio.h>voidmain(){union{unsignedintn;unsignedcharc;}u1;u1.c='Z';printf("%c\n",u1.n);}運(yùn)行結(jié)果:Z枚舉類型1所謂枚舉類型,就是將變量的值一一羅列出來(lái),而變量的值只限于在列舉出來(lái)的值的范圍內(nèi)枚舉是一個(gè)有名字的整型常量的集合,該類型變量只能是取集合中列舉出來(lái)的所有合法值。通常其定義形式:enum類型名{取值表};其中enum是定義枚舉類型的關(guān)鍵字,例如:enumcolor{read,blue,yellow,black=green,white};Color是枚舉類型名,花括號(hào)中各個(gè)標(biāo)識(shí)符是構(gòu)成該類型的各個(gè)成分,即枚舉元素。枚舉變量的定義方式有:(1)在定義枚舉類型的同時(shí)定義枚舉變量,例如:枚舉類型1enumdate{mody=1,tuesd=2,wednesd=3,thursd=4,frid=5,saturd=6,sund=7}d1,d2;這里的d1,d2都是枚舉變量,此時(shí)枚舉類型名date可省略。(2)先定義枚舉類型,再定義枚舉變量,例如:enumdated3;注意:①枚舉元素也稱枚舉常量,每個(gè)枚舉常量都表示一個(gè)整數(shù)值(稱為序號(hào)),系統(tǒng)默認(rèn)的是0,1,2,……,n-1。枚舉類型1②枚舉元素是常量面不是變量,因此不能為枚舉元素賦值,如以下語(yǔ)句不合法:wednesd=3;saturd=6;(3)可以將一個(gè)整數(shù)經(jīng)強(qiáng)制轉(zhuǎn)換后賦值給枚舉變量,如:enumcolor{read,blue,yellow,black;green,white}c1,c2;C3=(enumcolor)5;相當(dāng)于:c3=white;枚舉類型1例10.6從鍵盤(pán)上輸入一整數(shù),顯示與該整數(shù)對(duì)應(yīng)的枚舉常量的英文名。#include<stdio.h>voidmain(){enumdate{mondy=1,tuesd=2,wednesd=3,thursd=4,frid=5,saturd=6,sund=7};enumdated1;inti;printf("Enterthedata:");枚舉類型1scanf("%d",&i);d1=(enumdate)i;switch(d1){casemondy:printf("mondy");break;casetuesd:printf("tuesd");break;casewednesd:printf("wednesd");break;枚舉類型1casethursd:printf("thursd");break;casefrid:printf("frid");break;casesaturd:printf("saturd");break;casesund:printf("sund");break;default:printf("inputerror");break;枚舉類型1}getchar();}運(yùn)行結(jié)果:Enterthedata:2tuesdtypedef類型聲明1C語(yǔ)言允許用typedef說(shuō)明一種新的數(shù)據(jù)類型名,其一般形式為:typedef類型名1類型名2;其中,typedef為關(guān)鍵字用于給已有類型重新定義新類型名,類型名1為系統(tǒng)提供的標(biāo)準(zhǔn)類型名或是已定義過(guò)的其他類型名;類型名2為用戶自定義的新類型名,它往往可簡(jiǎn)化程序中變量的類型定義,如:typedefintDB;定義DB等價(jià)于數(shù)據(jù)類型int,此后,就可用DB對(duì)變量進(jìn)行類型說(shuō)明,如:DBm,n,p,*pi;typedef類型聲明1實(shí)際上,C編譯程序把上述變量作為一般的整型變量處理,在這種情況下,變量所表示的含義較為清楚,從而增加了程序的可讀性,又如:typedefstructstudent{charname[10];intage;}stu;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣州鐵路職業(yè)技術(shù)學(xué)院《采礦工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年浙江省安全員B證(項(xiàng)目經(jīng)理)考試題庫(kù)
- 2025黑龍江省安全員考試題庫(kù)附答案
- 2025年-河北省安全員《B證》考試題庫(kù)
- 《電影天堂》課件
- 植物的逆境生理-課件
- 上海市初中勞技試題解析2014
- 【大學(xué)課件】國(guó)際投資的企業(yè)形式
- 《植物病原病毒》課件
- 《探析權(quán)健腫瘤醫(yī)院》課件
- 女子水晶樂(lè)坊
- 漢語(yǔ)中的詞語(yǔ)詞性分類(課堂)課件
- 骨盆骨折PPT完整版
- 2023-2024學(xué)年廣西壯族自治區(qū)南寧市小學(xué)語(yǔ)文五年級(jí)期末高分試題附參考答案和詳細(xì)解析
- 事業(yè)單位登記管理講座課件
- DB44T 1315-2014物業(yè)服務(wù) 檔案管理規(guī)范
- 基本醫(yī)療保險(xiǎn)異地就醫(yī)登記備案申請(qǐng)表
- 非線性光纖光學(xué)六偏振效應(yīng)PPT
- 雪夜的老人閱讀答案6篇
- 2022數(shù)學(xué)課程標(biāo)準(zhǔn)解讀及實(shí)踐:八下平行四邊形大單元設(shè)計(jì)
- 昌樂(lè)二中271課堂教學(xué)模式
評(píng)論
0/150
提交評(píng)論