第9章結(jié)構(gòu)體、共用體和枚舉類型數(shù)據(jù)_第1頁
第9章結(jié)構(gòu)體、共用體和枚舉類型數(shù)據(jù)_第2頁
第9章結(jié)構(gòu)體、共用體和枚舉類型數(shù)據(jù)_第3頁
第9章結(jié)構(gòu)體、共用體和枚舉類型數(shù)據(jù)_第4頁
第9章結(jié)構(gòu)體、共用體和枚舉類型數(shù)據(jù)_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、9.1 9.1 結(jié)構(gòu)體類型數(shù)據(jù)結(jié)構(gòu)體類型數(shù)據(jù)9.2 9.2 共用體類型數(shù)據(jù)共用體類型數(shù)據(jù)9.3 9.3 枚舉類型數(shù)據(jù)枚舉類型數(shù)據(jù)9.4 9.4 用用typedeftypedef定義類型定義類型9.5 9.5 動態(tài)存儲分配動態(tài)存儲分配鏈表鏈表 “結(jié)構(gòu)結(jié)構(gòu)”是一種構(gòu)造類型,它是由若干是一種構(gòu)造類型,它是由若干“成員成員”組組成的。成的。 每一個成員可以是一個基本數(shù)據(jù)類型或者又是一每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型。個構(gòu)造類型。 結(jié)構(gòu)既是一種結(jié)構(gòu)既是一種“構(gòu)造構(gòu)造”而成的數(shù)據(jù)類型,而成的數(shù)據(jù)類型,在說明和使用之前必須先定義它,如同在說明和調(diào)用函在說明和使用之前必須先定義它,如同在說

2、明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。數(shù)之前要先定義函數(shù)一樣。 結(jié)構(gòu)體(結(jié)構(gòu)體(structure)相當于其它高級語言中的相當于其它高級語言中的“記記錄錄”。10010lifunm87.518 beijingnum name sex score age addr定義一個結(jié)構(gòu)的一般形式為:定義一個結(jié)構(gòu)的一般形式為: struct 結(jié)構(gòu)名結(jié)構(gòu)名 成員表列成員表列 ;struct stuint num;char name20;char sex;float score; 成員名的命名應(yīng)符合標識符的成員名的命名應(yīng)符合標識符的書寫規(guī)定。例如:書寫規(guī)定。例如: 對每個成員也必須作類型說明,其形式為:對每個成員也

3、必須作類型說明,其形式為: 類型說明符類型說明符 成員名成員名;1)先定義結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量)先定義結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量例:例: struct student int num; char name20; char sex; int age; float score; char addr30;struct student x1, x2; 則則 x1, x2為為student 結(jié)構(gòu)型變量,結(jié)構(gòu)型變量,x1, x2可存放可存放student類類型數(shù)據(jù)。型數(shù)據(jù)。類型標識符類型標識符結(jié)構(gòu)體變量定義結(jié)構(gòu)體變量定義: :例:例:struct student int num; char name

4、20; char sex; int age; char addr30; x1, x2; 成員表列成員表列 變量名表列;變量名表列;2)2)在定義結(jié)構(gòu)體類型的同時定義變量在定義結(jié)構(gòu)體類型的同時定義變量:定義形式定義形式 struct 結(jié)構(gòu)體名結(jié)構(gòu)體名定義形式定義形式 struct 成員表列成員表列 變量名表列;變量名表列;不出現(xiàn)結(jié)構(gòu)體類型名不出現(xiàn)結(jié)構(gòu)體類型名3. 3. 直接定義結(jié)構(gòu)類型變量直接定義結(jié)構(gòu)類型變量如如:struct int num char name20; char sex; int age; char addr30; x1, x2;1. 類型名與變量名是不同的概念類型名與變量名是不

5、同的概念2. 每一個成員的作用如同該類型的變量每一個成員的作用如同該類型的變量3. 成員名與程序中的變量名可相同但意義不同成員名與程序中的變量名可相同但意義不同幾點幾點說明說明: :struct date int month; int day; int year; ;補充:結(jié)構(gòu)補充:結(jié)構(gòu)體體的嵌套定義的嵌套定義 x1或或x2numname sex agebirthdaymonth dayyearaddrstruct student int num; char name20; char sex; int age; struct date birthday; char addr30; x1, x2

