cc程序設(shè)計(jì)第8章-結(jié)構(gòu)體與共用體課件_第1頁(yè)
cc程序設(shè)計(jì)第8章-結(jié)構(gòu)體與共用體課件_第2頁(yè)
cc程序設(shè)計(jì)第8章-結(jié)構(gòu)體與共用體課件_第3頁(yè)
cc程序設(shè)計(jì)第8章-結(jié)構(gòu)體與共用體課件_第4頁(yè)
cc程序設(shè)計(jì)第8章-結(jié)構(gòu)體與共用體課件_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C/C+程序設(shè)計(jì) C/C+程序設(shè)計(jì)第8章 結(jié)構(gòu)體與共用體第8章 結(jié)構(gòu)體、共用體 引言 在生活及工程中,經(jīng)常需要處理一些類(lèi)型不同但密切關(guān)聯(lián)的數(shù)據(jù),這些數(shù)據(jù)通常共同用以描述一個(gè)事物的屬性,一般關(guān)聯(lián)使用而不宜拆分。由于其包含不同類(lèi)型的數(shù)據(jù),不能采用數(shù)組存放。在C語(yǔ)言中,提供了用戶(hù)可自行定義的結(jié)構(gòu)體類(lèi)型,用以解決這種類(lèi)型數(shù)據(jù)的存放和處理問(wèn)題。8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量1. 結(jié)構(gòu)體類(lèi)型 結(jié)構(gòu)體類(lèi)型聲明一般格式:struct 結(jié)構(gòu)體類(lèi)型名 成員聲明表 ; ; 說(shuō)明:1)struct是關(guān)鍵字不能省略。2)結(jié)構(gòu)體類(lèi)型名要符合C的標(biāo)識(shí)符命名規(guī)則。3)成員聲明表中各數(shù)據(jù)成員的定義方式同普通變量定義一樣。4

2、)結(jié)構(gòu)體類(lèi)型聲明后的分號(hào)不可省略。例如,要描述一個(gè)學(xué)生的基本信息,包括學(xué)號(hào)(字符串)、姓名(字符串)、性別(字符串)、年齡(整型)??啥x如下結(jié)構(gòu)體類(lèi)型:struct stud char num8 ; / 學(xué)號(hào) char name20 ; / 姓名 char sex3; / 性別 int age ; / 年齡 ;numnamesexage結(jié)構(gòu)體類(lèi)型的嵌套形式:一個(gè)結(jié)構(gòu)體成員的類(lèi)型也可以是另一個(gè)結(jié)構(gòu)體類(lèi)型的變量。如:struct person中的成員birthday就是結(jié)構(gòu)體類(lèi)型struct date的一個(gè)變量。 struct person char name21; char sex; stru

3、ct date birthday; ;struct date int year; int month; int day; ;namesexbirthdayyearmonthday8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量2. 結(jié)構(gòu)體變量的定義 類(lèi)型為結(jié)構(gòu)體類(lèi)型的變量為結(jié)構(gòu)體變量。必須在聲明一個(gè)結(jié)構(gòu)體類(lèi)型后,才可以用該類(lèi)型定義結(jié)構(gòu)體變量。結(jié)構(gòu)體變量的定義有3種形式:1)在定義結(jié)構(gòu)體類(lèi)型結(jié)束后,再用該類(lèi)型定義結(jié)構(gòu)體變量。例如:struct stud char num8 , name20 , sex3 ; int age ; ; struct stud s1 , s2 ; / 函數(shù)外聲明了結(jié)構(gòu)體變量 s1、

4、s2 說(shuō)明:1)結(jié)構(gòu)體類(lèi)型不占用空間,結(jié)構(gòu)體變量占用內(nèi)存空間。2)結(jié)構(gòu)體變量各個(gè)成員在內(nèi)存中順序存放。其空間總和大于或等于各個(gè)成員所占存儲(chǔ)空間的總和。(即:結(jié)構(gòu)體變量所占的存儲(chǔ)空間大小為結(jié)構(gòu)體中最寬基本類(lèi)型成員大小的整數(shù)倍,不足整數(shù)倍時(shí)就按內(nèi)存對(duì)齊原則,湊足整數(shù)倍)。8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量2)在定義結(jié)構(gòu)體類(lèi)型后直接定義變量。例如:struct stud char num8 , name20 , sex3 ; int age ; s1 , s2 ; / 類(lèi)型后直接定義了結(jié)構(gòu)體變量s1、s2 3)無(wú)名結(jié)構(gòu)體,直接在其后定義變量。例如:struct char num8 , name20

