蘇小紅版12PPT課件_第1頁
蘇小紅版12PPT課件_第2頁
蘇小紅版12PPT課件_第3頁
蘇小紅版12PPT課件_第4頁
蘇小紅版12PPT課件_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1,第12章 結構體與共用體,哈爾濱工業(yè)大學 計算機科學與技術學院 蘇小紅,本章學習內容,結構體數(shù)據(jù)類型,共用體數(shù)據(jù)類型、枚舉數(shù)據(jù)類型、定義數(shù)據(jù)類型的別名 結構體變量、結構體數(shù)組、結構體指針的定義和初始化 結構體成員的引用、成員選擇運算符、指向運算符 向函數(shù)傳遞結構體變量、結構體數(shù)組、結構體指針 動態(tài)數(shù)據(jù)結構、動態(tài)鏈表,二進制數(shù)類型本不存在 內存里存的內容,你認為它是什么,它就是什么 在早期的機器指令及匯編語言中,數(shù)據(jù)對象均用二進制數(shù)表示,沒有類型的概念 一般的CPU只支持兩種類型 整數(shù)、浮點數(shù),12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型,在高級語言引入了基本數(shù)據(jù)類型 整型、浮點型、字符型等 不同語

2、言會定義不同的基本類型 基本數(shù)據(jù)類型并不能方便地解決所有問題 有些語言(如PL/1)中試圖規(guī)定較多的類型,如數(shù)組、樹、棧等,但實踐證明不是個好辦法,12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型,用戶自己構造數(shù)據(jù)類型復合數(shù)據(jù)類型 由基本數(shù)據(jù)類型迭代派生而來,表示復雜的數(shù)據(jù)對象 典型的代表就是“結構體” 抽象數(shù)據(jù)類型(Abstract Data Type,ADT) 在復合數(shù)據(jù)類型基礎上增加了對數(shù)據(jù)的操作 抽象數(shù)據(jù)類型進而進化為“類(Class)” 這是一個跨時代的進步 Class是Object-Oriented的一個重要概念,12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型,12.2 結構體的定義12.2.1為什么要