6、;結(jié)構(gòu)的初始化就是指結(jié)構(gòu)變量的初始化;先結(jié)構(gòu)的初始化就是指結(jié)構(gòu)變量的初始化;先定義結(jié)構(gòu),在定義結(jié)構(gòu)變量時對每個成員賦初值定義結(jié)構(gòu),在定義結(jié)構(gòu)變量時對每個成員賦初值 struct student x1=8906, li ming , m, 85.5;如:如:struct student unsigned no;char name20;char sex;float score;; 若若 x1 的起始的起始地址為地址為2000,則,則 x1 在內(nèi)存中占有在內(nèi)存中占有的存儲單元為:的存儲單元為:共用共用27個字節(jié)個字節(jié)的連續(xù)單元的連續(xù)單元8906no2000200220212022name20limi

7、ngm85.50 2023sexscore2026結(jié)構(gòu)定義與變量定義及初始化合二為一:結(jié)構(gòu)定義與變量定義及初始化合二為一: struct exp int a; float b; char yn8; x=1234, 56. 7, test; 但不能這樣寫:但不能這樣寫: struct exp int a=1234; float b=56.7; char yn8=test; x; 如如:x1為為struct student型變量,則型變量,則 x1.no: 表示表示x1的學號的學號 : 表示表示x1的名字的名字 訪問結(jié)構(gòu)變量實質(zhì)上是引用其成員訪問結(jié)構(gòu)變量實質(zhì)上是引用其成員;有兩種有兩

8、種運算符可訪問結(jié)構(gòu)成員運算符可訪問結(jié)構(gòu)成員1)圓點運算符圓點運算符注意:注意:1. 1. 只能用變量的成員,不可用結(jié)構(gòu)變量名直接運算。只能用變量的成員,不可用結(jié)構(gòu)變量名直接運算。2. 2. 每一個成員的作用與其同類型的簡單變量的引用每一個成員的作用與其同類型的簡單變量的引用相同。相同。2 2)箭頭運算符:箭頭運算符: 例:例:struct student char name 10; char sex; int age; float score; char addr20; x1;struct student p;則則p為結(jié)構(gòu)指針變量,它可用來存為結(jié)構(gòu)指針變量,它可用來存放放student型變量的

9、地址型變量的地址令令 p=&x1; 則則 p為為x1的首地址的首地址.namesexaddrpx1agescore訪問結(jié)構(gòu)成員:訪問結(jié)構(gòu)成員:pname 表示表示x1的姓名;等價于的姓名;等價于 (*p).name或或page 表示表示x1的年的年齡齡;等價于;等價于 (*p).age或或x1.age若有若有 struct student h;則:則:scanf(%s, &h);printf(%s, h);錯誤錯誤原因:原因:結(jié)構(gòu)體變量中包含有多個不同類型的數(shù)據(jù)項。結(jié)構(gòu)體變量中包含有多個不同類型的數(shù)據(jù)項。正確方法:正確方法:對結(jié)構(gòu)體變量各成員的值進行輸入對結(jié)構(gòu)體變量各成員的值進行

10、輸入/輸出。輸出。如如上例上例:scanf(%d%s, &h.num, &); printf(%d%s, h.num, ); 只能對結(jié)構(gòu)變量的成員進行輸入只能對結(jié)構(gòu)變量的成員進行輸入/輸出輸出 結(jié)構(gòu)數(shù)組的定義方法和結(jié)構(gòu)變量相似(也有三種方結(jié)構(gòu)數(shù)組的定義方法和結(jié)構(gòu)變量相似(也有三種方法),只需說明它為數(shù)組類型即可。例如:法),只需說明它為數(shù)組類型即可。例如: struct stuint num;char *name;char sex;float score;boy5; struct stuint num;char *name;char sex;float score; s

11、truct stu boy5;struct int num;char *name;char sex;float score;boy5; 對外部結(jié)構(gòu)數(shù)組或靜態(tài)結(jié)構(gòu)數(shù)組可以作初始化賦值,例對外部結(jié)構(gòu)數(shù)組或靜態(tài)結(jié)構(gòu)數(shù)組可以作初始化賦值,例如:如: struct stuint num;char *name;char sex;float score;boy5=101,li ping,m,45,102,zhang ping,m,62.5,103,he fang,f,92.5,104,cheng ling,f,87,105,wang ming,m,58 ;注:當對全部元素作初始注:當對全部元素作初始化賦值時

