




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第9章
用戶可建立的數(shù)據(jù)類型——復雜數(shù)據(jù)
的表示與處理9.1結構體9.2共用體9.3枚舉類型9.4用戶自定義數(shù)據(jù)類型名稱9.5用結構體和指針處理鏈表實訓任務十七
熟悉結構體、共用體數(shù)據(jù)類型的表示與使用實訓任務十八
學習復雜數(shù)據(jù)表示處理的編程方法 9.1結
構
體
9.1.1結構體類型與結構體變量的定義
1.先定義結構體類型,再定義結構體變量
定義結構體類型的一般形式為
其中,“struct”為結構體類型定義關鍵字,是結構體類型的標識符。“結構體類型名”是所定義結構體的類型名稱,這個名字由用戶命名,其命名同變量名、數(shù)組名一樣,要符合C語言的標識符命名規(guī)則。用戶可以用該類型名來定義結構體變量。花括號中定義該結構體類型所包含的成員,即成員的類型、名稱及其順序關系。成員名的命名規(guī)則與標識符命名規(guī)則相同。成員類型可以是基本類型或者任何在該結構體類型之前已經(jīng)定義過的自定義類型。結構體類型的定義僅是聲明了一種數(shù)據(jù)對象的結構類型,僅表示一種抽象結構,并不代表具體的數(shù)據(jù)對象,編譯系統(tǒng)也不分配存儲空間,不能在程序中引用。要使所定義的結構體類型代表一個數(shù)據(jù)對象,需定義結構體類型變量。定義結構體類型變量的一般方式為
struct結構體類型名變量名;
其中,“struct結構體類型名”代表一種結構體類型,其后的變量名就被定義為可表示該結構體類型的變量,變量表示具有該結構體的實體對象,編譯系統(tǒng)給結構體變量按結構體成員順序與類型分配存儲空間。
“date”是結構體類型的名稱,year、month和day分別是整型數(shù)據(jù)成員的名稱,表示日期中的年、月、日。
定義了結構體類型之后,就可以用該類型來定義結構體變量。如:
structdatedate1;
“date1”是被定義為表示日期類型的結構體變量。其存儲結構是連續(xù)分配3個整型數(shù)據(jù)的單元,一個整型數(shù)據(jù)占4個字節(jié),共占12個字節(jié)的存儲空間。
結構體類型定義中,成員類型可以是已經(jīng)定義過的任何一種數(shù)據(jù)對象的類型。例如,在定義了日期結構體類型的基礎上,可定義一個學生信息的結構體類型:學生結構體類型定義中包含日期結構體成員birthday,即結構體類型可以嵌套定義。但是,結構體不允許遞歸定義,即結構體的成員不能為該結構體的變量。如,下面的定義是非法的:
在定義了“student”結構體類型的基礎上,可以定義該結構體類型的變量:
structstudentstudent1,student2;
從上述可以看出,由一個結構體類型可以定義多個結構體變量。
2.在定義結構體類型的同時定義結構體變量
該方式定義的一般形式為
從上述可知,定義結構體類型的目的是定義結構體變量,只有結構體變量才能存儲和處理結構體數(shù)據(jù),前兩種方式定義了結構體類型名稱,可以使用這種結構體類型名稱來定義新的結構體變量。第3種定義方式,沒用結構體類型名,無法利用結構體類型名來定義新的結構體變量。
結構體成員可以與程序中的其他變量同名,兩者代表不同對象,互不影響。結構體的定義可以放在函數(shù)內,也可以放在函數(shù)外。在函數(shù)內定義的結構體只能在函數(shù)內使用(即局部數(shù)據(jù)對象)。在函數(shù)外定義的結構體可以在定義點之后的所有函數(shù)內使用(全局數(shù)據(jù)對象)。
9.1.2結構體變量的初始化
如何給結構體變量提供初始數(shù)據(jù)?
定義了結構體變量后,系統(tǒng)按成員的順序和類型給其分配存儲空間,但成員沒有指定的數(shù)據(jù)。對結構體提供數(shù)據(jù)是針對成員來進行的,也就是說,不能對結構體整體進行,這與數(shù)組類似。對結構體成員提供數(shù)據(jù)有兩種方式,一種是在定義結構體變量時提供初始值,稱為初始化;還有一種是在程序運行中,通過賦值操作給成員提供值。一般在定義結構體變量時,需進行初始化。結構體變量初始化的方式是:按結構體成員的順序和類型分別提供初始數(shù)據(jù)。例如,對前面定義的學生結構體變量初始化如下:
structstudentstudent1={0103208,"liuxiqiao",'w',{1983,9,17}};
給結構體變量賦初值要用花括號將所有成員數(shù)據(jù)括起來。在花括號中要按成員順序提供初始數(shù)據(jù),數(shù)據(jù)類型要與定義的成員類型一致。例如“姓名”成員是字符數(shù)組,可以通過字符串提供初值,也可以按字符數(shù)組元素的方式提供初值。“出生日期”成員是一個結構體類型,要按定義的日期結構體來提供初值,其年、月、日數(shù)據(jù)用花括號括起來。
9.1.3結構體成員的引用
如何引用結構體變量中的數(shù)據(jù)?
系統(tǒng)把結構體變量看作一個數(shù)據(jù)對象,給其分配數(shù)據(jù)空間,按成員的順序和類型連續(xù)存儲數(shù)據(jù),但對結構體變量的數(shù)據(jù)不能整體引用,只能按成員來引用。結構體數(shù)據(jù)的引用方式與數(shù)組數(shù)據(jù)的引用方式類似。
結構體成員引用的形式為
結構體變量名.成員名
其中,“.”是C語言的一種運算符,稱為“取成員運算符”。“.”的優(yōu)先級是C語言中優(yōu)先級最高的運算符,具有左結合性(參見附錄C)。例如,前面定義的一個學生信息的結構體變量,student1.num表示學號成員數(shù)據(jù)項。
如果成員又是一個結構體類型,則要分層用成員運算符,一級一級地找到最基本的成員。例如,要引用一個學生信息的結構體變量中的出生日期數(shù)據(jù),要分別采用如下的引用
形式:
student1.birthday.year
student1.birthday.month
student1.birthday.day
不能用student1.birthday來引用出生日期數(shù)據(jù)。可以對結構體變量中的成員進行輸入、輸出、賦值、運算等操作。
對結構體成員輸入數(shù)據(jù),要取成員地址。例如:
scanf("%ld",&student1.num);
一個成員變量可以像基本類型變量一樣進行相應的運算。例如:
sum=student1.age+student2.age;
age++;
例9.1
定義一個學生成績表的數(shù)據(jù)結構,學生信息包含學號、姓名、出生日期,有5門課成績,從鍵盤輸入數(shù)據(jù),求出學生總分,輸出學生數(shù)據(jù)和總分。
編程思路:學生成績表包含許多學生數(shù)據(jù),每個學生具有相同的數(shù)據(jù)結構,屬于典型的結構體類型數(shù)據(jù)。先定義學生數(shù)據(jù)結構,再定義學生數(shù)據(jù)結構的變量。學生信息的輸入和處理要針對成員數(shù)據(jù)來進行。
運行結果:
分析:在程序中定義兩個結構體類型,學生結構中嵌套了日期結構,形成了嵌套結構。定義了結構體變量s來表示具體學生的結構數(shù)據(jù)。從程序及其運行結果可以看出,結構體成員的輸入/輸出只能按基本類型數(shù)據(jù)元素來進行。例如,輸入成員數(shù)組元素采用語句“scanf("%f",&s.score[i]);”,輸出成員數(shù)組元素采用語句“printf("Score%d:%-6.1f",i,s.score[i]);”。
9.1.4結構體數(shù)組
批量結構體類型數(shù)據(jù)如何表示與處理?
在實際應用中,經(jīng)常遇到結構體類型的批量數(shù)據(jù),如一個班級的學生信息。一個學生的基本信息是一個結構體類型數(shù)據(jù),一個班級的學生基本信息就是一個結構體數(shù)組。C語言允許定義結構體數(shù)組。
構體數(shù)組是復合型構造數(shù)據(jù)類型,即結構體數(shù)組中所有元素是同一類型的結構體數(shù)據(jù)對象,一個元素是一個結構體數(shù)據(jù)對象。所以,結構體數(shù)組的定義、初始化和元素引用方法都是數(shù)組和結構體中方法的類推。因為結構體數(shù)組元素是用戶自定義的結構體類型,所以定義結構體數(shù)組應先定義元素的結構體類型,然后再按已定義的結構體類型定義數(shù)組。其定義方式與結構體變量的定義方式相仿。只要在結構體變量定義中的變量名位置寫上數(shù)組定義符號即可。結構體數(shù)組定義也有與結構體變量定義對應的3種方式。若已定義了結構體類型(具有結構體類型名),則一維結構體數(shù)組定義的一般形式為
struct結構體類型名
數(shù)組名[數(shù)組長度];
其中,“struct結構體類型名”是已經(jīng)定義過的結構體類型,其他和數(shù)組定義一樣。另外兩種定義方式,在后面的例子中說明。同樣也可定義二維結構體數(shù)組。二維結構體數(shù)組不太常用,不再細述。結構體數(shù)組的初始化是先按元素順序,再按元素的結構體成員順序與類型來提供初始數(shù)據(jù)。所以就形成了按元素順序,依次對結構體成員初始化的過程。
對結構體數(shù)組元素的引用也是先引用數(shù)組元素(結構體對象),再引用該元素中的結構體成員。
下面通過一個實例來說明結構體數(shù)組的定義、初始化和引用的方法。
例9.2
構造一個班一門課程成績表的數(shù)據(jù)結構,初始化成績表信息,查找出不及格學生,并輸出該學生的全部信息。成績表信息包括學號、姓名、課程、成績。
編程思路:學生基本信息包含不同類型數(shù)據(jù),應是一個結構體類型。一個班成績表應是結構體數(shù)組。所以,采用結構體數(shù)組進行處理。為簡化數(shù)據(jù),說明處理方法,程序中只對5個學生信息進行處理。
運行結果:
分析:
(1)在程序開頭定義了一個結構體類型,同時定義了結構體數(shù)組st[5],又對數(shù)組進行了初始化。內層一個花括號對應一個數(shù)組元素,花括號內的數(shù)據(jù)對應一個結構體成員的數(shù)據(jù)。可以看出,數(shù)據(jù)類型與所定義的成員類型一一對應。如果去掉結構體類型名“student”,或者把結構體數(shù)組定義放在主函數(shù)中,用“structstudentst[5];”定義,程序都能正確運行。請讀者自行驗證。
(2)在程序中求總分和輸出不及格學生的信息中都采用了“數(shù)組名[i].成員名”的引用形式,表示引用數(shù)組第i個元素中指定的成員數(shù)據(jù)。如“st[2].score”是引用結構體數(shù)組第2個元素的結構體成員score的值(即對應數(shù)組中的第2個學生的成績)。
從上例可以看出,只要掌握結構體數(shù)組復合層次關系,類推數(shù)組元素的引用到結構體成員的引用方法,對結構體數(shù)組的引用就不難理解。最終都類推到對基本變量的引用上。
9.1.5結構體指針
何謂結構體指針?如何通過結構體指針引用其數(shù)據(jù)?
定義了結構體類型與結構體變量后,系統(tǒng)給結構體數(shù)據(jù)分配一個存儲空間,按照成員順序連續(xù)存儲,按成員類型分別占據(jù)不同字節(jié)的存儲長度,每個成員都有確定的存儲地址,結構體數(shù)據(jù)對象的首地址就是結構體的指針。對結構體數(shù)據(jù)也有兩種訪問方式:直接訪問和間接訪問。前面講的“結構體變量名·成員名”訪問方式就是直接訪問,也可以通過指向結構類型的指針變量,來間接訪問結構體數(shù)據(jù)。結構體數(shù)組存儲結構也同樣保持結構的復合關系,先按元素順序連續(xù)存儲,再按成員順序和類型分配存儲空間。每一個結構體元素及其成員都有確定的存儲地址。對結構體數(shù)組數(shù)據(jù)也有兩種訪問方式。“數(shù)組名[下標]·成員名”是直接訪問。同樣,也可以通過指向結構體數(shù)組的指針變量來間接訪問。
掌握了指針及指針變量的實質意義,通過指針變量來訪問結構體及結構體數(shù)組就不難理解了。指向結構體對象的指針變量可指向結構體數(shù)據(jù),也可指向結構體數(shù)組中的元素。指向結構體的指針變量定義、賦初值及通過指針變量引用數(shù)據(jù)的方法同普通指針變量相仿。只是要用自定義的結構體類型來定義指針變量,取結構體類型變量地址賦給指針變量,即可建立指向。例如:
structstudentst; //定義結構體變量
structstudent*p; //定義指向結構體指針變量
p=&st; //使p指向結構體變量st通過指針變量對結構體數(shù)據(jù)的引用有兩種方式:
方式一:
(*指針變量名)·成員名
例如:
(*p)?name;
方式二:
指針變量名->成員名
例如:
p->name;
這兩種方式是等價的,可以相互取代。注意:指針變量名兩側的括號是不能缺省的。
1.通過結構體指針變量來引用結構體成員值或結構體數(shù)組中的成員值
下面通過兩個例子來說明通過指針變量來引用結構體數(shù)據(jù)和結構體數(shù)組元素。
例9.3
通過指向結構體變量的指針變量輸出結構體變量中成員的信息。
編程思路:為了便于對比,仍以學生信息表數(shù)據(jù)為例。
運行結果:
分析:在主函數(shù)中定義學生信息結構體類型的同時定義了結構體變量st,并進行了初始化。接著定義了指向結構體類型的指針變量p,&st賦給p,使其指向結構體變量st。兩個printf函數(shù)調用中,分別采用結構體變量名引用法和指針變量引用法,輸出結果完全一樣,但意義有所不同,結構體變量名表示結構體數(shù)據(jù)的地址是固定的,指針變量的指向是可以變化的。
分析:程序中定義了指向結構體類型的指針變量ps,把數(shù)組名表示的數(shù)組首地址賦給ps。在for循環(huán)中,“ps=st”使ps指向數(shù)組首元素,“ps++”是數(shù)組邏輯指針的調整,即使ps指向下一個元素(結構體成員),“ps<st+5”中的st+5仍是一個邏輯指針,表示ps指向最末一個元素后結束,最末一個元素的指針是st+4。
2.用結構體變量和結構體變量的指針作函數(shù)參數(shù)
從前述已經(jīng)知道,變量作函數(shù)參數(shù),實參向形參單向傳遞變量的值;指針作函數(shù)參數(shù),實參向形參傳遞地址,使實參和形參共同指向一個存儲單元或存儲區(qū),使主調函數(shù)和被調函數(shù)共享存儲單元或存儲區(qū)中的數(shù)據(jù)。同樣,結構體變量作函數(shù)參數(shù),實參向形參傳遞結構體變量中的成員值,即傳遞的是不同類型的多個數(shù)據(jù);結構體變量的指針作函數(shù)的參數(shù),實參向形參傳遞結構體數(shù)據(jù)對象的地址,使主調函數(shù)和被調函數(shù)能共享結構體存儲空間的成員數(shù)據(jù),即能實現(xiàn)結構體成員數(shù)據(jù)的雙向傳遞。下面通過實例來說明,請認真理解。
例9.5
設一個班有3門課程的成績表,學生學號、姓名已存入系統(tǒng),從鍵盤上錄入學生3門課成績,求每個學生的平均成績,并將平均成績最高的學生信息輸出。
編程思路:學生成績表屬于結構體數(shù)組結構。從功能上可由3個函數(shù)來實現(xiàn),顯示學生學號、姓名,錄入3門課成績,同時求平均成績;找出最高平均成績;輸出平均成績最高的學生信息。
運行結果:分析:
(1)定義學生成績結構體類型,同時定義結構體數(shù)組,只給學號、姓名成員賦初值;
(2)定義成績錄入并求平均分函數(shù)input,結構體數(shù)組名作參數(shù),系統(tǒng)把數(shù)組名看作指針變量,接收實參傳遞的指針。屏幕上顯示學號、姓名,只輸入3門課成績。外循環(huán)控制錄入第i個學生成績,內循環(huán)控制錄入第j門課成績。使用了結構體數(shù)組元素中的成員元素的引用“st[i].score[j]”。
(3)定義找最高平均分函數(shù),結構體數(shù)組名作形參。在循環(huán)中只比較數(shù)組元素的平均分成員項“st[i].aver>st[m].aver”。
(4)定義輸出學生信息函數(shù),結構體變量作形參,接收實參傳遞的結構體變量值(全部成員數(shù)據(jù))。
(5)函數(shù)調用,“input(p);”把指針變量p的值(結構體數(shù)組首地址)傳遞給形參st,使p和st都指向結構體數(shù)組,函數(shù)中錄入的成績就存入結構體數(shù)組的成績數(shù)組中,所求平均分存入平均分成員項中。因為結構體數(shù)組屬于全局數(shù)據(jù)對象,所在函數(shù)中的操作結果,可供其他函數(shù)使用。
(6)函數(shù)調用,“print(max(p));”先調用“max(p)”,把結構體數(shù)組首地址傳遞給形參,在函數(shù)中使用結構體數(shù)組中平均分成員數(shù)據(jù)進行比較,返回最高平均分結構體元素st[m],再產(chǎn)生“print(st[m]);”調用,在函數(shù)中輸出最高平均分學生的全部信息。
9.2共
用
體
9.2.1共用體類型與共用體變量的定義
共用體是用戶自定義的一種數(shù)據(jù)存儲結構類型。必須先定義類型,再定義變量,通過變量來引用共用體中的成員。
共用體定義的一般形式為
其中,union是共用體類型定義關鍵字;共用體類型名是用戶自定義的類型名稱;花括號中可以是任一類型的數(shù)據(jù)對象,包括自定義類型;共用體變量名表是用戶自定義的共用體類型變量,如果定義多個變量,變量之間要用逗號分隔。
共用體定義同結構體相仿,也有3種定義方式。在上述定義中可以不要“共用體類型名”,也可以在定義共用體類型之后,利用已定義的共用體類型來定義變量。其一般形式為
union共用體類型名共用體變量名表;
定義了共用體類型與變量后,編譯系統(tǒng)按成員中占據(jù)存儲字節(jié)數(shù)最多的成員分配一個存儲單元或空間。
系統(tǒng)給i、ch、f按實型數(shù)據(jù)分配一個存儲單元,通過變量a可引用3種數(shù)據(jù)之一。其存儲結構如圖9.1所示。為說明問題,假定整型數(shù)占2個字節(jié),實型數(shù)占4個字節(jié)。
圖9.1共用體存儲結構示意圖9.2.2共用體變量引用
同結構體數(shù)據(jù)引用相仿,共用體變量只能引用其中的成員,也有兩種引用形式。
形式一:
共用體變量名·成員名
形式二:
共用體指針變量名->成員名
因為共用體成員通過覆蓋方式共享一個存儲單元或空間,一個變量的瞬時值只能是一個類型的成員值,所以對共用體賦值及引用,一個時刻只能對一個成員進行操作。這與結構體變量是截然不同的。關于共用體變量引用的幾點說明:
(1)共用體變量初始化與賦值。可以對共用體變量初始化,在初始化表中只能有任一成員類型的常量,不能期望同時給各個成員提供初始數(shù)據(jù)。例如:
實際上是向共用體變量存入一個整型數(shù)。如初始化表為{230,'a',3.6}則是錯誤的。
可以在程序中給共用體變量的成員賦值,但不能給共用體變量賦值。例如:
a.f=3.6;
a.ch='a';
a.i=230;
都是正確的。但如果有a=3.6則是不正確的。
如果有多次賦值,共用體變量中只是最后一次所賦的值,即后面的賦值覆蓋前面的賦值。如上面的賦值語句被執(zhí)行,則引用3個成員的值都是230。
(2)共用體變量的地址和成員的地址是同一地址,即有&a==&a.i==&a.ch==&a.f,因為3個成員共享一個存儲單元。
下面通過一個例子來說明共用體數(shù)據(jù)的使用。
例9.6
錄入表9.1中的數(shù)據(jù),并輸出。表9.1數(shù)據(jù)信息編程思路:從表中可以看出,教師和學生信息前四項都是相同的,只有最后一項不同。如果在一個實際應用系統(tǒng)中把學生和教師信息以單獨表的結構來存儲、處理,不但會重復占據(jù)存儲空間,也給程序設計帶來一定的麻煩。如果把最后一項作共用體數(shù)據(jù)對象,將會避免上述問題。為說明方法,只編寫一位教師和學生的信息處理程序。運行結果:
分析:程序中定義了全局結構體數(shù)組person[2],存儲兩個人的信息。在結構體類型定義中嵌套定義了一個共用體變量category,其中有兩個成員,company和charposition[10],身份是學生,則存班級信息(整型數(shù)據(jù));身份是教師,則存職稱信息(字符數(shù)組)。使用共用體變量,使兩種人員信息統(tǒng)一在一個數(shù)據(jù)結構中。人員信息輸出中,相同信息項作相同處理,只是對不同信息項作選擇處理,簡化了程序設計,也提高了程序效率。
9.3枚舉類型
一些事物屬性只能列舉,不具有數(shù)值關系,這些數(shù)據(jù)對象怎樣表示與處理?
現(xiàn)實中存在一些可列舉的數(shù)據(jù)對象,如一周有星期一到星期日,顏色有紅、橙、黃、綠、青、藍、紫,等等。這種數(shù)據(jù)對象只可列舉,不具有數(shù)值關系,似乎難以在計算機中處理。C語言允許將這類數(shù)據(jù)定義為枚舉類型,能方便地進行處理。
枚舉類型與枚舉變量的定義也同結構體相仿。定義的一般形式為
enum枚舉類型名
{
枚舉元素列表
}枚舉變量列表;
其中,enum為定義枚舉類型的關鍵字;枚舉類型名是用戶自定義的表示所定義枚舉類型的名稱;“枚舉元素列表”是用逗號分隔的列舉的元素名稱序列;枚舉變量列表是定義枚舉類型的同時定義的變量名。一個枚舉類型可定義多個變量,變量間用逗號分隔,就是枚舉變量列表。枚舉類型與枚舉變量定義也可有3種形式。在上面的定義中可以省略“枚舉類型名”而直接定義枚舉變量。也可以先定義枚舉類型,然后用所定義的枚舉類型來定義枚舉變量。其定義的一般形式為
enum枚舉類型名
枚舉變量列表關于枚舉數(shù)據(jù)的幾點說明:
(1)枚舉元素雖以標號列出,但C編譯系統(tǒng)按常量處理,故稱枚舉常量。在程序中不能給枚舉元素賦值,即枚舉元素相當于一個符號常量。
(2)?C編譯系統(tǒng)對枚舉元素按定義的順序依次賦值0,1,2,3,4,5,…。在上面的定義中,Sunday的值為0,Monday的值為1,…,Saturday的值為6。也可在定義時,給枚舉元素指定常量序列值。
(3)枚舉變量的取值范圍是列舉元素值的范圍。如Sunday只可能取0~7之間的一個整數(shù)。
(4)由于枚舉型變量的值是整數(shù),因此C99標準中也把枚舉型作為整型數(shù)據(jù),用整型變量來表示枚舉型元素值。
下面通過一個例子來說明枚舉數(shù)據(jù)的應用。
例9.7
一個盒子中有紅、黃、藍3種顏色的球若干,每次從盒子中先后取出3個球,編程求解取不同顏色球的排列數(shù),并輸出每種顏色排列。
編程思路:定義3種顏色的枚舉類型,再定義3個枚舉類型或整型變量i、j、k,分別表示3個球的顏色值,然后用枚舉算法求取出3個球的顏色排列數(shù)。
枚舉算法:當取出的兩個球顏色不同(i≠j)時,取第3個球。如果第3個球與前兩個球顏色都不同(k≠i且k≠j),則是一次有效排列取法,計數(shù)一次。如此,i、j、k依次取3種顏色值之一,進行判斷,可得到求解結果。顯然應該用三重循環(huán)來實現(xiàn)。
運行結果:
分析:
(1)定義了3種顏色的枚舉類型后,編譯時,3種顏色標號依次具有值0、1、2。
(2)定義i、j、k、pri表示顏色取值變量,等價于枚舉變量。
(3)三重循環(huán)實現(xiàn)3次取球的顏色排列。第3層內循環(huán)的if語句要執(zhí)行27次,實現(xiàn)3次取球的顏色排列判斷。當判斷出3個球的顏色不同時,則計數(shù)變量n+1,將顏色值轉換成顏色字符輸出。
(4)將顏色值轉換成顏色字符輸出,由if語句中嵌套的for循環(huán)來實現(xiàn)。當判斷3個球顏色不同時,由switch(loop)分別將i、j、k當前值賦給pri,再由switch(pri)輸出顏色值對應的顏色字符。
(5)使用枚舉類型,使枚舉元素標號具有整型值,可以很方便地進行比較判斷和相應的運算。
(6)只要在枚舉類型中添加顏色元素,再于循環(huán)中更改最后一個顏色的取值,即可實現(xiàn)更多種顏色的取球模型求解。取球模型代表了隨機抽樣一類應用問題。
9.4用戶自定義數(shù)據(jù)類型名稱
1.用新類型名代替原有類型名
其使用的一般形式為
typedef已有類型標識符
新類型名;
其作用是用“新類型名”代替原有類型標識符,即為原有的一個數(shù)據(jù)類型重新命名,而不是定義一種新的數(shù)據(jù)類型。
2.用一個簡單類型名代替復雜的類型
諸如數(shù)組類型、結構體類型、共用體類型、枚舉類型等,看起來比較復雜,可用typedef定義一個簡單的類型名代替復雜的類型。
9.5用結構體和指針處理鏈表
9.5.1鏈表簡介
鏈表是動態(tài)地進行存儲分配的一種數(shù)據(jù)結構,特別適合規(guī)模不確定的復雜數(shù)據(jù)結構的批量數(shù)據(jù)表示與處理問題。例如,在一個學生成績管理系統(tǒng)中,需要處理多個班級的學生數(shù)據(jù),每個班學生數(shù)是不固定的。采用數(shù)組可以表示成績表數(shù)據(jù),但在定義數(shù)組長度時就會產(chǎn)生困惑。按人數(shù)少的班級定義數(shù)組長度,人數(shù)多的班級數(shù)據(jù)不夠用,按人數(shù)多的班級定義數(shù)組長度,則必然造成存儲空間的浪費。采用鏈表來表示學生成績表數(shù)據(jù),可完全解除這種困惑。鏈表是把一個學生的信息看作一個數(shù)據(jù)節(jié)點,成績表數(shù)據(jù)在存儲器中不連續(xù)存儲,通過一個指針把一個班學生數(shù)據(jù)連接起來,動態(tài)地分配內存,即可根據(jù)學生數(shù)來開辟內存空間。鏈表也有多種結構,一種簡單的單向鏈表結構如圖9.2所示。圖9.2一種簡單的單向鏈表結構鏈表中,與一個節(jié)點之前連接的節(jié)點稱為該節(jié)點的前驅節(jié)點,與一個節(jié)點之后連接的節(jié)點稱為該節(jié)點的后繼節(jié)點。鏈表的中間節(jié)點包含兩個域:一是數(shù)據(jù)域,存放學生實際數(shù)據(jù);二是地址域,存放后繼節(jié)點的地址。每一個鏈表都有一個頭節(jié)點,只有地址域,存放指向鏈表首節(jié)點的地址。每一個鏈表也有一個尾節(jié)點,包含數(shù)據(jù)域,但地址域為空(NULL),沒有后繼節(jié)點。每一個節(jié)點的地址都是由系統(tǒng)動態(tài)分配的。
可以看到,表中的元素節(jié)點由地址連接起來。訪問表中節(jié)點數(shù)據(jù),首先要提供頭指針,由頭節(jié)點指針連接表首元素節(jié)點,再由此節(jié)點連接下一元素節(jié)點,直到表尾節(jié)點。這樣的鏈接方式,如同一個鏈條,一環(huán)扣一環(huán),中間是不能斷開的,所以稱為鏈表。
鏈表中節(jié)點數(shù)據(jù)對象是一個結構體類型。學生成績表鏈表節(jié)點的數(shù)據(jù)結構可定義如下:
9.5.2建立靜態(tài)鏈表
例9.8
建立由4個學生信息節(jié)點組成的鏈表,并輸出各節(jié)點中的數(shù)據(jù)。
編程思路:定義節(jié)點數(shù)據(jù)對象為結構體類型,依照連接關系設置每個節(jié)點的指針成員,就可形成鏈表。
運行結果:
分析:建立鏈表要經(jīng)歷3個步驟:①根據(jù)節(jié)點數(shù)據(jù)定義節(jié)點結構體,指針成員是不可缺少的;②設置節(jié)點數(shù)據(jù),只需將數(shù)據(jù)賦給結構體對應成員;③建立連接關系,只需按節(jié)點順序關系,取結構體變量地址賦值即可。鏈表節(jié)點數(shù)據(jù)輸出,先使指針變量p指向頭節(jié)點,輸出頭節(jié)點指針所指向首節(jié)點數(shù)據(jù),將本節(jié)點指針成員的值賦給p,即指向下一節(jié)點,一直到p為NULL。9.5.3建立動態(tài)鏈表
建立動態(tài)鏈表需經(jīng)過以下步驟:
(1)使用動態(tài)分配函數(shù)malloc或calloc申請節(jié)點空間,得到節(jié)點地址,第一次申請節(jié)點為head節(jié)點,地址賦給head。
(2)從第1節(jié)點開始,申請節(jié)點得到地
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 纖維加工過程中的節(jié)能減排考核試卷
- 琥珀蜜蠟拍賣考核試卷
- 礦物學及巖石學考核試卷
- 糕點行業(yè)產(chǎn)品質量評價與監(jiān)督考核試卷
- 臨清市2024-2025學年五年級數(shù)學第二學期期末綜合測試模擬試題含答案
- 珠海三中高一下學期期中考試理科生物試題
- 吉林司法警官職業(yè)學院《紀錄片創(chuàng)作與拍攝》2023-2024學年第一學期期末試卷
- 山東蒙陰縣2024-2025學年中考化學試題倒計時模擬卷(2)含解析
- 遼寧省普蘭店市第一中學2025年高三下學期模擬測試(三)語文試題含解析
- 眉山職業(yè)技術學院《兒童舞蹈創(chuàng)編(實驗)》2023-2024學年第二學期期末試卷
- 國開電大《C語言程序設計》形考任務2答案
- 《猝死的預防和治療》課件
- 物業(yè)保潔作業(yè)指導書(三甲大型醫(yī)院類)
- 安全技術交底(模板)
- 2022新大象版科學五年級下冊必背知識點總結
- 混凝土氯離子含量試驗檢測記錄表(選擇性電極法)
- 納稅實務(第三版)項目一納稅基礎知識
- 藍色卡通風醫(yī)療健康匯報PPT模板
- 匯源果汁生產(chǎn)廢水處理工程設計
- 裸子植物課件
- 賓館安全保衛(wèi)制度
評論
0/150
提交評論