浙江大學(xué)劉加海C語(yǔ)言6_第1頁(yè)
浙江大學(xué)劉加海C語(yǔ)言6_第2頁(yè)
浙江大學(xué)劉加海C語(yǔ)言6_第3頁(yè)
浙江大學(xué)劉加海C語(yǔ)言6_第4頁(yè)
浙江大學(xué)劉加海C語(yǔ)言6_第5頁(yè)
已閱讀5頁(yè),還剩30頁(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、第6章結(jié)構(gòu)體與共用體本章重點(diǎn)結(jié)構(gòu)體類型的定義及結(jié)構(gòu)體變量的定義。結(jié)構(gòu)體變量占用的內(nèi)存空間。結(jié)構(gòu)體變量對(duì)結(jié)構(gòu)體成員的引用方法。結(jié)構(gòu)體指針變量對(duì)結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組的應(yīng)用。結(jié)構(gòu)體變量作為函數(shù)的參數(shù)。鏈表:堆棧與隊(duì)列。共用體的應(yīng)用。本章難點(diǎn)正確理解結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的關(guān)系。結(jié)構(gòu)體數(shù)組變量對(duì)結(jié)構(gòu)體成員的引用,指向結(jié)構(gòu)體變量的指針對(duì)結(jié)構(gòu)體成員的不同引用方法。結(jié)構(gòu)體變量的輸入輸岀。結(jié)構(gòu)體變量作為函數(shù)的參數(shù)。結(jié)構(gòu)體的嵌套,堆棧與隊(duì)列的應(yīng)用。結(jié)構(gòu)體(struct)和共用體(union)是C語(yǔ)言中程序員自定義的數(shù)據(jù)類型,它是一種常用的數(shù)據(jù)類型。結(jié)構(gòu)體能把若干不同類型的變量組織到統(tǒng)一的名字之下,也稱聚合數(shù)據(jù)

2、類型,而通過共用體允許把同一片內(nèi)存定義成多種不同類型的變量。6.1結(jié)構(gòu)體的基本概念以前各章所討論的數(shù)據(jù)是單一的數(shù)據(jù)類型,而在實(shí)際應(yīng)用中所涉及到變量的屬性是各種基本數(shù)據(jù)類型的組合,因而在c語(yǔ)言程序設(shè)計(jì)中引入了結(jié)構(gòu)體類型的概念。結(jié)構(gòu)體類型是c語(yǔ)言的一種構(gòu)造數(shù)據(jù)類型,它用于描述具有多個(gè)數(shù)據(jù)成員且每個(gè)數(shù)據(jù)成員具有不同數(shù)據(jù)類型的數(shù)據(jù)對(duì)象。例如描寫一個(gè)學(xué)生的基本情況,涉及到學(xué)號(hào)、姓名、性別、兩門課的成績(jī),分別用intnum;charname8;charsex;floatscore2表示,要描寫這樣一個(gè)由不同數(shù)據(jù)類型構(gòu)成的對(duì)象,需要定義一個(gè)結(jié)構(gòu)體類型。.結(jié)構(gòu)體類型定義結(jié)構(gòu)體類型的定義格式為:struct結(jié)構(gòu)

3、體類型名TOCo1-5hz類型數(shù)據(jù)類型成員名1;類型數(shù)據(jù)類型成員名2;類型數(shù)據(jù)類型成員名3;類型數(shù)據(jù)類型成員名n;;例如要描寫上述學(xué)生的基本情況,需定義的結(jié)構(gòu)體類型為:structstudentintnum;charname8;charsex;floatscore2;注意C語(yǔ)言并沒有為之分(1)此定義僅僅是結(jié)構(gòu)體類型的定義,它說明了結(jié)構(gòu)體類型的構(gòu)成情況,配存儲(chǔ)空間(2)結(jié)構(gòu)體中的每個(gè)數(shù)據(jù)成員稱為分量或域,它們并不是變量,在實(shí)際應(yīng)用中還需定義結(jié)構(gòu)變結(jié)構(gòu)體變量的定義定義了結(jié)構(gòu)體類型以后,可以進(jìn)行結(jié)構(gòu)體變量的定義,其形式為:struct結(jié)構(gòu)體類型名結(jié)構(gòu)體變量表;結(jié)構(gòu)體的變量也可以是數(shù)組或指針。定義結(jié)

4、構(gòu)體變量時(shí),C語(yǔ)言會(huì)為每個(gè)變量分配存儲(chǔ)空間。結(jié)構(gòu)體變量的定義的方法可以與結(jié)構(gòu)體類型同時(shí)定義或分開定義,分開定義是指先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。定義結(jié)構(gòu)體時(shí),我們實(shí)際上聲明了一種復(fù)雜的數(shù)據(jù)類型,并未生成任何變量。聲明該變量之前,不存在任何此種類型的變量。為了聲明student類型的變量stu,可寫成如下形式:structstudentstu;這樣就定義了structstudent類型的結(jié)構(gòu)體變量stu。student描述結(jié)構(gòu)體類型,稱為結(jié)構(gòu)體類型。stu是結(jié)構(gòu)體類型的實(shí)例或?qū)ο螅Q為結(jié)構(gòu)體類型變量或結(jié)構(gòu)體變量。定義了結(jié)構(gòu)體變量(stu)之后,C編譯程序自動(dòng)為結(jié)構(gòu)體變量的所有成員分配足夠的