12、,也可不給出數(shù)化賦值時,也可不給出數(shù)組長度。組長度。 main() int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=boyi.score; if(boyi.score60) c+=1; printf(s=%fn,s); ave=s/5; printf(average=%fncount=%dn,ave,c); struct tree int x; char *s; t;void fun(struct tree a ) printf(%d, %sn, a.x, a.s); #include main( ) t.x=6; t.s=minicomputer;fu

13、n(t);結(jié)果:結(jié)果:6, minicomputer一個指針變量當用來指向一個結(jié)構(gòu)變量時,稱之為結(jié)一個指針變量當用來指向一個結(jié)構(gòu)變量時,稱之為結(jié)構(gòu)指針變量。結(jié)構(gòu)指針變量中的值是所指向的結(jié)構(gòu)變量構(gòu)指針變量。結(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)指針變量名例如,在前面的例題中定義了例如,在前面的例題中定義了stu這個結(jié)構(gòu),如要說明這個結(jié)構(gòu),如要說明一個指向一個指向stu的指針變量的指針變量pstu,可寫為:可寫為: struct stu *pstu;當然也可在定義當然也可

14、在定義stu結(jié)構(gòu)時同時說明結(jié)構(gòu)時同時說明pstu。與前面討論的各類指針變量相同,結(jié)構(gòu)指針變量與前面討論的各類指針變量相同,結(jié)構(gòu)指針變量也必須要先賦值后才能使用。也必須要先賦值后才能使用。 賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量。如果能把結(jié)構(gòu)名賦予該指針變量。如果boy是被說明為是被說明為stu類型的結(jié)構(gòu)變量,則:類型的結(jié)構(gòu)變量,則: pstu=&boy是正確的,是正確的,而:而: pstu=&stu是錯誤的。是錯誤的。其訪問的一般形式為:其訪問的一般形式為: (*結(jié)構(gòu)指針變量結(jié)構(gòu)指針變量).成員名成員名或為:或為: 結(jié)構(gòu)指針

15、變量結(jié)構(gòu)指針變量-成員名成員名例如:例如: (*pstu).num 或者:或者: pstu-num應(yīng)該注意應(yīng)該注意(*pstu)兩側(cè)的括號不可少,因為成員符兩側(cè)的括號不可少,因為成員符“.”的優(yōu)先級高于的優(yōu)先級高于“*”。如去掉括號寫作。如去掉括號寫作*pstu.num則等則等效于效于*(pstu.num),這樣,意義就完全不對了。這樣,意義就完全不對了。 指針變量可以指向一個結(jié)構(gòu)數(shù)組,這時結(jié)構(gòu)指針變指針變量可以指向一個結(jié)構(gòu)數(shù)組,這時結(jié)構(gòu)指針變量的值是整個結(jié)構(gòu)數(shù)組的首地址。結(jié)構(gòu)指針變量也可量的值是整個結(jié)構(gòu)數(shù)組的首地址。結(jié)構(gòu)指針變量也可指向結(jié)構(gòu)數(shù)組的一個元素,這時結(jié)構(gòu)指針變量的值是指向結(jié)構(gòu)數(shù)組的

16、一個元素,這時結(jié)構(gòu)指針變量的值是該結(jié)構(gòu)數(shù)組元素的首地址。該結(jié)構(gòu)數(shù)組元素的首地址。 設(shè)設(shè)ps為指向結(jié)構(gòu)數(shù)組的指針變量,則為指向結(jié)構(gòu)數(shù)組的指針變量,則ps也指向該也指向該結(jié)構(gòu)數(shù)組的結(jié)構(gòu)數(shù)組的0號元素,號元素,ps+1指向指向1號元素,號元素,ps+i則指向則指向i號元素。這與普通數(shù)組的情況是一致的。號元素。這與普通數(shù)組的情況是一致的。 例例 用指針用指針變量輸出結(jié)構(gòu)數(shù)組。變量輸出結(jié)構(gòu)數(shù)組。main()struct stu *ps; printf(notnametttsextscoretn); for(ps=boy;psnum,ps-name,ps-sex,ps-score);struct stu