5、, sex3 ; int age ; s1 , s2 ; / 在無(wú)名結(jié)構(gòu)體類(lèi)型后直接定義變量s1、s2 說(shuō)明:無(wú)名結(jié)構(gòu)體類(lèi)型,只能在定義類(lèi)型時(shí)進(jìn)行一次性變量聲明。8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量【例8-1】運(yùn)行下列程序,查看運(yùn)行結(jié)果。#include struct s1 double a; char ch;struct s2 int b ; char ch ;struct s3 short int c ; char ch ;struct s4 char sno2 ; char ch ;void main( ) printf ( %4d, sizeof ( struct s1 ) ) ; pr

6、intf ( %4d, sizeof ( struct s2 ) ) ; printf ( %4d, sizeof ( struct s3 ) ) ; printf ( %4dn , sizeof ( struct s4 ) ) ;運(yùn)行程序,輸出:8 4 3試分析這個(gè)結(jié)果。8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量完整程序3. 結(jié)構(gòu)體變量的初始化由于結(jié)構(gòu)體類(lèi)型中各成員的數(shù)據(jù)類(lèi)型不同,故結(jié)構(gòu)體變量初始化其實(shí)是對(duì)各個(gè)成員變量分別進(jìn)行初始化。結(jié)構(gòu)體變量初始化格式如下:struct 結(jié)構(gòu)體類(lèi)型名 成員列表 ; 結(jié)構(gòu)體變量名 = 各成員初值列表 ;或者struct 結(jié)構(gòu)體類(lèi)型名 成員列表 ; ;struct 結(jié)

7、構(gòu)體類(lèi)型名結(jié)構(gòu)體變量名 = 各成員初值列表 ;說(shuō)明:1)初值要用一對(duì) 括起來(lái),各成員初值之間用逗號(hào)隔開(kāi)。2)各成員的初值的次序與成員在類(lèi)型定義中的次序一一對(duì)應(yīng)且類(lèi)型必須匹配。3)初值的個(gè)數(shù)少于等于超過(guò)成員數(shù)量。沒(méi)有得到初值的成員,系統(tǒng)會(huì)自動(dòng)按“清0”處理。8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量例如:struct stud char num8 , name20 , sex3 ; int age ; s = 300001 , Zhang , 男 , 18 ;numnamesexage300001Zhang男18有嵌套的結(jié)構(gòu)體變量初始化:struct date int year , month , da

8、y ; ;struct person char name20 ; char sex3 ;struct date birthdy ; p1 = 杜鵬 , 男 , 1975 , 10 , 20 ; namesexBirthdayyearmonthday杜鵬男197510208.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量4. 結(jié)構(gòu)體變量的引用一個(gè)結(jié)構(gòu)體變量中包含了若干類(lèi)型并不一定相同成員變量,因此不能直接對(duì)一個(gè)結(jié)構(gòu)體變量整體進(jìn)行輸入、輸出或者做一些其它操作(除賦值運(yùn)算外),只能對(duì)結(jié)構(gòu)體變量的各個(gè)成員變量分別進(jìn)行操作。通過(guò)結(jié)構(gòu)體變量名引用其成員的方法為: 結(jié)構(gòu)體變量名.成員名其中,“.”是成員運(yùn)算符,優(yōu)先級(jí)最高。

9、struct stud char num8,name20,sex3; int age ; ;void main( ) struct stud s1,s2= 300001,Zhang,男,18 ;對(duì)變量s2各成員的引用形式為:s2.num、、s2.age、s2.sex鍵盤(pán)輸入s1各成員值:scanf (%s%s%s%d , s1. num , , s1.sex , &s1.age ) ;8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量有嵌套聲明的結(jié)構(gòu)體變量成員的引用則需要通過(guò)多個(gè)成員運(yùn)算符(“.”),一層層地找到最低一層的成員進(jìn)行引用。struct date int year ,

