構造數(shù)據(jù)類型及其應用_第1頁
已閱讀1頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1,第10章 構造數(shù)據(jù)類型及其應用,2,第10章 構造數(shù)據(jù)類型及其應用,10.1 結構體數(shù)據(jù)類型 10.2 結構體類型變量 10.3 結構體數(shù)組 10.4 結構體指針10.5 結構體變量與函數(shù) 10.6 內(nèi)存的動態(tài)存儲分配技術 10.7 結構體應用實例 10.8 共用體 10.9 枚舉 10.10 自定義類型 10.11 小結,3,10.1 結構體數(shù)據(jù)類型,10.1.1 什么是結構體10.1.2 如何定義結構體

2、,4,10.1.1 什么是結構體,“結構體”是一種構造類型,它由若干“成員”(或稱為域)組成。 每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構造類型。不同的結構體類型可根據(jù)需要,由不同的成員組成。但對于某個具體的結構體類型,其成員的數(shù)量必須是固定的,這和數(shù)組是相同的。但該結構體中各個成員的類型可以不同,這是結構體和數(shù)組的區(qū)別。,5,10.1.2 如何定義結構體,結構體既是一種“構造”而成的數(shù)據(jù)類型,那么在說明和使用之前必須先定義它

3、,也就是構造它。如同在說明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。定義一個結構體類型的一般形式為:struct 結構體類型名{類型名1 結構體成員名1;類型名2 結構體成員名2;……類型名n 結構體成員名n;};,6,10.2 結構體類型變量,10.2.1 如何定義結構體變量10.2.2 如何引用結構體變量10.2.3 如何初始化結構體變量,7,10.2.1 如何定義結構體變量,定義結構變量有3種方法:先

4、定義結構體再定義結構體變量;在定義結構體類型的同時定義結構體變量;直接定義結構體變量。下面以定義員工信息的結構體變量為例進行說明。(1)先定義結構,再說明結構變量struct 結構體類型名 結構體變量名表列; (2)在定義結構類型的同時說明結構變量struct 結構體類型名{……}結構體變量名表列;(3)直接說明結構變量struct {……}結構體變量名表列;,8,10.2.2 如何引用結構體

5、變量,C 規(guī)定引用結構體成員有兩種方式:用結構體成員運算符方式和指針方式。指針方式在以后的章節(jié)中介紹,這里主要介紹結構體成員運算符方式。結構體成員運算符引用結構體成員的形式為: . 【例10-1】本實例演示了結構體變量的輸入和輸出。,9,10.2.3 如何初始化結構體變量,由于結構體類型變量中包含各類不同數(shù)據(jù)類型的成員,所以結構體類型變量的初始化就略顯復雜。結構體變量初始化的一般形式如下:struct 結構體名 結

6、構體變量名={各成員初始數(shù)據(jù)}; 【例10-2】本實例演示了外部存儲類型的結構體變量初始化的實現(xiàn)。 【例10-3】本實例演示了靜態(tài)存儲類型的結構體變量初始化的實現(xiàn)。 【例10-4】本實例演示了將一個結構體變量直接賦值給另一個結構體變量的實現(xiàn)。,10,10.3 結構體數(shù)組,10.3.1 如何定義結構體數(shù)組10.3.2 如何初始化結構體數(shù)組10.3.3 如何引用結構體數(shù)組,11,10.3.1 如何定義結構體數(shù)組,結構

7、體數(shù)組的定義方法和結構體變量相似,只需說明它為數(shù)組類型,多用一個方括號而已。結構體數(shù)組的定義有3種方法:先定義結構再定義結構體數(shù)組、在定義結構體類型的同時定義結構體數(shù)組、直接定義結構體數(shù)組。(1)先定義結構,再說明結構變量struct 結構體類型名 結構體數(shù)組; (2)在定義結構類型的同時說明結構變量struct 結構體類型名{……}結構體數(shù)組; (3)直接說明結構變量struct {……}結構

8、體數(shù)組;,12,10.3.2 如何初始化結構體數(shù)組,結構體數(shù)組也是數(shù)組,數(shù)組定義時系統(tǒng)只能對外部的或靜態(tài)的結構體數(shù)組初始化。數(shù)組初始化時,將初始化的數(shù)據(jù)放在一對花括號內(nèi)。在對結構體數(shù)組初始化時,也要將每個元素的初始化數(shù)據(jù)用花括號括起來。由于每個結構體變量本身初始化時又需用花括號括起來,所以,對結構體數(shù)組初始化至少有兩層花括號。[存儲類型] struct 結構體名 結構體數(shù)組名[ n]={初始數(shù)據(jù)表列};,13,10.3.3