17、int num; char *name; char sex; float score; boy5= 101,zhou ping,m,45, 102,zhang ping,m,62.5, 103,liou fang,f,92.5, 104,cheng ling,f,87, 105,wang ming,m,58, ;應(yīng)該注意的是,一個結(jié)構(gòu)指針變量雖然可以用來訪問應(yīng)該注意的是,一個結(jié)構(gòu)指針變量雖然可以用來訪問結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素的成員,但是,不能使它指結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素的成員,但是,不能使它指向一個成員。也就是說不允許取一個成員的地址來賦向一個成員。也就是說不允許取一個成員的地址來賦予它。因此

18、,下面的賦值是錯誤的。予它。因此,下面的賦值是錯誤的。ps=&boy1.sex;而只能是:而只能是: ps=boy;(賦予數(shù)組首地址賦予數(shù)組首地址)或者是:或者是:ps=&boy0;(賦予賦予0號元素首地址號元素首地址) 什么是共用體?它是幾個不同的變量共同占用同什么是共用體?它是幾個不同的變量共同占用同一段內(nèi)存空間的結(jié)構(gòu)。這幾個不同的變量可以具有一段內(nèi)存空間的結(jié)構(gòu)。這幾個不同的變量可以具有不同的類型,但具有相同的指針(地址)。不同的類型,但具有相同的指針(地址)。 定義共用體定義共用體 union 共用體名共用體名 成員表列成員表列 ; 例如:例如:union data int x; cha

19、r y; float z; ;共用體變量的說明和結(jié)構(gòu)變量的說明方式相同,共用體變量的說明和結(jié)構(gòu)變量的說明方式相同, 也也有三種形式。有三種形式。 union data int x; char y; float z a,b;union /*無類型名無類型名*/ int x; char y; float z a,b;union data int x; char y; float z ;union data a,b;(1)雖然共用體變量可以存儲幾種不同類型的成員,)雖然共用體變量可以存儲幾種不同類型的成員,但在在同一時刻,只能存儲其中的一個,即只能有一但在在同一時刻,只能存儲其中的一個,即只能有一個

20、成員起作用。個成員起作用。(2)共用體變量中起作用的是最后一次存放的成員,)共用體變量中起作用的是最后一次存放的成員,以前存放的成員皆失效。例如順序執(zhí)行以前存放的成員皆失效。例如順序執(zhí)行 a.x=12; a.y=a; a.z=23.5;語句后,只有成員語句后,只有成員a.z 有效。有效。(3)共用體變量的地址和它的各成員的地址都相同。)共用體變量的地址和它的各成員的地址都相同。即即&a、&a.、&a.、&a.的地址都相同。的地址都相同。(4)不能單獨引用共用體變量名,也不能在定義共)不能單獨引用共用體變量名,也不能在定義共用體變量時對其初始化。用體變量時對其初始化。 例如:例如:union d

21、ata int x; char y; float z a=12,e,12.5; a=12;m=a; 都是錯誤的。都是錯誤的。(5)在結(jié)構(gòu)體類型的定義中可以有共用體類型的成)在結(jié)構(gòu)體類型的定義中可以有共用體類型的成員;也可定義共用體類型的數(shù)組。反之亦然。員;也可定義共用體類型的數(shù)組。反之亦然。 例例 建立學生與教師的簡表,內(nèi)容有:建立學生與教師的簡表,內(nèi)容有:name、job、class、position。表中前表中前2項一樣,第項一樣,第3項采用共用體數(shù)項采用共用體數(shù)據(jù):即據(jù):即job為為s(學生)時,第學生)時,第3項采用項采用class(班級);班級);job為為t(教師)時,第教師)時,

22、第3項采用項采用position(職務(wù))。職務(wù))。 struct char name20; char job; union int class; char position10; cat; person10; main()() int n; for(n=0;n10;n+) scanf(“%s %c”,personn .name,& personn .job);); if(personn .job=s) scanf(“%d”,&personn.cat.class);); else scanf(“%s”,personn.cat.position); printf(“n”);); for(n=0;n

23、 sun) if(workday= sun) 不能把一個整數(shù)直接賦予枚舉變量。例如:不能把一個整數(shù)直接賦予枚舉變量。例如: workday=2 ;是錯誤的,是錯誤的, 原因在于它們類型不一致,可通過強制類型轉(zhuǎn)換把原因在于它們類型不一致,可通過強制類型轉(zhuǎn)換把一個整數(shù)直接賦予枚舉變量,例如:一個整數(shù)直接賦予枚舉變量,例如:workday=(enum weekday)2;是可行的。是可行的。 嚴格的說,枚舉變量和常量是不能做算術(shù)運算的,例嚴格的說,枚舉變量和常量是不能做算術(shù)運算的,例如如workday+、weekend=workday+wed是不允許的,但有是不允許的,但有些系統(tǒng)采用警告的方式,但不