10、 month , day ; ;struct person char name20 ; char sex3 ; struct date birthdy ; p1=杜鵬,男,1975 ,10, 20; p1的各成員引用形式為:、p1.ages1.birthday.yearp1.birthday.monthp1.birthday.day8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量5. 結(jié)構(gòu)體變量的賦值 通過(guò)賦值語(yǔ)句將一個(gè)結(jié)構(gòu)體變量的值直接賦值給另一個(gè)同類(lèi)型的結(jié)構(gòu)體變量。除此之外,程序中不能以其它任何方式給一個(gè)結(jié)構(gòu)體變量整體賦值。例如:若有語(yǔ)句“struct studs1,s2;”,則: 1)s

11、2 = s1 ; 是正確的。 2)printf ( “%s” , s1 ) ;是錯(cuò)誤的。 3)s2 = “300002” , “l(fā)iu” , “女” ,19 ; 是錯(cuò)誤的。【例8-2】編寫(xiě)程序,輸入2個(gè)學(xué)生的個(gè)人信息,信息包括姓名(字符串)和年齡(整型),將2個(gè)學(xué)生信息互換后輸出。分析:先聲明一個(gè)結(jié)構(gòu)體類(lèi)型(struct student),2個(gè)學(xué)生信息需要定義兩個(gè)結(jié)構(gòu)體變量進(jìn)行存放,而互換兩個(gè)學(xué)生信息,還需要第三方結(jié)構(gòu)體變量。注意,這3個(gè)結(jié)構(gòu)體變量只有是同類(lèi)型的,才可以相互間直接賦值。8.1.1 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量程序如下:#include struct student char name

12、20 ; int age ; ; void main( ) struct student s1 , s2 , temp ; scanf ( %s%d , , &s1.age ) ; / 輸入第1個(gè)學(xué)生信息 scanf ( %s%d , , &s2.age ) ; / 輸入第2個(gè)學(xué)生信息 temp = s1; s1 = s2 ; s2 = temp ; / 此 3 條語(yǔ)句互換 2 個(gè)學(xué)生的信息 printf ( %s %d n , , s1.age ) ; printf ( %s %d t , , s2.age ) ;8.1.1 結(jié)

13、構(gòu)體類(lèi)型及結(jié)構(gòu)體變量8.1.2 結(jié)構(gòu)體數(shù)組1. 結(jié)構(gòu)體數(shù)組的定義與初始化 類(lèi)型為結(jié)構(gòu)體的數(shù)組稱(chēng)為結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的聲明格式:struct 結(jié)構(gòu)體類(lèi)型名 成員列表 ; 數(shù)組名常量表達(dá)式 ;struct 類(lèi)型名 成員列表 ; ;struct 類(lèi)型名 數(shù)組名常量表達(dá)式 ;結(jié)構(gòu)體數(shù)組初始化:例如:(用 將每一個(gè)數(shù)組元素的初值括起來(lái))struct stud char num8 , name20 , sex3 ; int age ; s12= 300001,Sun,男,18 , 300002,Li,女 ,19 ;struct stud s23=300001,Sun,男,18,300002,Li,女,

14、19;注意:也可以將所有初值用一對(duì) 括起來(lái),這時(shí)要注意初值與元素對(duì)應(yīng)關(guān)系以及與元素的各成員的對(duì)應(yīng)次序。數(shù)組元素中沒(méi)有得到初值的成員都會(huì)自動(dòng)“清0”。2. 結(jié)構(gòu)體數(shù)組的使用結(jié)構(gòu)體數(shù)組元素的成員的引用方法為: 結(jié)構(gòu)體數(shù)組名下標(biāo).成員名【例8-3】編寫(xiě)程序,從鍵盤(pán)輸入3個(gè)學(xué)生信息并輸出。 程序如下:#include struct stud char num8 , name20 , sex3 ; int age ; ;void main( ) struct stud s3 ; int i ; for ( i = 0 ; i 3 ; i + ) printf ( 請(qǐng)輸入第%d個(gè)學(xué)生的學(xué)號(hào)、姓名和年齡 :