3、定義結構體類型,在程序里表示一個人(姓名、年齡、性別),怎么表示? 想表示多個人呢? 如何用計算機程序實現(xiàn)下述表格的管理,數(shù)組的解決方法,數(shù)組的解決方法,數(shù)據(jù)的內存管理方式,數(shù)組的解決方法,分配內存不集中,尋址效率不高 對數(shù)組賦初值時,易發(fā)生錯位 結構顯得零散,不易管理,希望的內存分配圖,結構體類型的聲明,聲明了一個結構體類型,構成結構體的變量稱為結構體的成員(Structure Member,結構體的名字稱為結構體標簽(Structure Tag,結構體類型的聲明,結構體模板(Structure Template,Dont forget the semicolon,形成一個類型聲明的樣板 用

4、于生成結構體變量 但并未聲明結構體變量 因而編譯器不為其分配內存,1)先定義結構體類型,再定義變量名,2)在定義類型的同時定義變量,3)直接定義結構體變量(不指定結構體標簽,12.2.2結構體變量的定義,12.2.3用typedef定義數(shù)據(jù)類型,struct student stu1, stu2;/*It works*/ student stu1, stu2; /*Can this work?*/ struct stu1, stu2; /*Can this work?*/ STUDENT stu1, stu2; /*It works!*,關鍵字typedef為一種已存在的類型定義一個別名,并未

5、定義新類型,STUDENT與struct student類型是同義詞,等價于,12.2.4結構體變量的初始化,等價于,注意,嵌套的結構體(Nested Structure)就是在一個結構體內包含了另一個結構體作為其成員,12.2.5嵌套的結構體,結構體定義 可以嵌套,訪問結構體變量的成員必須使用成員選擇運算符(也稱圓點運算符,12.2.6結構體變量的引用,當出現(xiàn)結構體嵌套時,必須以級聯(lián)方式訪問結構體成員,例12.1】演示結構體變量的賦值和引用方法,12.2.6結構體變量的引用,按結構體的成員順序逐一對相應成員進行賦值,格式符%02d中2d前面的前導符0表示輸出數(shù)據(jù)時,若左邊有多余位,則補0,例

6、12.1】若要從鍵盤輸入結構體變量stu1的內容,那么程序如何修改,兩個地址有何不同,例12.1】若要從鍵盤輸入結構體變量stu1的內容,那么程序如何修改,結構體成員的地址與該成員在結構體中所處的位置及其所占內存的字節(jié)數(shù)相關,結構體變量的地址 STUDENT *pt; pt =,如何定義指向結構體變量的指針,STUDENT *pt =,等價于,12.4結構體指針的定義和初始化,如何訪問結構體指針變量所指向的結構體成員呢,STUDENT stu1; STUDENT *pt =,pt,stu1,通過stu1和成員選擇運算符訪問結構體成員 stu1. studentID = 1; 通過pt和指向運算

7、符訪問結構體成員 (*pt). studentID = 1; pt - studentID = 1,12.4結構體指針的定義和初始化,pt,stu1,當結構體嵌套時,如何訪問結構體指針變量所指向的結構體成員,stu1. birthday. year = 1999; (*pt). birthday. year = 1999; pt - birthday. year = 1999,STUDENT stu1; STUDENT *pt =,12.4結構體指針的定義和初始化,STUDENT stu30; STUDENT *pt; pt = stu,如何定義指向結構體數(shù)組的指針,STUDENT *pt =

8、 stu,等價于,STUDENT *pt =,等價于,pt,stu30,使用pt+,使pt指向stu1 pt - studentID 等價于 stu1. studentID,pt,12.4結構體指針的定義和初始化,STUDENT stu30; STUDENT *pt = stu,如何訪問結構體數(shù)組指針指向的結構體成員,stu30,12.5向函數(shù)傳遞結構體,向函數(shù)傳遞結構體的單個成員 復制單個成員的內容 函數(shù)內對結構內容的修改不影響原結構 向函數(shù)傳遞結構體的完整結構 向函數(shù)傳遞結構體的首地址,struct date int year; int month; int day; ; void Fun

9、c(struct date p) p.year = 2000; p.month = 5; p.day = 22;,Before function call:1999/04/23,After function call:1999/04/23,結構體變量作函數(shù)參數(shù),例12.4,struct date int year; int month; int day; ; void Func(struct date *p) p-year = 2000; p-month = 5; p-day = 22;,Before function call:1999/04/23,After function call:2

10、000/05/22,結構體指針作函數(shù)參數(shù),指針作函數(shù)形參 實參必須為地址值,例12.5,struct date int year; int month; int day; ; struct date Func(struct date p) p.year = 2000; p.month = 5; p.day = 22; return p;,Before function call:1999/04/23,After function call:2000/05/22,結構體變量作函數(shù)返回值,例12.6,12.5向函數(shù)傳遞結構體,向函數(shù)傳遞結構體的完整結構 復制整個結構體成員的內容,多個值 函數(shù)內對結

11、構內容的修改不影響原結構 內容傳遞更直觀,但開銷大 向函數(shù)傳遞結構體的首地址 用結構體數(shù)組/結構體指針作函數(shù)參數(shù) 僅復制結構體的首地址,一個值 修改結構體指針所指向的結構體的內容 指針傳遞效率高,12.5向函數(shù)傳遞結構體,例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分,12.5向函數(shù)傳遞結構體,例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分,12.5向函數(shù)傳遞結構體,例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分,12.5向函數(shù)傳遞結構體,例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)

12、,編程并輸出計算學生的平均分,用戶自定義的數(shù)據(jù)類型,結構體(Struct) 把關系緊密且邏輯相關的多種不同類型的變量,組織到統(tǒng)一的名字之下 占用相鄰的一段內存單元 共用體,也稱聯(lián)合(Union) 把情形互斥但邏輯相關的多種不同類型的變量,組織到統(tǒng)一的名字之下 占用同一段內存單元,每一時刻只有一個數(shù)據(jù)起作用,12.6共用體,struct sample short i; char ch; float f;,union sample short i; char ch; float f;,printf(%dn, sizeof(struct sample,8個字節(jié),i,ch,f,4個字節(jié),printf(

13、%dn, sizeof(union sample,例12.8,12.6共用體,sizeof(union number)取決于占空間最多的那個成員變量,同一內存單元在每一瞬時只能存放其中一種類型的成員 起作用的成員是最后一次存放的成員,不能作為函數(shù)參數(shù) 不能進行比較操作,只能對第一個成員初始化,f,4個字節(jié),12.6共用體,12.6共用體,12.7 枚舉數(shù)據(jù)類型,枚舉(Enumeration)數(shù)據(jù)類型 描述的是一組整型值的集合 用于當某些量僅由有限個數(shù)據(jù)值組成時 enum weeks SUN, MON, TUE, WED, THU, FRI, SAT; enum weeks today; enu

14、m response no, yes, none; enum response answer; today = TUE; answer = yes; enum response no = -1, yes = 1, none = 0,其值為2,其值為1,下面的結構是什么意思? struct temp int data; struct temp pt; CB下的錯誤提示: field pt has incomplete type VC下的錯誤提示: pt uses undefined struct temp 下面的結構是什么意思呢? struct temp int data; struct tem

15、p *pt,可包含指向本結構體類型的指針變量,問題的提出,12.8 動態(tài)數(shù)據(jù)結構 單向鏈表,struct Link int data; struct Link *next;,鏈表(Linked Table):線性表的鏈式存儲結構 特點:用一組任意的存儲單元存儲線性表的數(shù)據(jù);存儲單元可以是連續(xù)的,也可是不連續(xù)的,鏈表的定義,鏈表(Linked table):線性表的鏈式存儲結構 為表示每個元素與后繼元素的邏輯關系,除存儲元素本身信息外,還要存儲其直接后繼信息,兩部分信息組成一個節(jié)點,struct Link int data; struct Link *next;,數(shù)據(jù)域:存儲數(shù)據(jù)元素信息,指針域

16、:存儲直接后繼的節(jié)點信息,鏈表的定義,鏈表(Linked Table):線性表的鏈式存儲結構 為表示每個元素與后繼元素的邏輯關系,除存儲元素本身信息外,還要存儲其直接后繼信息,struct Link int data; struct Link *next;,n個節(jié)點鏈接成一個鏈表(因為只包含一個指針域,故又稱線性鏈表或單向鏈表,鏈表的建立,向鏈表中添加一個新節(jié)點,空指針NULL表示鏈表結尾,鏈表的頭指針:訪問鏈表的關鍵,鏈表的建立,若原鏈表為空表(head = NULL) ,則將新建節(jié)點p置為頭節(jié)點,1)head = p,2) pr = p,3) pr-next = NULL,鏈表的建立,若原

17、鏈表為非空,則將新建節(jié)點p添加到表尾,1) pr-next = p,2) pr = p,3) pr-next = NULL,next,鏈表的刪除操作,若原鏈表為空表,則退出程序 若待刪除節(jié)點p是頭節(jié)點,則將head指向當前節(jié)點的下一個節(jié)點即可刪除當前節(jié)點,1) head = p-next,head,2) free(p,鏈表的刪除操作,若待刪除節(jié)點不是頭節(jié)點,則將前一節(jié)點的指針域指向當前節(jié)點的下一節(jié)點即可刪除當前節(jié)點,1) pr-next = p-next,若已搜索到表尾(p-next = NULL)仍未找到待刪除節(jié)點,則顯示“未找到,2) free(p,鏈表的插入操作,若原鏈表為空表,則將新節(jié)點p作為頭節(jié)點,讓head指向新節(jié)點p,1) head = p,p = (struct link *)malloc(sizeof(struct link); p-next = NULL; p-data = nodeData,鏈表的插入操作,若原鏈表為非空,則按節(jié)點值(假設已按升序排

溫馨提示

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

評論

0/150

提交評論