24、禁止,也就是說系統(tǒng)將按枚些系統(tǒng)采用警告的方式,但不禁止,也就是說系統(tǒng)將按枚舉變量和常量的值做算術(shù)運算。舉變量和常量的值做算術(shù)運算。用用戶喜歡的名字來替換這些類型名,再用用戶自定用用戶喜歡的名字來替換這些類型名,再用用戶自定義這些類型名去定義相關(guān)的變量。例如:義這些類型名去定義相關(guān)的變量。例如:typedef int integer; /*用用integer 代替代替int 類型類型*/typedef float real; /*用用real代替代替float 類型類型*/ integer a,b; /*定義整型變量定義整型變量a,b */ real x,y /*定義實型變量定義實型變量x,y

25、*/ typedef int integer; integer m,n; typedef float real; real x,y; typedef char character; character c,d; typedef int * int_pointer; int_pointer p1,p2;(;(整型指針)整型指針) typedef char * ch_p; ch_p pa,pb20;(;(字符型指針)字符型指針) typedef int num8; num a,b;(;(含含8個元素的整型數(shù)組)個元素的整型數(shù)組) typedef char(*cp)10; cp pn;(;(指向一維

26、數(shù)組的指針)指向一維數(shù)組的指針) typedef float(*pfun)();)(); pfun fp;(;(指向函數(shù)的指針)指向函數(shù)的指針) typedef struct int day; int month; int year; date; date birthday,rest;(;(結(jié)構(gòu)體)結(jié)構(gòu)體) typedef union char a; int b; float c; data; data x,y,z;(;(共用體)共用體) typedef enumred,green,bluecolor; color tv;(;(枚舉類型)枚舉類型) 1、設(shè)有如下定義:、設(shè)有如下定義: stru

27、ct sk int a; float b; data, *p; 若有若有p=&data;,則對則對data中的中的a域的正確引用是域的正確引用是_. a) (*p).data.a b) (*p).a c) pdata.a d) p.data.a2、以下對枚舉類型名的定義中正確的是以下對枚舉類型名的定義中正確的是_. a) enum a=one,two,three; b) enum aone=9,two=-1,three; c) enum a=“one”,”two”,”three”; d) enum a“one”,”two”,”three”;3、變量、變量a所占的內(nèi)存字節(jié)數(shù)是所占的內(nèi)存字節(jié)數(shù)是_

28、. a) 4 b) 5 c) 6 d) 8 union u char st4; int i; long l; ; struct a int c; union u u; a;4、下列程序的輸出結(jié)果是、下列程序的輸出結(jié)果是_.#includemain( ) union int k; char i2; *s,a; s=&a; (*s).i0=0 x39;(*s).i1=0 x38; printf(“%xn”,(*s).k); a) 3839 b) 3938 c) 380039 d) 3900385、以下程序的輸出結(jié)果是、以下程序的輸出結(jié)果是_. main() union char i2; int k

29、; r; r.i02; r.i1=0; printf(“%dn”, r.k); a) 2 b) 1 c) 0 d) 不確定不確定6、以下程序、以下程序 #include struct stu int num; char name10; int age; void fun(struct stu *p) printf(“%sn”,(*p).name); main() struct stu student3=9801,”zhang”,20, 9802,”wang”,19,9803,”zhao”,18; fun(student+2); 輸出結(jié)果是輸出結(jié)果是_.a) zhang b) zhao c) w

30、ang d) 187、下面程序的輸出為、下面程序的輸出為_.struct st int x; int *y;*p; int dt4=10,20,30,40;struct st aa4=50,&dt0,60,&dt1,70,&dt2,80,&dt3;main() p=aa; printf(“%dn”,+p -x); printf(“%dn”,(+p) -x); printf(“%dn”,+(*p -y);a) 10 b) 50 c) 51 d) 60 20 60 60 70 20 21 21 31 8、以下各項企圖說明一種新的類型名,其中正、以下各項企圖說明一種新的類型名,其中正確的是確的是_.