15、n , i + 1 ) ; scanf ( %s%s%s%d , s i .num , s i .name , s i .sex , &s i .age ) ; 續(xù)左邊程序:printf ( Num t Name t sex t age n ) ; for ( i = 0 ; i num2)指針指向運(yùn)算符(-): 結(jié)構(gòu)體指針名-成員名 1)指針間接運(yùn)算符(*)及成員運(yùn)算符(.): (*結(jié)構(gòu)體指針名).成員名 如:(*p).num【例8-4】使用指向結(jié)構(gòu)體變量的指針變量來(lái)訪問(wèn)結(jié)構(gòu)體變量的各個(gè)成員。8.1.3 結(jié)構(gòu)體指針變量及應(yīng)用8.1.3 結(jié)構(gòu)體指針變量及應(yīng)用程序如下:#include stru

16、ct stud char num8 , name20 , sex3 ; int age ; ; void main( ) struct stud s = 300001 , Sun , 男 , 18 , *p = &s ; printf ( Num : %s t , p-num ) ; printf ( Name : %s t , p-name ) ; printf ( Sex: %s t , ( *p ).sex ) ; printf ( Age : %d n , ( *p ).age ) ;4. 結(jié)構(gòu)體指針變量指向同類(lèi)型的結(jié)構(gòu)體數(shù)組 一個(gè)結(jié)構(gòu)體類(lèi)型的指針變量可以指向同類(lèi)型的結(jié)構(gòu)體數(shù)組。通過(guò)該

17、指針就可訪問(wèn)結(jié)構(gòu)體數(shù)組元素?!纠?-5】使用指向結(jié)構(gòu)體數(shù)組的指針變量來(lái)訪問(wèn)數(shù)組元素。輸出3個(gè)學(xué)生信息。#include struct stud char num8 , name20 ,sex3; int age ; ; void main( ) struct stud s3 = 3001,Sun,男,18 , 3002,Li,女,19 , 3003,Zhao,男,20 ; struct stud *p = s ; int i ; printf ( Num t Name t Sex t Age n ) ; for (i=0 ; inum,p-name,p-sex,p-age);8.1.3 結(jié)構(gòu)體

18、指針變量及應(yīng)用8.1.3 結(jié)構(gòu)體指針變量及應(yīng)用 一個(gè)結(jié)構(gòu)體變量作參數(shù),仍屬于按值傳遞方式。如果結(jié)構(gòu)體指針變量作參數(shù),則屬于按地址傳遞方式?!纠?-6】閱讀下列程序。#include struct stud char num8 , name20 , sex3 ; int age ; ; void display_1 ( struct stud s ) printf ( %s t %s t %s t %dn , s.num , , s.sex , s.age ) ;void display_2 ( struct stud *p , int n) int i ; printf ( Nu

19、m t Name t Sex t Age n ) ; for( i = 0 ; i name , (* p).sex , p-age ) ;void main( ) struct stud s3=300001,Sun,男,18, 300002,Li,女,19, 300003,Zhao,男,20 ; int i ; printf ( Num t Name t Sex t Age n ) ; for ( i = 0 ; i 3 ; i + ) display_1( s i ) ; printf ( 通過(guò)傳遞結(jié)構(gòu)體數(shù)組,一次輸出3個(gè)學(xué)生信息:n ); display_2( s , 3) ; 分析:共

20、用體(union)是指幾個(gè)不同變量共同占用一塊內(nèi)存空間,它們擁有相同的內(nèi)存地址。在C語(yǔ)言中,通過(guò)共用體類(lèi)型實(shí)現(xiàn)這種內(nèi)存覆蓋技術(shù)。 共用體也是一種用戶(hù)自定義類(lèi)型。與結(jié)構(gòu)體(structure)類(lèi)型很相似。它們都可以用來(lái)存儲(chǔ)多種不同的數(shù)據(jù)類(lèi)型,但是兩者有著很大的區(qū)別,即共用體雖然能夠存儲(chǔ)不同的數(shù)據(jù)類(lèi)型,但每一時(shí)刻只能存儲(chǔ)其中的一個(gè)成員。8.2 共用體類(lèi)型和枚舉類(lèi)型8.2.1 共用體類(lèi)型1. 共用體類(lèi)型的定義 共用體類(lèi)型的定義形式為:union 共用體類(lèi)型名 成員列表 ; ;例如:union untp inti ; char ch ; float f ; ;1個(gè)字節(jié)成員ch的存儲(chǔ)單元成員i,f的存儲(chǔ)