9、 如何引用結構體數(shù)組,一個結構體數(shù)組中的元素相當于一個結構體變量,所以引用結構體數(shù)組元素的方法和引用結構體變量的方法一樣。(1)引用數(shù)組中某個元素中的成員,形式如下:數(shù)組元素.成員名(2)可以將結構體數(shù)組元素賦值給同類型的結構體變量,也可以賦值給同一結構體類型數(shù)組中另外一個元素。 (3)同結構體變量相同,不能將結構體數(shù)組元素作為一個整體進行直接輸入或輸出。 【例10-5】本實例演示了輸入輸出5名員工的信息并計算員工的平均

10、工資。,14,10.4 結構體指針,10.4.1 結構體類型變量的指針10.4.2 結構體類型數(shù)組指針,15,10.4.1 結構體類型變量的指針,指向結構體變量的指針又稱為結構體指針,它是一個指針變量,它指向一個結構體變量,它的值是所指向的結構體變量的首地址。 結構體指針的定義類似于普通指針的定義,其一般形式如下:struct結構體名 *結構體指針名 通過結構體指針來引用結構體變量的成員,一般形式如下:(*結構體指

11、針名).成員名 【代碼10-6】演示了通過結構體指針來引用結構體變量的成員。,16,10.4.2 結構體類型數(shù)組指針,一個指針變量可以指向一個數(shù)組,它存儲的是數(shù)組的首地址。那么指針變量也可以指向一個結構體數(shù)組,稱為結構體數(shù)組指針。同樣結構體數(shù)組指針存儲的也是結構體數(shù)組的首地址。 【例10-7】本實例演示了結構體數(shù)組指針的使用。,17,10.5 結構體變量與函數(shù),10.5.1 結構體變量作函數(shù)參數(shù)10.5.2 結構體變量

12、作函數(shù)的返回值,18,10.5.1 結構體變量作函數(shù)參數(shù),用結構體變量的成員做函數(shù)的實參,形參和結構體變量成員的類型相同,調(diào)用函數(shù)時將實參傳遞給形參。當然,這屬于參數(shù)傳遞的“值傳遞”方式?!爸祩鬟f”的方法和普通變量做參數(shù)的用法是一樣的。用結構體指針或結構體數(shù)組指針做實參,用指針做形參,將結構體變量或結構體數(shù)組的地址傳給形參,這屬于函數(shù)參數(shù)傳遞的“傳地址”方式。 【例10-8】本實例演示了函數(shù)參數(shù)傳遞的“傳地址”方式的使用。

13、【例10-9】本實例演示了用結構變量作函數(shù)參數(shù)的使用。,19,10.5.2 結構體變量作函數(shù)的返回值,函數(shù)的返回值可以是整型、字符型、實型、數(shù)組和指針類型。在新的C語言的標準中,允許函數(shù)的返回值是一個結構體類型的變量。【例10-10】本實例演示了利用函數(shù)實現(xiàn)輸入輸出員工的信息并計算員工的平均工資。,20,10.6 內(nèi)存的動態(tài)存儲分配技術,10.6.1 內(nèi)存的動態(tài)存儲分配10.6.2 鏈表10.6.3 動態(tài)存儲分配函數(shù)1

14、0.6.4 創(chuàng)建鏈表10.6.5 查詢鏈表10.6.6 鏈表結點的插入10.6.7 鏈表結點的刪除,21,10.6.1 內(nèi)存的動態(tài)存儲分配,動態(tài)存儲分配技術,就是在程序運行期間,根據(jù)需要臨時分配內(nèi)存單元來存放所需的數(shù)據(jù),當數(shù)據(jù)不用時可以隨時釋放它所占用的存儲空間。釋放掉的存儲空間又可以分配給其他數(shù)據(jù)作為存儲空間。這種分配和釋放是受程序控制的,它分配的空間是系統(tǒng)的自由空間,釋放時又還回系統(tǒng),成為自由空間。,22,10.6.

15、2 鏈表,需要一種方法,實現(xiàn)在程序需要存儲一個雇員的信息時,就可以分配一個空間來存儲該雇員的信息。而如果某雇員的信息沒有用了,又可以將它所占用的存儲空間釋放掉。而動態(tài)存儲分配就是很好的選擇。 利用結構體變量和指針來實現(xiàn)鏈表的方法。鏈表是一種常見的重要數(shù)據(jù)結構,它是動態(tài)的進行存儲單元分配的一種結構。,23,10.6.3 動態(tài)存儲分配函數(shù),C語言新標準ANSI C要求各C編譯版本提供的標準庫函數(shù)中包括動態(tài)分配存儲的函數(shù)。常用的有4個,