31、a) typedef v1 int; b) typedef v2=int;c) typedef int v3; d) type v4;int;9、設(shè)有以下語句設(shè)有以下語句 typedef struct s int f; char h; t; 則下面敘述正確的是則下面敘述正確的是_.a) 可用可用s定義結(jié)構(gòu)變量定義結(jié)構(gòu)變量 b) 可用可用t定義結(jié)構(gòu)變量定義結(jié)構(gòu)變量c) s是是struct類型的變量類型的變量 d) t是是struct類型的變類型的變量量鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)地進鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)。行存儲分配的一種結(jié)構(gòu)。首指針首指針數(shù)

32、數(shù) 據(jù)據(jù) 指指 針針 數(shù)數(shù) 據(jù)據(jù) 指指 針針 數(shù)數(shù) 據(jù)據(jù) 指指 針針 數(shù)數(shù) 據(jù)據(jù) null 鏈表是一種由首指針和若干結(jié)點組成的數(shù)據(jù)鏈,形式如下:鏈表是一種由首指針和若干結(jié)點組成的數(shù)據(jù)鏈,形式如下: a b c d 鏈表的特點是:鏈表的特點是:其中首指針是不能少的,它含有結(jié)點其中首指針是不能少的,它含有結(jié)點a的起始地址,只有通過的起始地址,只有通過它才能找到后面各結(jié)點。且首指針千萬不能丟失,否則鏈表將丟它才能找到后面各結(jié)點。且首指針千萬不能丟失,否則鏈表將丟失。失。各結(jié)點是鏈接在一起的,結(jié)點各結(jié)點是鏈接在一起的,結(jié)點a的指針域包含結(jié)點的指針域包含結(jié)點b的起始地址的起始地址,結(jié)點,結(jié)點b的指針域包

33、含結(jié)點的指針域包含結(jié)點c的起始地址,依此類推。的起始地址,依此類推。最后一個結(jié)點最后一個結(jié)點d又稱又稱“表尾表尾”,表尾的指針域包含數(shù)據(jù),表尾的指針域包含數(shù)據(jù)null,表示是空地址,鏈表到此結(jié)束。表示是空地址,鏈表到此結(jié)束。由于結(jié)點中指針域的存在,各結(jié)點在內(nèi)存中占用的存儲空間不由于結(jié)點中指針域的存在,各結(jié)點在內(nèi)存中占用的存儲空間不要求必須是連續(xù)排列的。這是一個很重要的特點。要求必須是連續(xù)排列的。這是一個很重要的特點。鏈表結(jié)點含有二個域:數(shù)據(jù)域和指針域。數(shù)鏈表結(jié)點含有二個域:數(shù)據(jù)域和指針域。數(shù)據(jù)域可以包含用戶的各種類型的數(shù)據(jù);指針域是一據(jù)域可以包含用戶的各種類型的數(shù)據(jù);指針域是一個指向下一個結(jié)點

34、的指針變量。由此看出結(jié)點采用個指向下一個結(jié)點的指針變量。由此看出結(jié)點采用結(jié)構(gòu)體類型的數(shù)據(jù)結(jié)構(gòu)最合適。例如:結(jié)構(gòu)體類型的數(shù)據(jù)結(jié)構(gòu)最合適。例如: struct student int num; float score; struct student *next; ;其中:變量其中:變量num和和score是數(shù)據(jù)域的用戶數(shù)據(jù)。是數(shù)據(jù)域的用戶數(shù)據(jù)。 變量變量next是指針域的指針變量,用于指向下一個結(jié)是指針域的指針變量,用于指向下一個結(jié)點。點。 #include /*含含null的定義的定義*/main()() struct student a,b,c,*head,*p; a.num=1001;a.s