21、單元8.2.1 共用體類(lèi)型2. 共用體類(lèi)型變量的定義 共用體類(lèi)型變量的定義與結(jié)構(gòu)體類(lèi)型變量的定義類(lèi)似,也有三種方式:例如:1)先定義類(lèi)型,再定義變量。unionuntp int i ; char ch ; float f ; ; union untp un1 , un2 ; 3)無(wú)名共用體類(lèi)型直接定義變量。例如:union int i ; char ch ; float f ; un1 , un2 ; /只可用一次 2)定義共用體類(lèi)型時(shí)直接在其后定義變量。例如:union untp int i ; char ch ; float f ; un1 , un2 ; 注意:共用體類(lèi)型變量占用的存儲(chǔ)空

22、間大小等于占用空間最大的那個(gè)成員的字節(jié)數(shù)。 例如,共用體變量un1、un2在內(nèi)存中占用4字節(jié)。3. 共用體類(lèi)型變量的引用 共用體類(lèi)型變量的引用與結(jié)構(gòu)體類(lèi)型變量一樣,一般不能整體引用,只能引用它的某一個(gè)成員。例如,訪問(wèn)共用體類(lèi)型變量un1各成員的格式為:un1.i、un1.ch、un1.f。4. 共用體類(lèi)型的主要特點(diǎn)1)各成員變量共享內(nèi)存。在某一時(shí)刻存放并起作用的是最后一次存入的成員的值。2)共用體類(lèi)型變量及其各成員的地址是相同的。3)不能對(duì)共用體類(lèi)型變量進(jìn)行初始化,但變量之間可以整體賦值。4)共用體類(lèi)型可以出現(xiàn)在結(jié)構(gòu)體類(lèi)型定義中,反之亦然。注意:使用共用體變量時(shí)要明白當(dāng)前所起作用的成員是哪個(gè),

23、否則數(shù)據(jù)會(huì)沒(méi)有意義。8.2.1 共用體類(lèi)型【例8-7】閱讀程序。void main( ) union un1 u1 ; struct stu1 s1; u1.a = E ; u1.b = 101; s1.c = H ; s1.d = 98 ; printf ( a = %c , b = %d t , u1.a , u1.b ) ; printf ( c = %c , d = %d n , s1.c , s1.d ) ;struct stu1 char c ; int d ; ;#include union un1 char a ; int b ; ; 運(yùn)行程序,輸出:a = e , b = 1

24、01 c = H , d = 981. 枚舉類(lèi)型的定義 所謂“枚舉”是指將變量的值一一列舉出來(lái),變量的值只限于列舉出來(lái)的值的范圍內(nèi)。枚舉類(lèi)型的定義格式: enum 枚舉類(lèi)型名 枚舉元素值列表 ;例如:enum weekday sun , mon , tue , wed , thu , fri , sat ;說(shuō)明: 1)枚舉類(lèi)型適宜于表示有限的數(shù)據(jù)類(lèi)型。如星期2)枚舉元素的值是常量,不是變量,不能對(duì)枚舉元素再進(jìn)行賦值操作。3)枚舉元素是有值的,按照定義時(shí)的順序號(hào),從0開(kāi)始取值。 例如,sun的值為0,mon的值為1,依此類(lèi)推。枚舉元素也可以比較大小,如sun mon8.2.2 枚舉類(lèi)型4)枚舉元

25、素的值也可在定義時(shí)指定。例如,若有:enum weekday sun=7,mon=1,tue,wed,thu,fri, sat ;則sun的值為7,mon的值為1,從tue開(kāi)始,枚舉元素的值依次為2、3、4、5、6。再例如,若有:enum weekday sun=7,mon,tue,wed,thu,fri, sat ;則mon的值為8,tue的值為9,wed的值為10, 依次類(lèi)推。2. 枚舉類(lèi)型變量的定義枚舉類(lèi)型變量的定義和結(jié)構(gòu)體類(lèi)型變量定義類(lèi)似。有3種:如:1)enum color red , green , blue ; enum color c1 ;2)enum color red ,