5、內(nèi)存,如圖6.1所示。numnamesexscore0score14Byte8Byte1B8Byte8Byte低地址咼地址圖6.1在VisualC+環(huán)境下結(jié)構(gòu)體變量stu占用內(nèi)存情況定義結(jié)構(gòu)體的同時(shí)可定義一個(gè)或多個(gè)結(jié)構(gòu)體變量。例如:structstudentintnum;charname8;charsex;floatscore2;stu1,stu2,stu3;定義結(jié)構(gòu)體類型student,同時(shí)聲明該類型變量stu1,stu2,stu3。每個(gè)結(jié)構(gòu)體變量都包含各自的結(jié)構(gòu)體成員的副本。例如,stu1中的sex成員和stu2中的sex成員是彼此獨(dú)立的,改變stu1中的sex,不會(huì)影響stu2中的sex

6、。如在定義結(jié)構(gòu)體類型與結(jié)構(gòu)體變量時(shí),結(jié)構(gòu)體標(biāo)記還可省略。例如:structintnum;charname8;charsex;floatscore2;;這里直接按結(jié)構(gòu)體類型說明了結(jié)構(gòu)體變量。結(jié)構(gòu)體變量對(duì)結(jié)構(gòu)體成員的引用通過圓點(diǎn)()操作符可訪問結(jié)構(gòu)體中的成員。訪問一個(gè)結(jié)構(gòu)體成員的一般形式為:結(jié)構(gòu)體變量名.成員名;它表示結(jié)構(gòu)體變量對(duì)具體成員的引用,以下代碼把2001賦給結(jié)構(gòu)體變量stul的成員num:stu1.num=2001;在屏幕上顯示stu的成員num所含的學(xué)號(hào)值,應(yīng)寫為:printf(%d,stu.num);同理,從鍵盤讀入的語(yǔ)句是:scanf(“d,&stu.num);結(jié)構(gòu)體變量的賦值(1

7、)結(jié)構(gòu)體變量可在聲明時(shí)直接進(jìn)行初始化。初始化數(shù)據(jù)應(yīng)放在大括號(hào)中,并根據(jù)成員變量的聲明次序排列,同時(shí)數(shù)據(jù)之間的類型應(yīng)一致。例如:structstudentstu1=2001,張華,M,86.00,92.2;或:structstudentintnum;charname8;charsex;floatscore2;stu1=2001,張華,M,86.00,92.2;例6.1結(jié)構(gòu)體變量初始化的實(shí)例。#includestructstudentintnum;charname8;charsex;floatscore2;stu仁2001,張華,M,86.00,92.2;voidmain()printf(%dt%

8、st%ct%ft%fn,stu1.num,,stu1.sex,stu1.score0,stu1.score1);對(duì)結(jié)構(gòu)體變量的數(shù)據(jù)成員成員進(jìn)行逐個(gè)賦值例6.2結(jié)構(gòu)體變量的數(shù)據(jù)成員進(jìn)行逐個(gè)賦值。#include#includestructstudentintnum;charname8;charsex;floatscore2;stu1;voidmain()stu1.num=2001;strcpy(,張華);stu1.sex=M;stu1.score0=86.00;stu1.score1=92.2;printf(%dt%st%ct%ft%fn,stu1.num,s