35、core=89;/*建立結(jié)點數(shù)據(jù)域建立結(jié)點數(shù)據(jù)域*/ b.num=1002;b.score=90; c.num=1003;c.score=86; head=&a;/*建立首指針變量建立首指針變量*/ a.next=&b;/*指向下一個結(jié)點指向下一個結(jié)點*/ b.next=&c; c.next=null;/*最后結(jié)點指針域為空指針最后結(jié)點指針域為空指針*/ for(p=head;p!=null;p=pnext) printf(“%ld %5.1fn”,pnum,pscore););注:我們此處建立的鏈表是一個注:我們此處建立的鏈表是一個“靜態(tài)鏈表靜態(tài)鏈表”,其特點是:,其特點是:各個結(jié)點是在程序

36、中預(yù)先以變量的形式開辟出來的,用完后也不各個結(jié)點是在程序中預(yù)先以變量的形式開辟出來的,用完后也不會主動釋放所占存儲空間。這對于需要大量鏈表的程序來說,無會主動釋放所占存儲空間。這對于需要大量鏈表的程序來說,無疑是一種極大的存儲空間浪費。疑是一種極大的存儲空間浪費。struct student long num; float score; struct student *next;例例 建立一個由建立一個由3個學生的數(shù)據(jù)為結(jié)點的鏈表。個學生的數(shù)據(jù)為結(jié)點的鏈表。1malloc函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型:void * malloc(unsigned int size);); 功能:在內(nèi)存的動態(tài)存儲

37、區(qū),分配一個長度為功能:在內(nèi)存的動態(tài)存儲區(qū),分配一個長度為size個字節(jié)的個字節(jié)的連續(xù)存儲空間;并返回一個指針,該指針就是已分配的存儲空間連續(xù)存儲空間;并返回一個指針,該指針就是已分配的存儲空間的起始地址的起始地址 (基類型是基類型是void)。若函數(shù)調(diào)用失敗,例如內(nèi)存空間不若函數(shù)調(diào)用失敗,例如內(nèi)存空間不足,則返回空指針足,則返回空指針(null)。此函數(shù)常用于為鏈表的結(jié)點開辟存此函數(shù)常用于為鏈表的結(jié)點開辟存儲空間,例如:儲空間,例如: struct student long num; float score; struct student *next;main()() struct stud

38、ent *head,*p; p=(struct student *)malloc(sizeof(struct student);); head=p;pnum=1001;pscore=99; 2calloc函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型: void * calloc(unsigned n ,unsigned size);); 功能:在內(nèi)存的動態(tài)存儲區(qū),分配功能:在內(nèi)存的動態(tài)存儲區(qū),分配n個長度為個長度為size個字個字節(jié)的連續(xù)存儲空間;并返回一個指針,該指針就是已分配節(jié)的連續(xù)存儲空間;并返回一個指針,該指針就是已分配的存儲空間的起始地址(基類型是的存儲空間的起始地址(基類型是void)。)。若函數(shù)

39、調(diào)用失若函數(shù)調(diào)用失敗,例如內(nèi)存空間不足,則返回空指針(敗,例如內(nèi)存空間不足,則返回空指針(null)。)。此函此函數(shù)常用于為一維數(shù)組分配連續(xù)存儲空間,例如:數(shù)常用于為一維數(shù)組分配連續(xù)存儲空間,例如:main()() int *p; p=(int *)calloc(10,sizeof(int);); /*指針指針p 指向一個含有指向一個含有10個元素的整型個元素的整型數(shù)組數(shù)組*/ 3free函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型:void free( void *p );); 功能:其作用是釋放由指針變量功能:其作用是釋放由指針變量p指向的內(nèi)存空間。指向的內(nèi)存空間。p是最近一次調(diào)用是最近一次調(diào)用 mall

40、oc或或 calloc函數(shù)時返回的指針。函數(shù)時返回的指針。free無返回值。無返回值。 例如:例如:free( p );); /*釋放指針變量釋放指針變量p指向的內(nèi)存空間指向的內(nèi)存空間*/注:函數(shù)注:函數(shù)sizeof()()的參數(shù)可以是變量名或某種類型名,的參數(shù)可以是變量名或某種類型名,其返回值是參數(shù)的長度(以字節(jié)為單位)。其返回值是參數(shù)的長度(以字節(jié)為單位)。 4realloc函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型: void *realloc( void *ptr, unsigned int size);); 功能:其作用是使已分配的空間改變大小,即重新功能:其作用是使已分配的空間改變大小,即重新分