26、green , blue c1 ;3)enum red , green , blue c1 ;/只可使用一次值得注意的是,一個(gè)枚舉變量的值只能取相應(yīng)枚舉元素中的某一個(gè),例如c1 = red。8.2.2 枚舉類(lèi)型【例8-8】枚舉類(lèi)型應(yīng)用舉例。程序如下:#include void main ( ) enum weekday sun , mon , tue , wed , thu , fri , sat a , b , c ; a = sun ; b = wed ; c = fri ; printf ( %d , %d , %d , a , b , c ) ; a=1; b=2; c=4; prin

27、tf ( n%d , %d , %d n ,a , b , c ) ; switch(a) case 0:printf(sunn);case 1:printf(monn);case 2:printf(tuen);case 3:printf(wedn);case 4:printf(thun);case 5:printf(frin);case 6:printf(satn); ;運(yùn)行結(jié)果: 0 , 3 , 51 , 2 , 4mon8.2.2 枚舉類(lèi)型8.3 使用typedef命名已有類(lèi)型typedef命令 可以用一個(gè)別名來(lái)代替已有的某個(gè)類(lèi)型名。定義的一般形式為:typedef 已有類(lèi)型名 類(lèi)型別名

28、 ;如:typedef float MF ; / 指定 MF 為 float 類(lèi)型的別名 MF x , y ; / 用別名MF定義了兩個(gè)變量x、y,相當(dāng)于: float x , y ; 說(shuō)明:1)typedef語(yǔ)句只能夠指定一個(gè)已有類(lèi)型的別名,并不能生成或創(chuàng)建一種新的數(shù)據(jù)類(lèi)型。2)用typedef為數(shù)組、結(jié)構(gòu)體、共用體等類(lèi)型定義別名,可使程序代碼簡(jiǎn)潔。在數(shù)據(jù)結(jié)構(gòu)等課程中用typedef定義類(lèi)型別名的應(yīng)用很多。8.4 單鏈表結(jié)構(gòu)體指針的應(yīng)用8.4.1 單鏈表概述及動(dòng)態(tài)內(nèi)存分配1. 單鏈表概念及其結(jié)點(diǎn)結(jié)構(gòu)定義 鏈表是結(jié)構(gòu)體類(lèi)型最重要的應(yīng)用。鏈表可以實(shí)現(xiàn)內(nèi)存的動(dòng)態(tài)分配,提高內(nèi)存的利用率。鏈表有單鏈表

29、和雙鏈表,其中單鏈表是最簡(jiǎn)單的一種鏈表。一個(gè)單鏈表由若干個(gè)結(jié)構(gòu)相同的“結(jié)點(diǎn)”和一個(gè)指向頭結(jié)點(diǎn)的“頭指針”變量組成。單鏈表的每個(gè)結(jié)點(diǎn)包含兩部分:數(shù)據(jù)域和指針域。鏈尾結(jié)點(diǎn)的next為空(用NULL或符號(hào)表示)8.4 單鏈表結(jié)構(gòu)體指針的應(yīng)用由于單鏈表的每個(gè)結(jié)點(diǎn)中存放了不同類(lèi)型的數(shù)據(jù),因此單鏈表的結(jié)點(diǎn)通常用結(jié)構(gòu)體類(lèi)型來(lái)描述.如:struct stu_node int num ; char name10 ; int age ; struct stu_node *next ; ;2. 單鏈表和數(shù)組的區(qū)別1)單鏈表結(jié)點(diǎn)的存儲(chǔ)空間是在程序運(yùn)行過(guò)程中分配的,即“動(dòng)態(tài)分配”,故單鏈表的結(jié)點(diǎn)在內(nèi)存中地址通常是不連續(xù)