16、它們是:malloc()函數(shù)、calloc()函數(shù)、free()函數(shù)和realloc()函數(shù)。 【例10-11】本實例演示分配一段內(nèi)存空間用來存儲員工的信息。 【例10-12】本實例演示分配50個float類型的內(nèi)存空間。 【例10-13】本實例演示了分配一塊區(qū)域存儲一個雇員信息的實現(xiàn)。,24,10.6.4 創(chuàng)建鏈表,對鏈表的主要操作有以下4種:建立鏈表、結構的查找與輸出、插入一個結點、刪除一個結點。建立鏈表就是指從無到有的建立

17、起一個鏈表,即一個一個依次的輸入每個結點的數(shù)據(jù),并建立前后相連的關系。下面通過一個實例來說明建立鏈表的操作。【例10-14】建立一個鏈表,存放n個雇員的數(shù)據(jù)(雇員信息只包括雇員號no和雇員姓名name)。,25,10.6.5 查詢鏈表,鏈表的查詢,也就是訪問鏈表中的某個結點或所有結點。經(jīng)常要用鏈表中結點的數(shù)據(jù)進行各種運算,或對結點成員的值進行修改,這些都要涉及到鏈表的查詢。所以鏈表的查詢操作非常有用。下面通過例題來說明查詢鏈表中某

18、個結點的操作?!纠?0-15】已知某個雇員的雇員號,編寫一個函數(shù),在鏈表中按雇員號查找該雇員結點。,26,10.6.6 鏈表結點的插入,向一個已有的鏈表中插入一個結點,關鍵是要修改新插入結點與它之前及之后結點的連接問題。如原來手拉手的小朋友1、2、3、4,現(xiàn)在要在3、4兩個小朋友之間插入一個小朋友,那么新小朋友和4小朋友拉手,再讓3小朋友和新插入小朋友拉手就可以了。下面通過例題來說明在鏈表中插入一個新結點的操作?!纠?0-16

19、】編寫一個函數(shù),在鏈表head中的p指針所指的結點后插入一個新雇員結點。,27,10.6.7 鏈表結點的刪除,從一個鏈表中刪除一個結點,并不一定是真的將它從內(nèi)存中刪除。而是將它從鏈表中分離,即改變原鏈表中刪除結點前后結點之間的關系。如果被刪除結點的空間要還回給內(nèi)存,可以進一步將該結點占用的內(nèi)存空間釋放。 【例10-17】已知某個雇員的雇員號,編寫一個函數(shù),將該雇員從鏈表中刪除。,28,10.7 結構體應用實例,【例10-18】本實

20、例演示了向有序雇員鏈表中插入結點(結點的順序是按照雇員號遞增排序的)。 【例10-19】本實例演示了鏈表的所有常規(guī)操作的實現(xiàn)。,29,10.8 共用體,10.8.1 什么是共用體10.8.2 如何聲明共用體10.8.3 如何引用共用體變量成員10.8.4 共用體的使用注意事項,30,10.8.1 什么是共用體,“共用體”也是一種構造類型的數(shù)據(jù)結構。它允許不同長度、不同類型的數(shù)據(jù)共享同一塊存儲空間,也就是大家共用一塊內(nèi)存

21、區(qū)域,聯(lián)合起來。所以,“共用體”又稱為“聯(lián)合”。如果一個變量是“共用體”類型,在程序運行的不同時期,該變量可能是不同的類型和長度。,31,10.8.2 如何聲明共用體,定義一個共用體類型的一般形式為:union 共用體名{成員表列;};成員表列中含有若干成員,成員的一般形式為: 類型說明符 成員名;,32,10.8.3 如何引用共用體變量成員,同結構體類似,共用體變量要先說明后引用。引用時不能直接引用共用體變量

22、,而要引用共用體變量中的成員。C規(guī)定引用共用體成員有兩種方式:用“.”成員運算符方式和指針方式。“.”成員運算符方式引用共用體成員的形式為: . 通過共用體指針引用共用體成員的形式為:共用體指針名->成員名【例10-20】本實例演示了共用體變量的輸入和輸出。,33,10.8.4 共用體的使用注意事項,(1)在結構中各成員有各自的內(nèi)存空間,一個結構變量的總長度是各成員長度之和。而在“共用體”中,各成員共享一段內(nèi)

23、存空間,一個共用體變量的長度等于各成員中最長的長度。(2)這里所謂的共享不是指把多個成員同時裝入一個共用體變量內(nèi),而是指該共用體變量可被賦予任一成員值,但每次只能賦一種值,賦入新值則覆蓋舊值。(3)共用體變量的地址和它的各個成員的地址都是同一個地址。(4)不能對共用體變量名賦值,也不能通過引用變量名來得到成員的值。(5)新標準中允許將共用體變量用作函數(shù)的參數(shù),可以使用指針指向共用體變量,即允許使用指向共用體變量的指針。(6)共