41、配。將分配。將ptr指向的存儲區(qū)(是原先用指向的存儲區(qū)(是原先用malloc函數(shù)分配的)函數(shù)分配的)的大小改為的大小改為size個字節(jié)。可以使原先分配區(qū)擴大也可以個字節(jié)。可以使原先分配區(qū)擴大也可以縮小。它的函數(shù)返回值是一個指針,即新的存儲區(qū)的首縮小。它的函數(shù)返回值是一個指針,即新的存儲區(qū)的首地址。應(yīng)指出,新的首地址不一定與原來地址相同,因地址。應(yīng)指出,新的首地址不一定與原來地址相同,因為為了增加空間,存儲區(qū)會進行必要的移動。為為了增加空間,存儲區(qū)會進行必要的移動。 1 1、建一個動態(tài)鏈表、建一個動態(tài)鏈表 # include # define null 0 #define len sizeof(

42、struct student) struct student long num; float score; struct student * next; ; int n;首指針首指針數(shù)數(shù) 據(jù)據(jù) 指指 針針 數(shù)數(shù) 據(jù)據(jù) 指指 針針 數(shù)數(shù) 據(jù)據(jù) 指指 針針 數(shù)數(shù) 據(jù)據(jù) null struct student * creat(void) struct student *head,*p1,*p2; n=0; p1=p2=(struct student *) malloc(len); scanf(“%ld,%f”,&p1-num,&p1-score); head=null; while(p1-num!=

43、0) n=n+1; if(n=1) head=p1; else p2-next=p1; p2=p1; p1=(struct student *) malloc(len); scanf(“%ld,%f”, &p1-num,&p1-score); p2-next=null; return(head);numscorenextp1p2head struct student * creat(void) struct student *head,*p1,*p2; n=0; p1=p2=(struct student *) malloc(len); scanf(“%ld,%f”,&p1-num,&p1-s

44、core); 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,%f”, &p1-num,&p1-score); p2-next=null; return(head);numscorenextnextnumscorep1p2head struct student * creat(void) struct student *head,*p1,*p2; n=0; p1=p2=(struct student

45、*) malloc(len); scanf(“%ld,%f”,&p1-num,&p1-score); 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,%f”, &p1-num,&p1-score); p2-next=null; return(head);numscorenextnextnumscorep1p2head struct student * creat(void) struct studen

46、t *head,*p1,*p2; n=0; p1=p2=(struct student *) malloc(len); scanf(“%ld,%f”,&p1-num,&p1-score); 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,%f”, &p1-num,&p1-score); p2-next=null; return(head);numscorenextnextnextnumscorenum

47、scorep2p1head struct student * creat(void) struct student *head,*p1,*p2; n=0; p1=p2=(struct student *) malloc(len); scanf(“%ld,%f”,&p1-num,&p1-score); 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,%f”, &p1-num,&p1-score); p2

48、-next=null; return(head);numscorenextnextnextnumscorenumscorep1headp2 2、輸出鏈表 void print(struct student *head) struct student * p; p=head; if(head!=null) do printf(“%ld %5.1f”, p-num, p-score); p=p-next; while(p!=null); numscorenextnextnextnumscorenumscoreheadp 2、輸出鏈表 void print(struct student *head)

49、 struct student * p; p=head; if(head!=null) do printf(“%ld %5.1f”, p-num, p-score); p=p-next; while(p!=null); numscorenextnextnextnumscorenumscoreheadp 3、對鏈表的刪除struct student *del(struct student *head,long num) struct student *p1,*p2; if(head=null) printf(“l(fā)ist null!n”);goto end; p1=head; while(num!

50、=p1 -num & p1 -next!=null) p2=p1;p1=p1 -next; if(num=p1 -num) if(p1=head) head=p1 -next; else p2 -next=p1 -next; printf(“delete:%dn”,num); n=n-1; else printf(“%ld not been found!n”,num); end; return(head); numscorenextnextnextnumscorenumscoreheadp2p14、對鏈表的插入struct student *insert(struct student *head,struct student *stud) struct student *p0,*p1,*p2;p1=head; p0=stud;if(head=null) head=p0;p0 -next=null;else while(p0 -nump1 -num)&(p1 -next!=null) p2=p1; p1 =p1 -next; if(p0 -numnum) if(head=p1) head=p0; else p2 -next=p0; p0 -next=p1; else p1

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論