30、的,結(jié)點(diǎn)之間通過(guò)指針域形成邏輯上的先后次序。因此,單鏈表的結(jié)點(diǎn)只能從前到后順序訪問(wèn),不能像數(shù)組那樣通過(guò)下標(biāo)隨機(jī)訪問(wèn)。2)數(shù)組元素的空間是連續(xù)的,空間分配是采用靜態(tài)方式,程序運(yùn)行中數(shù)組的內(nèi)存空間不能改變,這種連續(xù)存儲(chǔ)的方式使得數(shù)組適合采用隨機(jī)訪問(wèn)方式。3. 動(dòng)態(tài)內(nèi)存分配及釋放 (1)malloc ( ) 函數(shù) 格式:void * malloc ( unsigned int size )功能:動(dòng)態(tài)申請(qǐng)一個(gè)長(zhǎng)度為size字節(jié)的連續(xù)空間。申請(qǐng)成功,函數(shù)返回一個(gè)指向該空間的起始地址,申請(qǐng)失敗,則返回空指針(NULL)。(2)calloc ( ) 函數(shù) 格式:void * calloc ( unsigne

31、d int n , unsigned int size )功能:申請(qǐng)n個(gè)同一類(lèi)型的大小為size的連續(xù)內(nèi)存空間,若成功,則返回連續(xù)內(nèi)存空間的首地址,并對(duì)該空間清0,申請(qǐng)失敗,則返回空指針(NULL)。8.4 單鏈表結(jié)構(gòu)體指針的應(yīng)用(3)realloc ( ) 函數(shù) 格式:void * realloc ( void *p , unsigned int size )功能:將p指向的存儲(chǔ)區(qū)的大小重新申請(qǐng)為size個(gè)字節(jié)。申請(qǐng)成功,返回首地址給p,不成功,則返回NULL給變量p。注意申請(qǐng)新空間不保證與原地址相同。 使用該函數(shù)特別注意,若申請(qǐng)失敗,則p原指向的內(nèi)存被“遺失”了。從而導(dǎo)致程序崩潰。(4)f

32、ree ( ) 函數(shù) 格式:void free ( void *ptr )功能:釋放指針變量ptr所指向的內(nèi)存區(qū),其釋放內(nèi)存區(qū)的大小由ptr的類(lèi)型決定。注意,ptr所指向的內(nèi)存空間必須是由函數(shù)malloc ( ) 申請(qǐng)到的。8.4 單鏈表結(jié)構(gòu)體指針的應(yīng)用8.4.2 單鏈表的主要操作有關(guān)單鏈表操作均使用下列類(lèi)型定義: 1. 單鏈表的創(chuàng)建 從無(wú)到有地建立起一個(gè)有n個(gè)結(jié)點(diǎn)的單鏈表,即逐個(gè)申請(qǐng)結(jié)點(diǎn)空間、輸入各結(jié)點(diǎn)數(shù)據(jù)并建立起前后結(jié)點(diǎn)之間的鏈接關(guān)系。創(chuàng)建步驟:1)定義結(jié)點(diǎn)的結(jié)構(gòu)體類(lèi)型。創(chuàng)建一個(gè)空鏈表。即head=NULL.2)利用malloc ( ) 函數(shù)申請(qǐng)一個(gè)結(jié)點(diǎn)空間。并置 next為空。若head

33、仍為NULL,將head指向該結(jié)點(diǎn)。若head不空,將該新結(jié)點(diǎn)接到表尾。3)判斷結(jié)點(diǎn)數(shù)目是否已經(jīng)滿(mǎn)足,若不滿(mǎn)足有則轉(zhuǎn)2)繼續(xù),否則結(jié)束。struct node int data ; struct node *next ; ;8.4 單鏈表結(jié)構(gòu)體指針的應(yīng)用8.4 單鏈表結(jié)構(gòu)體指針的應(yīng)用struct node *creat ( int n ) struct node *head , *tail , *p ; / head 為頭指針,tail 為尾指針 int i = 0 , d ; head = tail = NULL ; while ( i next = NULL ; printf ( input data : ) ; scanf ( %d , &d ) ; p -data = d ; if ( head = NULL ) head = p ; / 新結(jié)點(diǎn)作為鏈表的第一個(gè)結(jié)點(diǎn) else tail - next = p ; / 新結(jié)點(diǎn)鏈入原鏈表尾 tail = p ; / 新結(jié)點(diǎn)成為鏈表的最后一個(gè)結(jié)點(diǎn) i+ ; / 計(jì)數(shù) return head ; / 鏈表第一個(gè)結(jié)點(diǎn)的地址作為函數(shù)的返回值 8.4 單鏈表結(jié)構(gòu)體指針的應(yīng)用2. 單鏈表的查詢(xún)查詢(xún)的方法就是從頭到尾依次比較,直到找到該

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論