24、用體類型和結構體類型可以相互嵌套,即共用體類型中可以有結構體類型,結構體類型中也可以有共用體類型。(7)可以定義共用體數(shù)組,共用體中的成員也可以有數(shù)組。如前面定義的共用體類型department中的office是字符數(shù)組。 【例10-21】本實例演示了如何存儲學校人員的基本信息。,34,10.9 枚舉,10.9.1 如何定義枚舉類型10.9.2 如何聲明枚舉類型變量10.9.3 如何引用枚舉類型變量10.9.4 枚舉

25、類型的實用注意事項,35,10.9.1 如何定義枚舉類型,“枚舉”就是指將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍。在“枚舉”類型的定義中列舉出所有可能的取值,被說明為該“枚舉”類型的變量取值不能超過定義的范圍。 枚舉類型定義的一般形式為:enum 枚舉名{ 枚舉值表;};,36,10.9.2 如何聲明枚舉類型變量,如同結構和共用體一樣,枚舉變量也可用3種不同的方式聲明,即先定義后聲明、同時定義聲明或

26、直接聲明。,37,10.9.3 如何引用枚舉類型變量,在系統(tǒng)中枚舉類型變量做了一些處理,所以,在引用枚舉類型變量時有以下規(guī)定:(1)由枚舉類型變量的定義可知,為枚舉類型變量賦值只能是枚舉值表中的一個。(2)在C語言的編譯系統(tǒng)中,系統(tǒng)對枚舉元素本身定義了一個表示序號的數(shù)值。從0開始順序定義為0、1、2…。 【例10-22】本實例演示了輸出枚舉元素的值。,38,10.9.4 枚舉類型的實用注意事項,(1)枚舉元素的值雖然在編譯時

27、由系統(tǒng)指定,系統(tǒng)指定的值是按照枚舉元素所處的順序由0開始,即0、1……。但是,枚舉元素的值也可以在定義的時候由程序員指定。 (2)枚舉值可以在條件判斷中進行比較。 (3)枚舉類型變量的存儲類型也有自動、外部和靜態(tài)3種。 (4)如果枚舉類型說明在函數(shù)的內(nèi)部,那么只能在該函數(shù)內(nèi)部定義該枚舉類型的變量。(5)在枚舉類型定義中,枚舉元素是用戶定義的標識符。 (6)枚舉類型的變量可以作循環(huán)變量、條件表達式等。(7)作為枚舉元素的標識符

28、不能在程序中再做其他用途。(8)枚舉元素不是字符串,所以不能用下面的方法輸出字符串“mon”。printf(“ %s \n”,mon); 【例10-23】一個月30天分別循環(huán)做4件事a、b、c、d。如1號做a事、2號做b事、3號做c事、4號做d事、5號做a事、6號做b事、……。編寫程序輸出每天要做的事情。,39,10.10 自定義類型,C語言不僅提供了豐富的數(shù)據(jù)類型,而且還允許由用戶自己定義類型說明符,也就是說允許由用戶為數(shù)據(jù)

29、類型取“別名”。就像有的人有一個大名,又有一個小名一樣。類型定義符typedef即可用來完成此功能。typedef定義的一般形式為: typedef 原類型名 新類型名,40,10.11 小結,主要講解了結構體、共用體、枚舉及自定義數(shù)據(jù)類型。另外講解了內(nèi)存的動態(tài)分配技術,及鏈表類型的數(shù)據(jù)結構的簡單操作。 動態(tài)存儲分配技術,就是在程序的運行期間,根據(jù)需要臨時分配內(nèi)存單元用來存放有用的數(shù)據(jù),當數(shù)據(jù)不再需要時可以隨時釋放它所占用的存儲

30、空間。釋放掉的存儲空間又可以分配給其他數(shù)據(jù)作為存儲空間。 “共用體”也是一種構造類型的數(shù)據(jù)結構。它允許不同長度不同類型的數(shù)據(jù)共享同一塊存儲空間,也就是大家共用一塊內(nèi)存區(qū)域,聯(lián)合起來。所以,“共用體”又稱為“聯(lián)合”。枚舉”就是指將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍。在“枚舉”類型的定義中列舉出所有可能的取值,被說明為該“枚舉”類型的變量取值不能超過定義的范圍。自定義類型說明符就是給已經(jīng)存在的數(shù)據(jù)類型重新命名一個新

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論