




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第1111章章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體與共用體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定義類型定義類型習(xí)題習(xí)題11.1概述概述迄今為止,已介紹了基本類型迄今為止,已介紹了基本類型(或稱簡單類型或稱簡單類型)的變量的變量(如如整型、實型、字符型變量等整型、實型、字符型變量等),也介紹了一種構(gòu)造
2、類型,也介紹了一種構(gòu)造類型數(shù)據(jù)數(shù)據(jù)數(shù)組,數(shù)組中的各元素是屬于同一個類型的。數(shù)組,數(shù)組中的各元素是屬于同一個類型的。但是只有這些數(shù)據(jù)類型是不夠的。有時需要將不同類但是只有這些數(shù)據(jù)類型是不夠的。有時需要將不同類型的數(shù)據(jù)組合成一個有機(jī)的整體,以便于引用。這些型的數(shù)據(jù)組合成一個有機(jī)的整體,以便于引用。這些組合在一個整體中的數(shù)據(jù)是互相聯(lián)系的。例如,一個組合在一個整體中的數(shù)據(jù)是互相聯(lián)系的。例如,一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、家庭地址等學(xué)生的學(xué)號、姓名、性別、年齡、成績、家庭地址等項。這些項都與某一學(xué)生相聯(lián)系。見圖項。這些項都與某一學(xué)生相聯(lián)系。見圖11.1??梢钥础?梢钥吹叫詣e到性別(sex)、年
3、齡、年齡(age)、成績、成績(score)、地址、地址(addr)是是屬于學(xué)號為屬于學(xué)號為10010和名為和名為“Li Fun”的學(xué)生的。如果將的學(xué)生的。如果將num、name、sex、age、score、addr分別定義為互相分別定義為互相獨立的簡單變量,難以反映它們之間的內(nèi)在聯(lián)系。獨立的簡單變量,難以反映它們之間的內(nèi)在聯(lián)系。應(yīng)當(dāng)把它們組織成一個組合項,在一個組合項中包應(yīng)當(dāng)把它們組織成一個組合項,在一個組合項中包含若干個類型不同含若干個類型不同(當(dāng)然也可以相同當(dāng)然也可以相同)的數(shù)據(jù)項。的數(shù)據(jù)項。C語言允許用戶自己指定這樣一種數(shù)據(jù)結(jié)構(gòu),它稱語言允許用戶自己指定這樣一種數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體為
4、結(jié)構(gòu)體(structure)。它相當(dāng)于其他高級語言中的。它相當(dāng)于其他高級語言中的“記錄記錄”。圖圖11.1假設(shè)程序中要用到圖假設(shè)程序中要用到圖11.1所表示的數(shù)據(jù)結(jié)構(gòu),但是所表示的數(shù)據(jù)結(jié)構(gòu),但是C語言沒有提供這種現(xiàn)成的數(shù)據(jù)類型,因此用戶必語言沒有提供這種現(xiàn)成的數(shù)據(jù)類型,因此用戶必須要在程序中建立所需的結(jié)構(gòu)體類型。例如:須要在程序中建立所需的結(jié)構(gòu)體類型。例如:structstudent int num; charname20; charsex; intage; floatscore; charaddr30; ;注意不要忽略最后的分號。上面由程序設(shè)計者指定注意不要忽略最后的分號。上面由程序設(shè)計者指
5、定了一個新的結(jié)構(gòu)體類型了一個新的結(jié)構(gòu)體類型struct student(struct是聲明是聲明結(jié)構(gòu)體類型時所必須使用的關(guān)鍵字,不能省略結(jié)構(gòu)體類型時所必須使用的關(guān)鍵字,不能省略),它向編譯系統(tǒng)聲明這是一個它向編譯系統(tǒng)聲明這是一個“結(jié)構(gòu)體類型結(jié)構(gòu)體類型”,它,它包括包括num、name、sex、age、score、addr等不同等不同類型的數(shù)據(jù)項。應(yīng)當(dāng)說明類型的數(shù)據(jù)項。應(yīng)當(dāng)說明struct student是一個類是一個類型名,它和系統(tǒng)提供的標(biāo)準(zhǔn)類型型名,它和系統(tǒng)提供的標(biāo)準(zhǔn)類型(如如int、char、float、double等等)一樣具有同樣的地位和作用,都一樣具有同樣的地位和作用,都可以用來定義
6、變量的類型,只不過結(jié)構(gòu)體類型需可以用來定義變量的類型,只不過結(jié)構(gòu)體類型需要由用戶自己指定而已。要由用戶自己指定而已。聲明一個結(jié)構(gòu)體類型的一般形式為聲明一個結(jié)構(gòu)體類型的一般形式為struct結(jié)構(gòu)體名結(jié)構(gòu)體名成員表列成員表列;“結(jié)構(gòu)體名結(jié)構(gòu)體名” 用作結(jié)構(gòu)體類型的標(biāo)志,它又稱用作結(jié)構(gòu)體類型的標(biāo)志,它又稱“結(jié)構(gòu)體標(biāo)結(jié)構(gòu)體標(biāo)記記”(structure tag) 。上面的結(jié)構(gòu)體聲明中。上面的結(jié)構(gòu)體聲明中student就是結(jié)就是結(jié)構(gòu)體名構(gòu)體名(結(jié)構(gòu)體標(biāo)記結(jié)構(gòu)體標(biāo)記)。大括弧內(nèi)是該結(jié)構(gòu)體中的各個成員,。大括弧內(nèi)是該結(jié)構(gòu)體中的各個成員,由它們組成一個結(jié)構(gòu)體。例如,上例中的由它們組成一個結(jié)構(gòu)體。例如,上例中的n
7、um、name、sex等都是成員。對各成員都應(yīng)進(jìn)行類型聲明,即等都是成員。對各成員都應(yīng)進(jìn)行類型聲明,即類型名成員名類型名成員名也可以把也可以把“成員表列成員表列”稱為稱為“域表域表”。每一個成員也稱為結(jié)。每一個成員也稱為結(jié)構(gòu)體中的一個域。成員名定名規(guī)與變量名同。構(gòu)體中的一個域。成員名定名規(guī)與變量名同。“結(jié)構(gòu)體結(jié)構(gòu)體”這個詞是根據(jù)英文單詞這個詞是根據(jù)英文單詞structure譯出的。有些譯出的。有些C語言書把語言書把structure直譯為直譯為“結(jié)構(gòu)結(jié)構(gòu)”。作者認(rèn)為譯作。作者認(rèn)為譯作“結(jié)構(gòu)結(jié)構(gòu)”會與一般含義上的會與一般含義上的“結(jié)構(gòu)結(jié)構(gòu)”混淆混淆(例如,數(shù)據(jù)結(jié)構(gòu)、程序結(jié)例如,數(shù)據(jù)結(jié)構(gòu)、程序結(jié)構(gòu)
8、、控制結(jié)構(gòu)等構(gòu)、控制結(jié)構(gòu)等)。日本把。日本把structure譯作譯作“結(jié)構(gòu)體結(jié)構(gòu)體”或或“構(gòu)構(gòu)造體造體”,作者認(rèn)為譯作,作者認(rèn)為譯作“結(jié)構(gòu)體結(jié)構(gòu)體”比譯作比譯作“結(jié)構(gòu)結(jié)構(gòu)”更確切更確切一些,不致與一般含義上的一些,不致與一般含義上的“結(jié)構(gòu)結(jié)構(gòu)”混淆?;煜?1.2定義結(jié)構(gòu)體類型變量的方法定義結(jié)構(gòu)體類型變量的方法前面只是指定了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,但其前面只是指定了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,但其中并無具體數(shù)據(jù),系統(tǒng)對之也不分配實際內(nèi)存單元。為了中并無具體數(shù)據(jù),系統(tǒng)對之也不分配實際內(nèi)存單元。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當(dāng)定義結(jié)構(gòu)體類型能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),
9、應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù)??梢圆扇∫韵氯N方的變量,并在其中存放具體的數(shù)據(jù)。可以采取以下三種方法定義結(jié)構(gòu)體類型變量。法定義結(jié)構(gòu)體類型變量。1. 先聲明結(jié)構(gòu)體類型再定義變量名先聲明結(jié)構(gòu)體類型再定義變量名如上面已定義了一個結(jié)構(gòu)體類型如上面已定義了一個結(jié)構(gòu)體類型struct student,可以用它來,可以用它來定義變量。如定義變量。如:struct student student1, student2結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名;定義了定義了student1和和student2為為struct student類型的變量,即它類型的變量,即它們具有們具有
10、struct student類型的結(jié)構(gòu)。如圖類型的結(jié)構(gòu)。如圖11.2所示。所示。圖圖11.2在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元。在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元。例如例如student1和和student2在內(nèi)存中各占在內(nèi)存中各占59個字節(jié)個字節(jié)(2+20+1+2+4+30=59)。應(yīng)當(dāng)注意,將一個變量定義為標(biāo)準(zhǔn)類型應(yīng)當(dāng)注意,將一個變量定義為標(biāo)準(zhǔn)類型(基本數(shù)據(jù)類型基本數(shù)據(jù)類型)與定義為結(jié)構(gòu)體類型不同之處在于后者不僅要求指與定義為結(jié)構(gòu)體類型不同之處在于后者不僅要求指定變量為結(jié)構(gòu)體類型,而且要求指定為某一特定的定變量為結(jié)構(gòu)體類型,而且要求指定為某一特定的結(jié)構(gòu)體類型結(jié)構(gòu)體類型(
11、例如例如struct student類型類型)。因為可以定義。因為可以定義出許許多多種具體的結(jié)構(gòu)體類型。而在定義變量為出許許多多種具體的結(jié)構(gòu)體類型。而在定義變量為整型時,只需指定為整型時,只需指定為int型即可。型即可。如果程序規(guī)模比較大,往往將對結(jié)構(gòu)體類型的聲明如果程序規(guī)模比較大,往往將對結(jié)構(gòu)體類型的聲明集中放到一個文件集中放到一個文件(以以h為后綴的為后綴的“頭文件頭文件”)中。中。哪個源文件需用到此結(jié)構(gòu)體類型則可用哪個源文件需用到此結(jié)構(gòu)體類型則可用#include命命令將該頭文件包含到本文件中。這樣做便于裝配,令將該頭文件包含到本文件中。這樣做便于裝配,便于修改,便于使用。便于修改,便于
12、使用。2.在聲明類型的同時定義變量在聲明類型的同時定義變量例如:例如: structstudent intnum; charname20; charsex; intage; float score; charaddr30; student1,student2;它的作用與第一種方法相同,即定義了兩個它的作用與第一種方法相同,即定義了兩個struct student類型的變量類型的變量student1、student2。這種形式。這種形式的定義的一般形式為的定義的一般形式為struct結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表列成員表列變量名表列;變量名表列;3. 直接定義結(jié)構(gòu)類型變量直接定義結(jié)構(gòu)類型變量其一般形式
13、為其一般形式為struct 成員表列成員表列 變量名表列;即不出現(xiàn)結(jié)構(gòu)體名。變量名表列;即不出現(xiàn)結(jié)構(gòu)體名。關(guān)于結(jié)構(gòu)體類型,有幾點要說明:關(guān)于結(jié)構(gòu)體類型,有幾點要說明:(1) 類型與變量是不同的概念,不要混同。只能對變類型與變量是不同的概念,不要混同。只能對變量賦值、存取或運算,而不能對一個類型賦值、量賦值、存取或運算,而不能對一個類型賦值、存取或運算。在編譯時,對類型是不分配空間的,存取或運算。在編譯時,對類型是不分配空間的,只對變量分配空間。只對變量分配空間。(2) 對結(jié)構(gòu)體中的成員對結(jié)構(gòu)體中的成員(即即“域域”),可以單獨使用,可以單獨使用,它的作用與地位相當(dāng)于普通變量。關(guān)于對成員的它的作
14、用與地位相當(dāng)于普通變量。關(guān)于對成員的引用方法見引用方法見11.3節(jié)。節(jié)。(3) 成員也可以是一個結(jié)構(gòu)體變量。成員也可以是一個結(jié)構(gòu)體變量。如:如:structdate /*聲明一個結(jié)構(gòu)體類型聲明一個結(jié)構(gòu)體類型*/intmonth; intday; intyear; ;structstudentintnum; charname20; charsex; intage; struct date birthday; /*birthday是是struct date類型類型*/ charaddr30; student1,student2;先聲明一個先聲明一個struct date類型,它代表類型,它代表“日
15、期日期”,包,包括括3個成員:個成員:month(月月)、day(日日)、year(年年)。然后。然后在聲明在聲明struct student類型時,將成員類型時,將成員birthday指定為指定為struct date類型。類型。struct student的結(jié)構(gòu)見圖的結(jié)構(gòu)見圖11.3所示。已聲明的類型所示。已聲明的類型struct date與其他類型與其他類型(如如int,char)一樣可以用來定義成員的類型。一樣可以用來定義成員的類型。(4)成員名可以與程序中的變量名相同成員名可以與程序中的變量名相同,二者不代表同二者不代表同一對象。例如一對象。例如,程序中可以另定義一個變量程序中可以另
16、定義一個變量num,它它與與struct student中的中的num是兩回事是兩回事,互不干擾?;ゲ桓蓴_。圖圖11.311.3結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用在定義了結(jié)構(gòu)體變量以后在定義了結(jié)構(gòu)體變量以后,當(dāng)然可以引用這個變量。當(dāng)然可以引用這個變量。但應(yīng)遵守以下規(guī)則但應(yīng)遵守以下規(guī)則:(1) 不能將一個結(jié)構(gòu)體變量作為一個整體進(jìn)行輸入和不能將一個結(jié)構(gòu)體變量作為一個整體進(jìn)行輸入和輸出。例如輸出。例如,已定義已定義student1和和student2為結(jié)構(gòu)體變?yōu)榻Y(jié)構(gòu)體變量并且它們已有值。不能這樣引用量并且它們已有值。不能這樣引用:printf (%d,%s,%c,%d,%f,%sn,student1)
17、;只能對結(jié)構(gòu)體變量中的各個成員分別進(jìn)行輸入和輸只能對結(jié)構(gòu)體變量中的各個成員分別進(jìn)行輸入和輸出。引用結(jié)構(gòu)體變量中成員的方式為出。引用結(jié)構(gòu)體變量中成員的方式為結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名例如例如: student1.num表示表示student1變量中的變量中的num成員成員,即即student1的的num(學(xué)號學(xué)號)項??梢詫ψ兞康某蓡T項??梢詫ψ兞康某蓡T 賦值賦值,例如例如:student1.num=10010;“.”是成員是成員(分量分量)運算符運算符,它在所有的運算符中優(yōu)先級它在所有的運算符中優(yōu)先級最高最高,因此可以把因此可以把student 1.num作為一個整體來看作為一個整
18、體來看待。上面賦值語句的作用是將整數(shù)待。上面賦值語句的作用是將整數(shù)10010賦給賦給student 1變量中的成員變量中的成員num。(2) 如果成員本身又屬一個結(jié)構(gòu)體類型如果成員本身又屬一個結(jié)構(gòu)體類型,則要用若干則要用若干個成員運算符個成員運算符,一級一級地找到最低的一級的成員。一級一級地找到最低的一級的成員。只能對最低級的成員進(jìn)行賦值或存取以及運算。只能對最低級的成員進(jìn)行賦值或存取以及運算。例如例如,對上面定義的結(jié)構(gòu)體變量對上面定義的結(jié)構(gòu)體變量student1, 可以這樣可以這樣訪問各成員訪問各成員:student1.numstudent1.birthday.month注意注意:不能用不能
19、用student1.birthday來訪問來訪問student1變量中的成員變量中的成員birthday,因為因為birthday本身是一個結(jié)構(gòu)體變量。本身是一個結(jié)構(gòu)體變量。(3) 對結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運算對結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運算(根據(jù)其類型決定可以進(jìn)行的運算根據(jù)其類型決定可以進(jìn)行的運算)。例如:。例如:student2score=student1score;sum=student1score+student2score;student1age+;+student1age;由于由于“”運算符的優(yōu)先級最高,因此運算符的優(yōu)先級最高,因此student
20、1age+是對是對student1age進(jìn)行自加運算,而不是先對進(jìn)行自加運算,而不是先對age進(jìn)行自加運進(jìn)行自加運算。算。(4) 可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址。如:構(gòu)體變量的地址。如:scanf(%d,&student1.num); (輸輸入入student1num的值的值)printf(%o,&student1); (輸出輸出student1的首地址的首地址)但不能用以下語句整體讀入結(jié)構(gòu)體變量,但不能用以下語句整體讀入結(jié)構(gòu)體變量,如:如:scanf(%d,%s,%c,%d,%f,%s,&studen
21、t1);結(jié)構(gòu)體變量的地址主要用于作函數(shù)參數(shù),傳遞結(jié)構(gòu)體的地址。結(jié)構(gòu)體變量的地址主要用于作函數(shù)參數(shù),傳遞結(jié)構(gòu)體的地址。11.4結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化和其他類型變量一樣,對結(jié)構(gòu)體變量可以在定義時和其他類型變量一樣,對結(jié)構(gòu)體變量可以在定義時指定初始值。指定初始值。例例11.1對結(jié)構(gòu)體變量初始化。對結(jié)構(gòu)體變量初始化。main() struct student long int num; char name20; char sex; char addr20; a=89031,Li Lin,M,123 Beijing Road; printf(NO.:%ldnname:%snsex:%cna
22、ddress:%sn,a.num,,a.sex,a.addr); 運行結(jié)果如下:運行結(jié)果如下:No.:89031name:Li Linsex:Maddress:123 Beijing Road11.5結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組一個結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)一個結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如一個學(xué)生的如一個學(xué)生的學(xué)號、姓名、成績等數(shù)據(jù)學(xué)號、姓名、成績等數(shù)據(jù))。如果有。如果有10個學(xué)生的數(shù)個學(xué)生的數(shù)據(jù)需要參加運算,顯然應(yīng)該用數(shù)組,這就是結(jié)構(gòu)體據(jù)需要參加運算,顯然應(yīng)該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組不同數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組不同之處在于每個數(shù)組
23、元素都是一個結(jié)構(gòu)體類型的數(shù)之處在于每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個成員據(jù),它們都分別包括各個成員(分量分量)項。項。11.5.1定義結(jié)構(gòu)體數(shù)組定義結(jié)構(gòu)體數(shù)組和定義結(jié)構(gòu)體變量的方法相仿,只需說明其為數(shù)組和定義結(jié)構(gòu)體變量的方法相仿,只需說明其為數(shù)組即可。如:即可。如:struct studentint num; char name20; char sex; int age; float score; char addr30;struct studentstu3;以上定義了一個數(shù)組以上定義了一個數(shù)組stu,其元素為,其元素為struct student類類型數(shù)據(jù),數(shù)組有型數(shù)據(jù)
24、,數(shù)組有3個元素。也可以直接定義一個結(jié)個元素。也可以直接定義一個結(jié)構(gòu)體數(shù)組,如:構(gòu)體數(shù)組,如:struct student int num; stu3;或或struct int num; stu3;圖圖11.4數(shù)組各元素在內(nèi)存中連續(xù)存數(shù)組各元素在內(nèi)存中連續(xù)存放,見圖放,見圖11.5示意。示意。11.5.2結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化與其他類型的數(shù)組一樣,與其他類型的數(shù)組一樣,對結(jié)構(gòu)體數(shù)組可以初始化。對結(jié)構(gòu)體數(shù)組可以初始化。如:如: structstudentintnum; charname20; charsex; intage;圖圖11.5 floatscore; charadd30;
25、stu3=10101,“Li Lin”,M,18,875,“103 Beijing Road”,10102,“Zhang Fun”,M,19,99,“130 Shanghai Road”,10104,“ang Min”,F(xiàn),20,785,“1010 Zhongshan Road”;定義數(shù)組定義數(shù)組stu時,元素個數(shù)可以不指定,即寫成以下時,元素個數(shù)可以不指定,即寫成以下形式:形式:stu= , ;編譯時,系統(tǒng);編譯時,系統(tǒng)會根據(jù)給出初值的結(jié)構(gòu)體常量的個數(shù)來確定數(shù)組會根據(jù)給出初值的結(jié)構(gòu)體常量的個數(shù)來確定數(shù)組元素的個數(shù)。元素的個數(shù)。當(dāng)然,數(shù)組的初始化也可以用以下形式:當(dāng)然,數(shù)組的初始化也可以用以下
26、形式:structstudent intnum; ; structstudentstu=,;即先聲明結(jié)構(gòu)體類型,然后定義數(shù)組為該結(jié)構(gòu)體類即先聲明結(jié)構(gòu)體類型,然后定義數(shù)組為該結(jié)構(gòu)體類型,在定義數(shù)組時初始化。從以上可以看到,結(jié)型,在定義數(shù)組時初始化。從以上可以看到,結(jié)構(gòu)體數(shù)組初始化的一般形式是在定義數(shù)組的后面構(gòu)體數(shù)組初始化的一般形式是在定義數(shù)組的后面加上:加上:=初值表列初值表列;11.5.3結(jié)構(gòu)體數(shù)組應(yīng)用舉例結(jié)構(gòu)體數(shù)組應(yīng)用舉例下面舉一個簡單的例子來說明結(jié)構(gòu)體數(shù)組的定義和下面舉一個簡單的例子來說明結(jié)構(gòu)體數(shù)組的定義和引用。引用。例例11.2對候選人得票的統(tǒng)計程序。設(shè)有對候選人得票的統(tǒng)計程序。設(shè)有3個
27、候選人,個候選人,每次輸入一個得票的候選人的名字,要求最后輸每次輸入一個得票的候選人的名字,要求最后輸出各人得票結(jié)果。出各人得票結(jié)果。程序如下:程序如下:#include struct personchar name20; int count;leader3=Li,0,Zhang,0,F(xiàn)un,0;main()inti,j; charleader-name20; for(i=1;i=10;i+) scanf(%s,leader-name); for(j=0;j3;j+) if(strcmp(leader-name,)=0) leaderj.count+: printf(n
28、); for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); 運行情況如下:運行情況如下: LiLiFunZhangZhangFunLiFunZhangLiLi 4Zhang 3Fun 3程序定義一個全局的結(jié)構(gòu)體數(shù)組程序定義一個全局的結(jié)構(gòu)體數(shù)組leader,它有,它有3個元個元素,每一元素包含兩個成員素,每一元素包含兩個成員name(姓名姓名)和和count(票票數(shù)數(shù))。在定義數(shù)組時使之初始化,使。在定義數(shù)組時使之初始化,使3位候選人的位候選人的票數(shù)都先置零。見圖票數(shù)都先置零。見圖11.6。圖圖11.6在主函數(shù)中定義字符數(shù)組在主函數(shù)
29、中定義字符數(shù)組leader-name,它代表被選,它代表被選人的姓名,在人的姓名,在10次循環(huán)中每次先輸入一個被選人次循環(huán)中每次先輸入一個被選人的具體人名,然后把它與的具體人名,然后把它與3個候選人姓名相比,看個候選人姓名相比,看它和哪一個候選人的名字相同。注意它和哪一個候選人的名字相同。注意leader-name是和是和leaderjname相比,相比,leaderj是數(shù)組是數(shù)組leader的第的第j個元素,它包含兩個成員項,個元素,它包含兩個成員項,leader-name應(yīng)應(yīng)該和該和leader數(shù)組第數(shù)組第j個元素的個元素的name成員相比。成員相比。若若j為某一值時,輸入的姓名與為某一值
30、時,輸入的姓名與leaderjname相等,相等,就執(zhí)行就執(zhí)行“l(fā)eaderjcount+”,由于成員運算符,由于成員運算符“”優(yōu)先于自增運算符優(yōu)先于自增運算符“+”,因此它相當(dāng)于,因此它相當(dāng)于(leaderjcount)+,使,使leaderj的成員的成員count的的值加值加1。在輸入和統(tǒng)計結(jié)束之后,將。在輸入和統(tǒng)計結(jié)束之后,將3人的名字和人的名字和得票數(shù)輸出。得票數(shù)輸出。11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針指向結(jié)構(gòu)體類型數(shù)據(jù)的指針一個結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段一個結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段的起始地址。可以設(shè)一個指針變量,用來指向一的起始地址??梢栽O(shè)一個指針變量,用
31、來指向一個結(jié)構(gòu)體變量,此時該指針變量的值是結(jié)構(gòu)體變個結(jié)構(gòu)體變量,此時該指針變量的值是結(jié)構(gòu)體變量的起始地址。指針變量也可以用來指向結(jié)構(gòu)體量的起始地址。指針變量也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。數(shù)組中的元素。11.6.1指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針下面通過一個簡單例子來說明指向結(jié)構(gòu)體變量的指下面通過一個簡單例子來說明指向結(jié)構(gòu)體變量的指針變量的應(yīng)用。針變量的應(yīng)用。例例11.3指向結(jié)構(gòu)體變量的指針的應(yīng)用。指向結(jié)構(gòu)體變量的指針的應(yīng)用。#include main() structstudent longnum; charname20; char sex; float score; ; stru
32、ctstudentstu-1; structstudent* p; p=&stu-1; stu-1num=89101; strcpy(stu-1name,Li Lin); stu-1sex=M; stu-1score=895; printf(No.:%ldnname:%snsex:%cnscore:%fn,stu-1.num,,stu-1.sex,stu-1.score); printf(No.:%ldnname:%snsex:%cnscore:%fn,(*p).num,(*p).name,(*p).sex, (*p).score); 在主函數(shù)中聲明了在主函數(shù)中聲明
33、了struct student類型,然后定義一類型,然后定義一個個struct student類型的變量類型的變量stu-1。同時又定義一。同時又定義一個指針變量個指針變量p,它指向一個,它指向一個struct student類型的數(shù)類型的數(shù)據(jù)。在函數(shù)的執(zhí)行部分將結(jié)構(gòu)體變量據(jù)。在函數(shù)的執(zhí)行部分將結(jié)構(gòu)體變量stu-1的起始的起始地址賦給指針變量地址賦給指針變量p,也就是使,也就是使p指向指向stu-1(見圖見圖11.7),然后對,然后對stu-1的各成員賦值。諞桓鰌的各成員賦值。諞桓鰌rintf函函數(shù)是輸出數(shù)是輸出stu-1的各個成員的值。用的各個成員的值。用stu-1num表表示示stu-1中
34、的成員中的成員num,余類推。第二個,余類推。第二個printf函數(shù)函數(shù)也是用來輸出也是用來輸出stu-1各成員的值,但使用的是各成員的值,但使用的是(*p)num這樣的形式。這樣的形式。(*p)表示表示p指向的結(jié)構(gòu)體指向的結(jié)構(gòu)體變量,變量,(*p)num是是p指指向的結(jié)構(gòu)體變量中的成向的結(jié)構(gòu)體變量中的成員員num。注意。注意*p兩側(cè)的兩側(cè)的括弧不可省,因括弧不可省,因稍痹稍痹慫惴慫惴“”優(yōu)先于優(yōu)先于“*”運算符,運算符,*pnum就等就等價于價于*(pnum)了。了。圖圖11.7程序運行結(jié)果如下:程序運行結(jié)果如下:No:89101 name:Li Lin sex:M score:895000
35、00No:89101name:Li Lin sex:Mscore:89500000可見兩個可見兩個printf函數(shù)輸出的結(jié)果是相同的。函數(shù)輸出的結(jié)果是相同的。在在C語言中,為了使用方便和使之直觀,可以把語言中,為了使用方便和使之直觀,可以把(*p)num改用改用pnum來代替,它表示來代替,它表示*p所指所指向的結(jié)構(gòu)體變量中的向的結(jié)構(gòu)體變量中的num成員。同樣,成員。同樣,(*p).name等價于等價于pname。也就是說,以下三種形式等。也就是說,以下三種形式等價:價: 結(jié)構(gòu)體變量成員名結(jié)構(gòu)體變量成員名 (*p)成員名成員名 p-成員名成員名上面程序中最后一個上面程序中最后一個printf函
36、數(shù)中的輸出項表列可以函數(shù)中的輸出項表列可以改寫為改寫為p-num,p-name,p-sex,p-score 其其中中-稱為指向運算符。稱為指向運算符。請分析以下幾種運算:請分析以下幾種運算:p-n得到得到p指向的結(jié)構(gòu)體變量中的成員指向的結(jié)構(gòu)體變量中的成員n的值。的值。p-n+得到得到p指向的結(jié)構(gòu)體變量中的成員指向的結(jié)構(gòu)體變量中的成員n的值,的值,用完該值后使它加用完該值后使它加1。+p-n得到得到p指向的結(jié)構(gòu)體變量中的成員指向的結(jié)構(gòu)體變量中的成員n的的值使之加值使之加1(先加先加)。11.6.2指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針以前已經(jīng)介紹過,可以使用指向數(shù)組或數(shù)組元素的以前已經(jīng)介紹過,
37、可以使用指向數(shù)組或數(shù)組元素的指針和指針變量。同樣,對結(jié)構(gòu)體數(shù)組及其元素指針和指針變量。同樣,對結(jié)構(gòu)體數(shù)組及其元素也可以用指針或指針變量來指向。例也可以用指針或指針變量來指向。例11.4指向結(jié)構(gòu)指向結(jié)構(gòu)體數(shù)組的指針的應(yīng)用。體數(shù)組的指針的應(yīng)用。struct studentint num; char name20; char sex; int age; ; struct student stu3=10101,“Li Lin”,M,18,10102,“Zhang Fun”,M,19,10104,“ang Min”,F(xiàn),20;main() struct student*p; printf( No.Nam
38、esexagen); for(p=stu;pstu+3;p+)printf(%5d %-20s %2c %4dn,p-num, p-name, p-sex, p-age); 運行結(jié)果如下:運行結(jié)果如下: No Name sex age 10101 Li Lin M 18 10102 Zhang Fun M 19 10104 ang Min F 20p是指向是指向struct student結(jié)構(gòu)結(jié)構(gòu)體類型數(shù)據(jù)的指針變量。體類型數(shù)據(jù)的指針變量。在在for語句中先使語句中先使p的初值的初值為為stu,也就是數(shù)組,也就是數(shù)組stu的的起始地址,見圖起始地址,見圖11.8中中p的指向。在第一次循環(huán)中的指
39、向。在第一次循環(huán)中輸出輸出stu0的各個成員值。的各個成員值。然后執(zhí)行然后執(zhí)行p+,使,使p自加自加1。p加加1意味著意味著p所增加的值所增加的值為結(jié)構(gòu)體數(shù)組為結(jié)構(gòu)體數(shù)組stu的一個的一個元素所占的字節(jié)數(shù)元素所占的字節(jié)數(shù)(在本在本例中為例中為2+20+1+2=25字字節(jié)節(jié))。執(zhí)行。執(zhí)行p+后后p的值等的值等圖圖11.811.8于于stu+1,p指向指向stu1的起始地址,見圖的起始地址,見圖11.8中中p的指向。在第二次循環(huán)中輸出的指向。在第二次循環(huán)中輸出stu1的各成員值。的各成員值。在執(zhí)行在執(zhí)行p+后,后,p的值等于的值等于stu+2,它的指向見圖,它的指向見圖11.8中的中的p。再輸出。
40、再輸出stu2的各成員值。的各成員值。在執(zhí)行在執(zhí)行p+后,后,p的值變?yōu)榈闹底優(yōu)閟tu+3, 已不再小于已不再小于stu+3了,不再執(zhí)行循環(huán)。了,不再執(zhí)行循環(huán)。注意以下兩點:注意以下兩點:(1) 如果如果p的初值為的初值為stu,即指向第一個元素,則,即指向第一個元素,則p加加1后后p就指向下一個元素的起始地址。例如:就指向下一個元素的起始地址。例如:(+p)-num先使先使p自加自加1,然后得到它指向的元素,然后得到它指向的元素中的中的num成員值成員值(即即10102)。(p+)-num先得到先得到p-num的值的值(即即10101),然后,然后使使p自加自加1,指向,指向stu1。請注意
41、以上二者的不同。請注意以上二者的不同。(2) 程序已定義了程序已定義了p是一個指向是一個指向struct student類型數(shù)類型數(shù)據(jù)的指針變量,它用來指向一個據(jù)的指針變量,它用來指向一個struct student型型的數(shù)據(jù)的數(shù)據(jù)(在例在例11.4中中p的值是的值是stu數(shù)組的一個元素數(shù)組的一個元素(如如stu0,stu1)的起始地址的起始地址),不應(yīng)用來指向,不應(yīng)用來指向stu數(shù)組數(shù)組元素中的某一成員。例如,下面的用法是不對的:元素中的某一成員。例如,下面的用法是不對的:p=stu1name編譯時將給出警告信息,表示地址的類型不匹配。編譯時將給出警告信息,表示地址的類型不匹配。千萬不要認(rèn)為
42、反正千萬不要認(rèn)為反正p是存放地址的,可以將任何地是存放地址的,可以將任何地址賦給它。如果地址類型不相同,可以用強制類址賦給它。如果地址類型不相同,可以用強制類型轉(zhuǎn)換。例如:型轉(zhuǎn)換。例如:p=(structstudent *)stu0name;此時,此時,p的值是的值是stu0 元素的元素的name成員的起始地址。成員的起始地址??梢杂每梢杂谩皃rintf(%s,p);”輸出輸出stu0中成員中成員name的值,但是,的值,但是,p仍保持原來的類型。執(zhí)行仍保持原來的類型。執(zhí)行“printf(%s,p+1);”,則會輸出,則會輸出stu1中中name的值。執(zhí)行的值。執(zhí)行p+1時,時,p的值增加了結(jié)
43、構(gòu)體的值增加了結(jié)構(gòu)體struct student的長度。的長度。11.6.3用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)數(shù)將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有3種方種方法:法:(1) 用結(jié)構(gòu)體變量的成員作參數(shù)。例如,用用結(jié)構(gòu)體變量的成員作參數(shù)。例如,用stu1num或或stu2name作函數(shù)實參,將實參值作函數(shù)實參,將實參值傳給形參。用法和用普通變量作實參是一樣的,屬傳給形參。用法和用普通變量作實參是一樣的,屬于于“值傳遞值傳遞”方式。應(yīng)當(dāng)注意實參與形參的類型保方式。應(yīng)當(dāng)注意實參與形參的類型保持一致。持一致。(2)
44、用結(jié)構(gòu)體變量作實參。老版本的用結(jié)構(gòu)體變量作實參。老版本的C系統(tǒng)不允許用結(jié)系統(tǒng)不允許用結(jié)構(gòu)體變量作實參,構(gòu)體變量作實參,ANSI C取消了這一限制。但是用取消了這一限制。但是用結(jié)構(gòu)體變量作實參時,采取的是結(jié)構(gòu)體變量作實參時,采取的是“值傳遞值傳遞”的方的方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳遞給形參。形參也必須是同類型的結(jié)構(gòu)體變量。在函遞給形參。形參也必須是同類型的結(jié)構(gòu)體變量。在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種傳遞方式在數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種傳遞方式在空間和時間上開銷較大,如果結(jié)構(gòu)體的規(guī)模很大時,空間和時間上開銷較大,如
45、果結(jié)構(gòu)體的規(guī)模很大時,開銷是很可觀的。此外,由于采用值傳遞方式,如果開銷是很可觀的。此外,由于采用值傳遞方式,如果在執(zhí)行被調(diào)用函數(shù)期間謀淞誦尾在執(zhí)行被調(diào)用函數(shù)期間謀淞誦尾?也是結(jié)構(gòu)體變量也是結(jié)構(gòu)體變量)的的值,該值不能返回主調(diào)函數(shù),這往往造成使用上的不值,該值不能返回主調(diào)函數(shù),這往往造成使用上的不便。因此一般較少用這種方法。便。因此一般較少用這種方法。(3) 用指向結(jié)構(gòu)體變量用指向結(jié)構(gòu)體變量(或數(shù)組或數(shù)組)的指針作實參,將結(jié)構(gòu)體的指針作實參,將結(jié)構(gòu)體變量變量(或數(shù)組或數(shù)組)的地址傳給形參。的地址傳給形參。例例11.5有一個結(jié)構(gòu)體變量有一個結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號、姓名和,內(nèi)含學(xué)生學(xué)號、姓
46、名和3門門課的成績。要求在課的成績。要求在main函數(shù)中賦以值,在另一函數(shù)函數(shù)中賦以值,在另一函數(shù)print中將它們打印輸出。今用結(jié)構(gòu)體變量作函數(shù)參數(shù)。中將它們打印輸出。今用結(jié)構(gòu)體變量作函數(shù)參數(shù)。#include #define FORMAT %dn%sn%fn%fn%fnstruct student int num; char name20; float score3; ; main() void print(struct student); struct student stu; stunum=12345; strcpy(stuname,Li Li); stuscore0=675; stu
47、score1=89; stuscore2=786; print(stu); void print(struct student stu) printf(FORMAT,stu.num,, stu.score0, stu.score1,stu.score2); printf(n);運行結(jié)果為:運行結(jié)果為: 12345Li Li6750000089000000 78599998struct student被定義為外部類型,這樣,同一源文被定義為外部類型,這樣,同一源文件中的各個函數(shù)都可以用它來定義變量的類型。件中的各個函數(shù)都可以用它來定義變量的類型。main函數(shù)中的函數(shù)中的stu定義
48、為定義為struct student類型變量,類型變量,print函數(shù)中的形參函數(shù)中的形參stu也定義為也定義為struct student類型類型變量。在變量。在main函數(shù)中對函數(shù)中對stu的各成員賦值。在調(diào)用的各成員賦值。在調(diào)用print函數(shù)時以函數(shù)時以stu為實參向形參為實參向形參stu實行實行“值傳遞值傳遞”。在在print函數(shù)中輸出結(jié)構(gòu)體變量函數(shù)中輸出結(jié)構(gòu)體變量stu各成員的值。各成員的值。例例11.6將上題改用指向結(jié)構(gòu)體變量的指針作實參。將上題改用指向結(jié)構(gòu)體變量的指針作實參??梢栽谏厦娉绦虻幕A(chǔ)上作少量修改即可。請注意可以在上面程序的基礎(chǔ)上作少量修改即可。請注意程序注釋。程序注釋
49、。#define FORMAT %dn%sn%fn%fn%fnstruct student int num; char name20; float score3;stu=12345,Li Li,67.5,89,78.6; main() void print(struct student *); /*形參類型修改成指向結(jié)形參類型修改成指向結(jié)構(gòu)體的指針變量構(gòu)體的指針變量*/ print(&stu); /*實參改為實參改為stu的起始地址的起始地址*/ void print(struct student *p) /*形參類型修改了形參類型修改了*/ printf(FORMAT,p-num,p
50、-name,p-score0,p-score1,p-score2);/*用指針變量用指針變量調(diào)用各成員之值調(diào)用各成員之值*/ printf(n); 此程序改用在定義結(jié)構(gòu)體變量此程序改用在定義結(jié)構(gòu)體變量stu時賦初值,這樣程序可簡化些。時賦初值,這樣程序可簡化些。print函數(shù)中的形圖函數(shù)中的形圖11.9參參p被定被定義為指向義為指向struct student類型數(shù)據(jù)類型數(shù)據(jù)的指針變量。注意在調(diào)用的指針變量。注意在調(diào)用print函數(shù)時,用結(jié)構(gòu)體變量函數(shù)時,用結(jié)構(gòu)體變量stu的起的起始地址始地址&stu作實參。在調(diào)用函作實參。在調(diào)用函數(shù)時將該地址傳送給形參數(shù)時將該地址傳送給形參p(p是是
51、指針變量指針變量)。這樣。這樣p就指向就指向stu,見圖見圖11.9。在。在print函數(shù)中輸出函數(shù)中輸出p所指向的結(jié)構(gòu)體變量的各個成員所指向的結(jié)構(gòu)體變量的各個成員值,它們也就是值,它們也就是stu的成員值。的成員值。圖圖11.9main函數(shù)中的對各成員賦值也可以改用函數(shù)中的對各成員賦值也可以改用scanf函數(shù)輸函數(shù)輸入。即用入。即用scanf(%d%s%f%f%f,&stunum,stuname,&stuscore0,&stuscore1,&stuscore2);輸入時用下面形式輸入:輸入時用下面形式輸入:12345Li-Li67589786注意:輸入項表列中
52、注意:輸入項表列中stuname前沒有前沒有“&”符號,符號,因為因為stuname是字符數(shù)組名,本身代表地址,不是字符數(shù)組名,本身代表地址,不應(yīng)寫成應(yīng)寫成&stuname。用指針作函數(shù)參數(shù)比較好,能提高運行效率。用指針作函數(shù)參數(shù)比較好,能提高運行效率。11.7用指針處理鏈表用指針處理鏈表11.7.1鏈表概述鏈表概述 鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)地鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)地進(jìn)行存儲分配的一種結(jié)構(gòu)。我們知道,用數(shù)組存進(jìn)行存儲分配的一種結(jié)構(gòu)。我們知道,用數(shù)組存放數(shù)據(jù)時,必須事先定義固定的長度放數(shù)據(jù)時,必須事先定義固定的長度( (即元素個即元素個數(shù)數(shù)) )
53、。比如,有的班級有。比如,有的班級有100100人,而有的班只有人,而有的班只有3030人,如果要用同一個數(shù)組先后存放不同班級的學(xué)人,如果要用同一個數(shù)組先后存放不同班級的學(xué)生數(shù)據(jù),則必須定義長度為生數(shù)據(jù),則必須定義長度為100100的數(shù)組。如果事先的數(shù)組。如果事先難以確定一個班的最多人數(shù),則必須把數(shù)組定得難以確定一個班的最多人數(shù),則必須把數(shù)組定得足夠大,以能存放任何班級的學(xué)生數(shù)據(jù)。顯然這足夠大,以能存放任何班級的學(xué)生數(shù)據(jù)。顯然這將會浪費內(nèi)存。鏈表則沒有這種缺點,它根據(jù)需將會浪費內(nèi)存。鏈表則沒有這種缺點,它根據(jù)需要開辟內(nèi)存單元。圖要開辟內(nèi)存單元。圖11.1011.10表示最簡單的一種鏈表表示最簡
54、單的一種鏈表( (單向鏈表單向鏈表) )的結(jié)構(gòu)。的結(jié)構(gòu)。圖圖11.10鏈表有一個鏈表有一個“頭指針頭指針”變量,圖中以變量,圖中以head表示,它存放表示,它存放一個地址。該地址指向一個元素。鏈表中每一個元素一個地址。該地址指向一個元素。鏈表中每一個元素稱為稱為“結(jié)點結(jié)點”,每個結(jié)點都應(yīng)包括兩個部分:一為用,每個結(jié)點都應(yīng)包括兩個部分:一為用戶需要用的實際數(shù)據(jù),二為下一個結(jié)點的地址??梢詰粜枰玫膶嶋H數(shù)據(jù),二為下一個結(jié)點的地址。可以看出,看出,head指向第一個元素;第一個元素又指向第二指向第一個元素;第一個元素又指向第二個元素個元素直到最后一個元素,該元素不再指向其他直到最后一個元素,該元素不
55、再指向其他元素,它稱為元素,它稱為“表尾表尾”,它的地址部分放一個,它的地址部分放一個“NULL”(表示表示“空地址空地址”),鏈表到此結(jié)束。,鏈表到此結(jié)束??梢钥吹芥湵碇懈髟卦趦?nèi)存中可以不是連續(xù)存放可以看到鏈表中各元素在內(nèi)存中可以不是連續(xù)存放的。要找某一元素,必須先找到上一個元素,根的。要找某一元素,必須先找到上一個元素,根據(jù)它提供的下一元素地址才能找到下一個元素。據(jù)它提供的下一元素地址才能找到下一個元素。如果不提供如果不提供“頭指針頭指針”(head),則整個鏈表都無,則整個鏈表都無法訪問。鏈表如同一條鐵鏈一樣,一環(huán)扣一環(huán),法訪問。鏈表如同一條鐵鏈一樣,一環(huán)扣一環(huán),中間是不能斷開的。打個
56、通俗的比方:幼兒園的中間是不能斷開的。打個通俗的比方:幼兒園的老師帶領(lǐng)孩子出來散步,老師牽著第一個小孩的老師帶領(lǐng)孩子出來散步,老師牽著第一個小孩的手,第一個小孩的另一只手牽著第二個孩子手,第一個小孩的另一只手牽著第二個孩子這就是一個這就是一個“鏈鏈”,最后一個孩子有一只手空著,最后一個孩子有一只手空著,他是他是“鏈尾鏈尾”。要找這個隊伍,必須先找到老師,。要找這個隊伍,必須先找到老師,然后順序找到每一個孩子。然后順序找到每一個孩子??梢钥吹?,這種鏈表的數(shù)據(jù)結(jié)構(gòu),必須利用指針變可以看到,這種鏈表的數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實現(xiàn)。即:一個結(jié)點中應(yīng)包含一個指針變量才能實現(xiàn)。即:一個結(jié)點中應(yīng)包含一
57、個指針變量,用它存放下一結(jié)點的地址。量,用它存放下一結(jié)點的地址。前面介紹了結(jié)構(gòu)體變量,用它作鏈表中的結(jié)點是最前面介紹了結(jié)構(gòu)體變量,用它作鏈表中的結(jié)點是最合適的。一個結(jié)構(gòu)體變量包含若干成員,這些成合適的。一個結(jié)構(gòu)體變量包含若干成員,這些成員可以是數(shù)值類型、字符類型、數(shù)組類型,也可員可以是數(shù)值類型、字符類型、數(shù)組類型,也可以是指針類型。我們用這個指針類型成員來存放以是指針類型。我們用這個指針類型成員來存放下一個結(jié)點的地址。例如,可以設(shè)計這樣一個結(jié)下一個結(jié)點的地址。例如,可以設(shè)計這樣一個結(jié)構(gòu)體類型:構(gòu)體類型:structstudentintnum; floatscore; structstudent
58、next;其中成員其中成員num和和score用來存放結(jié)點中的有用數(shù)據(jù)用來存放結(jié)點中的有用數(shù)據(jù)(用用戶需要用到的數(shù)據(jù)戶需要用到的數(shù)據(jù)),相當(dāng)于圖,相當(dāng)于圖11.10結(jié)點中的結(jié)點中的A,B,C,D。next是指針類型的成員,它指向是指針類型的成員,它指向struct student類型數(shù)據(jù)類型數(shù)據(jù)(這就是這就是next所在的結(jié)構(gòu)體類型所在的結(jié)構(gòu)體類型)。一個指針類型的成員既可以指向其他類型的結(jié)構(gòu)一個指針類型的成員既可以指向其他類型的結(jié)構(gòu)體數(shù)據(jù),也可以指向自己所在的結(jié)構(gòu)體類型的數(shù)體數(shù)據(jù),也可以指向自己所在的結(jié)構(gòu)體類型的數(shù)據(jù)?,F(xiàn)在,據(jù)。現(xiàn)在,next是是struct student類型中的一個成員,
59、類型中的一個成員,它又指向它又指向struct student類型的數(shù)據(jù)。用這種方法類型的數(shù)據(jù)。用這種方法就可以建立鏈表。見圖就可以建立鏈表。見圖11.11。圖圖11.11圖中每一個結(jié)點都屬于圖中每一個結(jié)點都屬于struct student類型,它的成類型,它的成員員next存放下一結(jié)點的地址,程序設(shè)計人員可以存放下一結(jié)點的地址,程序設(shè)計人員可以不必具體知道各結(jié)點的地址,只要保證將下一個不必具體知道各結(jié)點的地址,只要保證將下一個結(jié)點的地址放到前一結(jié)點的成員結(jié)點的地址放到前一結(jié)點的成員next中即可。請中即可。請注意:上面只是定義了一個注意:上面只是定義了一個struct student類型,類
60、型,并未實際分配存儲空間。只有定義了變量才分配并未實際分配存儲空間。只有定義了變量才分配內(nèi)存單元。內(nèi)存單元。11.7.2簡單鏈表簡單鏈表下面通過一個例子來說明如何建立和輸出一個簡單下面通過一個例子來說明如何建立和輸出一個簡單鏈表。鏈表。例例11.7 建立一個如圖建立一個如圖11.11所示的簡單鏈表,它由所示的簡單鏈表,它由3個學(xué)生數(shù)據(jù)的結(jié)點組成。輸出各結(jié)點中的數(shù)據(jù)。個學(xué)生數(shù)據(jù)的結(jié)點組成。輸出各結(jié)點中的數(shù)據(jù)。 #define NULL 0 struct student long num; float score; struct student *next; ; main() struct student a,b,c,*head,*p;a. num=99101; a.score=89.5;b. num=
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 供貨簡易合同范例
- 代理收購企業(yè)合同范本
- 三人合伙人合同范例
- 出售薄壁軸套合同范本
- 買賣合同加定金合同范本
- 單個產(chǎn)品供應(yīng)合同范本
- 代租商鋪合同范本
- 出售雜木方木合同范本
- 2025年吉林省安全員C證(專職安全員)考試題庫
- 南京臨時用工合同范本
- 正大集團(tuán)大豬場開發(fā)流程
- 高中政治必修四知識體系每單元的總體框架
- 房地產(chǎn)金融創(chuàng)新與風(fēng)險防范的理論演進(jìn)
- GB/T 41255-2022智能工廠通用技術(shù)要求
- GB/T 41029-2021石油天然氣鉆井海洋棄井作業(yè)規(guī)程
- 深入推進(jìn)依法行政
- GB/T 4026-1992電器設(shè)備接線端子和特定導(dǎo)線線端的識別及應(yīng)用字母數(shù)字系統(tǒng)的通則
- 馬工程教材《公共財政概論》PPT-第二章 公共財政職能
- GB/T 14643.5-2009工業(yè)循環(huán)冷卻水中菌藻的測定方法第5部分:硫酸鹽還原菌的測定MPN法
- GB/T 13762-2009土工合成材料土工布及土工布有關(guān)產(chǎn)品單位面積質(zhì)量的測定方法
- 醫(yī)院轉(zhuǎn)診轉(zhuǎn)院記錄單
評論
0/150
提交評論