9、,stu1.sex,stu1.score0,stu1.score1);可用單賦值語(yǔ)句把一個(gè)結(jié)構(gòu)體變量的全部?jī)?nèi)容賦給另一個(gè)同類結(jié)構(gòu)體變量,而不必逐個(gè)成員地多次賦值。以下程序描述結(jié)構(gòu)體賦值:例6.3結(jié)構(gòu)體變量之間的賦值。#includestructstudentintnum;charname8;charsex;floatscore2;stu仁2001,張華,M,86.00,92.2;voidmain(void)structstudentstu2;stu2=stu1;printf(%dt%st%ct%ft%fn,stu2.num,,stu2.sex,stu2.sco

10、re0,stu2.score1);(4)從鍵盤中逐個(gè)讀入結(jié)構(gòu)體數(shù)據(jù)成員。例6.4從鍵盤中逐個(gè)讀入結(jié)構(gòu)體數(shù)據(jù)成員的實(shí)例。#includestructstudentintnum;charname8;charsex;floatscore2;stu1;voidmain()scanf(%d%s%c%f%f,&stu1.num,,&stu1.sex,&stu1.score0,&stu1.score1);printf(%dt%st%ct%ft%fn,stu1.num,,stu1.sex,stu1.score0,stu1.score1);6.2結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)

11、體的最常見用法就是結(jié)構(gòu)體數(shù)組(arrayofstructures)。例如,描述一個(gè)班級(jí)的學(xué)生。用結(jié)構(gòu)體類型中不同類型的成員變量描述學(xué)生的具體屬性,用數(shù)組類型描述擁有相同屬性的一個(gè)班級(jí)的學(xué)生,以便使用循環(huán)對(duì)數(shù)組元素進(jìn)行統(tǒng)一處理,優(yōu)化算法。定義結(jié)構(gòu)體數(shù)組時(shí),必須先定義結(jié)構(gòu)體,然后再定義該類結(jié)構(gòu)體的數(shù)組。例如,定義前述結(jié)構(gòu)體的數(shù)組時(shí),可寫成:structstudentstu40;或:structstudentintnum;charname8;charsex;floatscore2;stu40;結(jié)構(gòu)體數(shù)組初始化結(jié)構(gòu)體數(shù)組的初始化與其他類型的數(shù)組類似。如:structstudentintnum;char

12、name8;charsex;floatscore2;stu2=4001,Liu,M,86.5,97.3,4002,Zheng,F,78.4,86.5;下面用一個(gè)簡(jiǎn)單例子來說明結(jié)構(gòu)體數(shù)組的定義、初始化及引用。例6.3候選人得票統(tǒng)計(jì)程序。設(shè)有3個(gè)候選人,每次輸入一個(gè)得票候選人的名字,共10張選票,不考慮棄權(quán)情況,要求最后輸出各人得票結(jié)果。程序定義一個(gè)全局結(jié)構(gòu)體類型person,它有二個(gè)成員name(姓名)和count(得票數(shù))。結(jié)構(gòu)體數(shù)組在main函數(shù)中定義并初始化。字符數(shù)組l_name代表每次輸入的被選人的姓名,在每次輸入后,與候選人的名字相比,相同則相應(yīng)候選人的得票數(shù)加1。輸入統(tǒng)計(jì)結(jié)束后,輸出

13、3個(gè)候選人及相應(yīng)的得票數(shù)。程序如下:#include#includestructpersoncharname20;intcount;;intmain(void)intk,t;charl_name20;structpersonleader3=AA,0,BBB,0,AABBB,0;for(k=1;k=10;k+)scanf(%s,l_name);for(t=0;t3;t+)if(strcmp(l_name,)=0)leadert.count+;printf(nNowtheresultsis:n);for(t=0;t成員名例如在圖6.2中:p-num、p-name、p-sex

14、、p-score0、p-score1等。符號(hào)-由減號(hào)和大于號(hào)拼接而成。例如有一結(jié)構(gòu)體及結(jié)構(gòu)體變量的定義如下:structstudentchar*name;intage;int*m;charsex2;floatsalary;charaddress30;stu3,*p;p=stu;指針變量對(duì)成員age、name的弓丨用表示為:page、pname或(*p).age、(*p).name應(yīng)注意以下式子的含義:(1)page+和+page都使結(jié)構(gòu)體成員age力口1。(2)(+p)age、(-p)age使指針p下移或上移,然后再訪問age。(3)pname為指針p所指的name地址,*(pm)+相當(dāng)于*p

15、m+,表示先訪問m所指地址上的內(nèi)容,然后此內(nèi)容再增加1例:有數(shù)據(jù)及結(jié)構(gòu)定義如下:N0.Namesexage1010LiLinM1810102ZhangFunM1910104WangMinF20structstudentintnum;charname20;charsex;intage;stu3,*p;p=stu;在TC中,p+1意味著向下移25個(gè)字節(jié),而在VC中此結(jié)構(gòu)體占用空間為29個(gè)字節(jié),p+1意味著向下移29個(gè)字節(jié)。(+p)num指轉(zhuǎn)向p的下一結(jié)構(gòu)變量的起始地址,然后取得成員num的值。(p+)num先得到pnum的值,然后p指向下一結(jié)構(gòu)變量的起始地址。p只能指向一個(gè)結(jié)構(gòu)體類型數(shù)據(jù),即地址類

16、型應(yīng)相同。p=malloc(sizeof(structstudent)是錯(cuò)的。應(yīng)該把申請(qǐng)到的地址強(qiáng)制轉(zhuǎn)換成結(jié)構(gòu)類型,所以應(yīng)寫成:p=(structstudent*)malloc(sizeof(structstudent)例6.5請(qǐng)輸入學(xué)生學(xué)號(hào)和3門課成績(jī),學(xué)號(hào)為0時(shí)表示數(shù)據(jù)輸入結(jié)束,程序設(shè)計(jì)如下:#include#includestructstudentintnum;floatscore3;voidmain()inti=0,n=0;structstudent*ptr200;printf(”請(qǐng)輸入學(xué)生學(xué)號(hào)和3門課成績(jī),學(xué)號(hào)為0表示數(shù)據(jù)輸入結(jié)束n);doptri=(structstudent*)m

17、alloc(sizeof(structstudent);scanf(%d%f%f%f,&ptri-num,&ptri-score0,&ptri-score1,&ptri-score2);if(ptri_num=0)break;i+;n+;while(1);free(ptri);for(i=0;inum,ptri-score0,ptri-score1,ptri-score2);6.4結(jié)構(gòu)體變量作為函數(shù)的參數(shù)結(jié)構(gòu)體變量可以作為函數(shù)的參數(shù)。向函數(shù)傳遞結(jié)構(gòu)體變量結(jié)構(gòu)體變量用作函數(shù)的參數(shù)時(shí),把結(jié)構(gòu)體變量的所有成員傳遞給被調(diào)用函數(shù)。此時(shí)實(shí)際參數(shù)為結(jié)構(gòu)體變量的地址或指向結(jié)構(gòu)體變量的指針,形式參數(shù)最好為結(jié)構(gòu)體

18、類型的指針變量。例如有一結(jié)構(gòu)體變量定義:structstudent*p,stu,s10;p=&stu;或p=s;函數(shù)調(diào)用語(yǔ)句為:函數(shù)名(p);或:函數(shù)名(&stu);或:函數(shù)名(S);函數(shù)定義為:返回值類型函數(shù)名(structstudent*p)通過以下簡(jiǎn)單程序,可以了解結(jié)構(gòu)體變量作為函數(shù)參數(shù)的用法。例6.6結(jié)構(gòu)體變量作為函數(shù)參數(shù)的例子。#includestructpeninti;doublej;;voidcount(structpen*p)doublex;x=p_i;x*=P_j;printf(x=%fn,x);voidmain()staticstructpend=3,1.23;count(

19、&d);例6.7有4個(gè)學(xué)生,包括學(xué)號(hào)、姓名、成績(jī)。要求找出成績(jī)最高者的姓名和成績(jī)。#includestructstudentintnum;charname20;intscore;voidinput(structstudent*stu)inti;for(i=0;i4;i+)scanf(%d%s%d,&stui.num,&,&stui.score);voidfindmax(structstudent*stu)structstudent*p;inti,temp=0;floatmax;for(max=stu0.score,i=0;imax)max=stui.score;temp=i;

20、p=stu+temp;printf(nThemaximumscore:n);printf(No:%dname:%sscore%4dn,p-num,p-name,p-score);voidmain()structstudentstu4,*p=stu;input(stu);findmax(p);程序執(zhí)行時(shí)調(diào)用函數(shù)input(stu)及findmax(p),函數(shù)的參數(shù)為結(jié)構(gòu)體變量的地址及指向結(jié)構(gòu)體變量的指針,程序在執(zhí)行時(shí)如輸入:Lu91Tan88Liu98Fun87則程序輸出為:Themaximumscore:No:103name:Liuscore986.5結(jié)構(gòu)體的嵌套結(jié)構(gòu)體的成員可以是簡(jiǎn)單的變量,

21、例如:int、float等,也可以是復(fù)合類型。若結(jié)構(gòu)體的成員包括結(jié)構(gòu)體,即結(jié)構(gòu)體中又有結(jié)構(gòu)體,則稱結(jié)構(gòu)體的嵌套,或嵌套結(jié)構(gòu)體(nestedstructure)。在下面的例子中,結(jié)構(gòu)體date內(nèi)嵌在結(jié)構(gòu)體student中:#includestructdateintyear;intmonth;intday;structstudentcharnum10;charname20;charsex;structdatebirthday;floatscore;charaddr40;;voidmain()structstudentcomp_stu=78202,Dennis,M,1986,4,20,576.00,

22、123BinHongRoad;printf(nTheBirthdayof%sis:%d-%d-%d,comp_,comp_stu.birthday.year,comp_stu.birthday.month,comp_stu.birthday.day);6.6共用體共用體是另一種構(gòu)造型數(shù)據(jù)類型,是多種變量共享的一片內(nèi)存。直觀地講,共用體可以把所在存儲(chǔ)單元中相同的數(shù)據(jù)部分當(dāng)作不同的數(shù)據(jù)類型來處理,或用不同的變量名來引用相同的數(shù)據(jù)部分。共用體常用于需要頻繁進(jìn)行類型轉(zhuǎn)換的場(chǎng)合,及壓縮數(shù)據(jù)字節(jié)或程序移植等方面。共用體類型的定義、變量的說明、成員的引用與結(jié)構(gòu)體類型十分相似。共用體變量和結(jié)構(gòu)

23、體變量的本質(zhì)差別在于兩者的存儲(chǔ)方式不同:結(jié)構(gòu)體的成員變量存儲(chǔ)時(shí)各占不同起始地址的存儲(chǔ)單元,在內(nèi)存中呈連續(xù)分配,所占內(nèi)存為各成員所占內(nèi)存的總和;而共用體的成員變量存儲(chǔ)時(shí)共用同一起始地址的存儲(chǔ)單元,所占內(nèi)存為最大內(nèi)存需求的成員所占內(nèi)存。如圖6.3所示。ch圖6.3共用體高字節(jié)低字節(jié)F1t共用體和共用體變量共用體的定義類似于結(jié)構(gòu)體的定義,一般形式如下:union共用體類型名共用體成員表列;共用體變量名表列;其中,共用體類型名或共用體變量名表列之一可省略,但兩者必留其一。例如,在共用體中有一整型成員al和字符型成員ch,共用體變量reg,以下三種定義方式都可。(1)定義共用體類型p_type的同時(shí)聲明

24、共用體變量regunionp_typeintal;charch;reg;省略共用體類型名而直接聲明共用體變量regunionintal;charch;reg;先定義共用體類型p_type,再聲明共用體變量regunionp_typeintal;charch;unionp_typereg;2共用體變量的引用方式在通常使用中,只引用共用體的成員變量,引用方式與結(jié)構(gòu)體變量的引用類似??赏ㄟ^變量名直接引用,也可通過指向共用體類型的指針變量來間接引用。引用的操作符為。例如:unionp_typereg,*pu;pu=&cvnt;/*聲明了共用體變量reg和指向共用體的指針變量pu*/*使共用體指針變量p

25、u指向共用體變量reg*/reg.al禾口pual/*對(duì)成員al用共用體變量直接引用和指針的間接引用*/reg.ch禾口puch/*對(duì)成員ch用共用體變量直接引用和指針的間接引用*/3共用體變量的存儲(chǔ)方式舉例例6.9分析程序的的執(zhí)行結(jié)果uniondatainta;charb;x;voidmain()x.a=16384;x.b=a;printf(%dn,x.a);分析:成員a占用2字節(jié),成員b占用1字節(jié)。當(dāng)給x.a賦值后,在內(nèi)存空間存儲(chǔ)情況如下所示。高位I0I1I0I0I0I0I0I00I0I0I0I0I0I0I0I低位當(dāng)給x.b賦值時(shí),由于x.b與x.a在低字節(jié)共用一個(gè)存儲(chǔ)單元,賦值后的存儲(chǔ)情

26、況如下所示。0100000001100001因而當(dāng)最后輸出x.a時(shí)的值為16481。答案:16481。例6.10數(shù)組的第0個(gè)元素在低位,以下程序輸出的是()。(A)39(B)9(C)38(D)0#includevoidmain()unioninti2;longk;charc4;r,*s=&r;s-i0=0 x39;s-i1=0 x38;printf(%xn,s-c0);分析:存儲(chǔ)空間的結(jié)構(gòu)示意圖如下:r.c:3r.c:2r.c:1r.c:000000000001110000000000000111001r.i:1(0 x38)r.i:0(0 x39)sc:0即r.c:0,因而其值為16進(jìn)制的3

27、9,答案為A。4共用體與結(jié)構(gòu)的嵌套使用共用體與結(jié)構(gòu)的可以嵌套使用。例6.11下列程序的輸出結(jié)果為()。#includevoidmain()unionEXAMPLEstructintx;inty;in;inta;intb;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf(%d%dn,e.in.x,e.in.y);分析:如圖所示共用體有3個(gè)成員in、a、b,以占用最大空間的成員in為準(zhǔn),在VisualC+環(huán)境中占用內(nèi)存空間為8字節(jié),其中e.a、e.b、占用同一個(gè)內(nèi)存空間,當(dāng)執(zhí)行語(yǔ)句e.a=1;時(shí),e.b、的值都為1,當(dāng)執(zhí)行語(yǔ)句e.a=2;時(shí),e.

28、b、的值都為2,e.a*e.b的值賦給,的值為4,而此時(shí)e.a、e.b的值都為4,所以執(zhí)行語(yǔ)句=e.a+e.b;后,的值為8。e.ae.b低位高位圖6.4共用體EXAMPLE的空間占用情況程序輸出為:4,8。5.程序舉例通過一個(gè)簡(jiǎn)單程序,更清楚共用體類型的使用。例6.13兩類實(shí)體大致屬性相同,個(gè)別屬性不同?,F(xiàn)把兩類實(shí)體(如學(xué)生和教師)放置于一個(gè)表格中,表格可通過結(jié)構(gòu)體數(shù)組來實(shí)現(xiàn),如表6.1所示。要求輸入人員數(shù)據(jù),然后再輸出(簡(jiǎn)化考慮,測(cè)試數(shù)據(jù)可采用一類實(shí)體一例)。若number含s則第四項(xiàng)為class,即John為comput001班的學(xué)生;若number含t則第四項(xiàng)為department,即

29、Dennis為comput系的教師。Class和department兩個(gè)屬性對(duì)于任何一個(gè)實(shí)體而言,只能擁有一個(gè),因此它們可通過共用體共用一段內(nèi)存單元。表6.1兩類實(shí)體numberNamesexClass(班)/Department系)s02001Johnmcomp001t0007Dennismcomput程序如下:#include#defineN2structcharnum8;charname20;charsex;unioncharclass18;chardepartment10;dep;membN;intmain(void)intn;for(n=0;nN;n+)scanf(%s%s%c,me

30、mbn.num,,&membn.sex);if(membn.num0=s)scanf(%s,membn.dep.class1);elseif(membn.num0=t)scanf(%s,membn.dep.department);elseprintf(inputerror!);printf(n);for(n=0;ni=x1;將第一個(gè)存儲(chǔ)單元鏈入鏈表p-next=head;head=p;NULL產(chǎn)生第二個(gè)存儲(chǔ)單元,讀入數(shù)據(jù)并賦值,p-next=head;head=p;讀入第三個(gè)數(shù)據(jù)。產(chǎn)生第二個(gè)存儲(chǔ)單元,讀入數(shù)據(jù)并賦值,p-next=head;head=p;讀入第三個(gè)數(shù)據(jù)。p-

31、i=x2;將第二個(gè)數(shù)據(jù)連到鏈表前面,完成語(yǔ)句headheadNULL(a)第二個(gè)結(jié)點(diǎn)連入前(b)第二個(gè)結(jié)點(diǎn)連入后圖6.5單向鏈表nextNULL例6.14下列程序的輸出結(jié)果是()#include#include#defineNULL0structnodeinti;structnode*next;;voidmain()structnode*head,*p;intn;head=NULL;for(n=0;ni=n+1;p-next=head;head=p;p=head;while(p!=NULL)printf(%4d,p-i);p=p-next;分析:這是堆棧形式的數(shù)據(jù)結(jié)構(gòu),循環(huán)中給數(shù)據(jù)域賦值依次為

32、1、2、3、4、5、6、7、89、10,因而輸出為10、9、8、7、6、5、4、3、2、1。例6.15建立堆棧,堆棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。#include#includestructnodecharch;structnode*next;structnode*createnext()/*建立堆棧*/structnode*p,*head;charc;head=NULL;while(c=getchar()!=#)/*讀入字符#時(shí)結(jié)束*/if(p=(structnode*)malloc(sizeof(structnode)=NULL)printf(堆棧溢出n);break;p-ch=c;p-nex

33、t=head;head=p;return(head);voidoutnext(structnode*p)/*遍歷鏈表即鏈表的輸出*/while(p)printf(%3c,p-ch);p=p-next;printf(n);voidmain()structnode*head;printf(輸入一串字符,輸入字符#時(shí)結(jié)束,建立一個(gè)堆棧鏈表n);head=createnext();/*建立堆棧*/outnext(head);/*遍歷鍵表*/6.7.3隊(duì)列的的建立所謂隊(duì)列是指能存取數(shù)據(jù)的暫時(shí)存儲(chǔ)單元,數(shù)據(jù)從隊(duì)列中的取出過程與入隊(duì)過程的次序是相一致的,隊(duì)列通常稱為“先進(jìn)先出”的存儲(chǔ)單元。隊(duì)列的建立過程為:

34、在隊(duì)列的建立過程中,所用到的有頭指針head、尾指針rear、當(dāng)前指針p,尾指針rear始終指向隊(duì)列中最后的結(jié)點(diǎn)。鏈表未建立時(shí):結(jié)點(diǎn)數(shù)為0,頭指針為空。n=0,head=NULL;二產(chǎn)生第一個(gè)存儲(chǔ)單元,讀入數(shù)據(jù);P嚴(yán)個(gè)存儲(chǔ)單元鏈入將第一個(gè)數(shù)據(jù)讀入,并將數(shù)據(jù)存入第一個(gè)存儲(chǔ)單元,即p-i=x1;將第鏈表p-next=head;head=p;rear=p;headNULL圖6.6鏈入頭結(jié)點(diǎn)x1后面,所用到x1后面,所用到產(chǎn)生第二個(gè)存儲(chǔ)單元,讀入數(shù)據(jù)并賦值,p-i=x2;將第二個(gè)數(shù)據(jù)連到結(jié)點(diǎn)語(yǔ)句rear-next=p;把尾指針后移到當(dāng)前指針rear=p;rearrearrearNULLNULLnext

35、NULL(a)第二個(gè)結(jié)點(diǎn)連入前(b)第二個(gè)結(jié)點(diǎn)連入后圖6.7單向鏈表申請(qǐng)空間,讀入第三個(gè)數(shù)據(jù),然后給結(jié)點(diǎn)賦值,重復(fù)(d)。注意:最后尾指針指向空。在隊(duì)列建立過程中,頭指針位置不變。當(dāng)前結(jié)點(diǎn)連入隊(duì)列后,尾指針再指向當(dāng)前指針。例6.16隊(duì)列的例子#defineNULL0#include#includestructnodeintdata;structnode*next;voidmain()structnode*head,*rear,*p;intn;head=NULL;for(n=0;ndata=n+1;if(!head)head=p;elserear-next=p;rear=p;rear-next=

36、NULL;p=head;while(p!=NULL)printf(%4d,p-data);p=p-next;printf(n);例6.17建立一個(gè)隊(duì)例,用來存儲(chǔ)輸入的字符,當(dāng)輸入#寸結(jié)束。#include#includestructnodecharch;structnode*next;建立字符隊(duì)列*/讀入字符#時(shí)結(jié)束*/structnode*createnext()/*structnode*p,*head,*rear;charc;head=NULL;while(c=getchar()!=#)/*if(p=(structnode*)malloc(sizeof(structnode)=NULL)p

37、rintf(隊(duì)列溢出n);break;p-ch=c;if(!head)head=p;elserear-next=p;rear=p;rear-next=NULL;return(head);voidoutnext(structnode*p)/*遍歷鏈表即鏈表的輸出*/while(p)printf(%3c,p-ch);p=p-next;printf(n);voidmain()structnode*head;printf(輸入一串字符,輸入字符#時(shí)結(jié)束,建立一個(gè)隊(duì)例鏈表n);head=createnext();/*建立隊(duì)例*/outnext(head);/*遍歷鍵表*/鏈表的插入情況如下:(1)可能插

38、入鏈表中間與鏈表最后;(2)插入空鏈表中;(3)插入鏈表最前面首先我們來分析第(1)種情況:p0-next=p1;p2-next=p0;(1)把pO所指結(jié)點(diǎn)插在p1、p2之間,語(yǔ)句為:p2p1p0p0(a)插入前(b)插入后圖6.7結(jié)點(diǎn)插入在鏈表的中間如插在最后,語(yǔ)句為:p1-next=pO;pO-next=NULL;(2)插入空鏈表中headp0head=NULL;next(a)插入前NULL插入后圖6.8結(jié)點(diǎn)插入在空鏈表中語(yǔ)句為:pO-next=head;head=pO;插入鏈表最前面的語(yǔ)句為:p0-next=head;head=pO;headNULLNULL(b)插入后結(jié)點(diǎn)插入在鏈表頭例

39、6.18結(jié)點(diǎn)插入鏈表的例子structnode*insert(structnode*head,structnode*stud)structnode*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)/*成為第一個(gè)結(jié)點(diǎn)*/head=p0;p0-next=NULL;elsewhile(p0-chp1-ch)&(p1-next!=NULL)p2=p1;/*p2指向p1,p1后移*/p1=p1_next;if(p0-chch)if(head=p1)/*插到最前*/head=p0;else/*插到p2指向的結(jié)點(diǎn)之后*/p2_next=p0;p0_next=p1;else/*

40、插到最后*/p1_next=p0;p0-next=NULL;return(head);鏈表的刪除情況如下:首先定義指向結(jié)點(diǎn)的指針pl、p2,把pl、p2指向第頭結(jié)點(diǎn),接著查看是否滿足刪除條件:(1)滿足,刪除頭結(jié)點(diǎn),語(yǔ)句為:head=p1-next;如不滿足,pl指針后移,如nump1-num,則:使p2后移,p2=p1。pl再后移,p1=p1-next。判定是否是刪除的結(jié)點(diǎn)。此時(shí)需3個(gè)指針p2,p1,head,頭指針head是固定的,p2隨pl在后依次后移,p1指在所刪除的結(jié)點(diǎn)上。例6.19結(jié)點(diǎn)刪除的例子structnode*del(structnode*head,charch)struct

41、node*p1,*p2;if(head=NULL)printf(nlistnull!n);exit(0);p1=head;while(ch!=p1-ch&p1-next!=NULL)/*p1指向的不是所要的結(jié)點(diǎn),并且后面還有結(jié)點(diǎn)*/p2=p1;/*后移一個(gè)結(jié)點(diǎn)*/p1=p1-next;if(ch=p1-ch)/*找到*/if(p1=head)head=p1-next;/*頭結(jié)點(diǎn)*/elsep2-next=p1-next;printf(delete:%lcn,ch);elseprintf(%dnotbeenfound!n,ch);return(head);例6.20對(duì)鏈表的插入、刪除函數(shù)的調(diào)用如

42、下:#include#include#includestructnodecharch;structnode*next;;voidmain()structnode*head,*p,st;chars;p=&st;puts(輸入一串順序字符,輸入字符#時(shí)結(jié)束,建立一個(gè)隊(duì)例鏈表n);head=createnext();/*建立隊(duì)例*/p-ch=6;head=insert(head,p);outnext(head);/*遍歷鍵表*/s=2;head=del(head,s);outnext(head);/*遍歷鍵表*/程序在運(yùn)行時(shí)屏幕顯示如下(123456789#為鍵盤輸入):輸入一串順序字符,輸入字符#時(shí)結(jié)束,建立一個(gè)隊(duì)例鏈表123456789#1234566789delete:2134566789習(xí)題一、選擇題下述程序的運(yùn)行結(jié)果是()。#includestructstintn;int*m;*P;intd5=10,20,30,40,50;structstarr5=100,d,200,d+1,300,d+2

溫馨提示

  • 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)論