




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本章學(xué)習(xí)內(nèi)容
結(jié)構(gòu)體數(shù)據(jù)類型,共用體數(shù)據(jù)類型,枚舉數(shù)據(jù)類型,定義數(shù)據(jù)類型的別名
結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針的定義和初始化
結(jié)構(gòu)體成員的引用,成員選擇運(yùn)算符,指向運(yùn)算符
向函數(shù)傳遞結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針
動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)、動(dòng)態(tài)鏈表第1頁/共59頁二進(jìn)制數(shù)——類型本不存在內(nèi)存里存的內(nèi)容,你認(rèn)為它是什么,它就是什么在早期的機(jī)器指令及匯編語言中,數(shù)據(jù)對象均用二進(jìn)制數(shù)表示,沒有類型的概念一般的CPU只支持兩種類型整數(shù)、浮點(diǎn)數(shù)12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型第2頁/共59頁在高級語言引入了基本數(shù)據(jù)類型整型、浮點(diǎn)型、字符型等不同語言會(huì)定義不同的基本類型基本數(shù)據(jù)類型并不能方便地解決所有問題有些語言(如PL/1)中試圖規(guī)定較多的類型,如數(shù)組、樹、棧等,但實(shí)踐證明不是個(gè)好辦法12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型第3頁/共59頁用戶自己構(gòu)造數(shù)據(jù)類型-復(fù)合數(shù)據(jù)類型由基本數(shù)據(jù)類型迭代派生而來,表示復(fù)雜的數(shù)據(jù)對象典型的代表就是“結(jié)構(gòu)體”抽象數(shù)據(jù)類型(AbstractDataType,簡稱ADT)在復(fù)合數(shù)據(jù)類型基礎(chǔ)上增加了對數(shù)據(jù)的操作抽象數(shù)據(jù)類型進(jìn)而進(jìn)化為“類(Class)”這是一個(gè)跨時(shí)代的進(jìn)步Class是Object-Oriented的一個(gè)重要概念12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型第4頁/共59頁12.2.1為什么要定義結(jié)構(gòu)體類型在程序里表示一個(gè)人(姓名、年齡、性別…),怎么表示?想表示多個(gè)人呢?如何用計(jì)算機(jī)程序?qū)崿F(xiàn)下述表格的管理?第5頁/共59頁數(shù)組的解決方法第6頁/共59頁數(shù)組的解決方法第7頁/共59頁數(shù)據(jù)的內(nèi)存管理方式數(shù)組的解決方法分配內(nèi)存不集中,尋址效率不高對數(shù)組賦初值時(shí),易發(fā)生錯(cuò)位結(jié)構(gòu)顯得零散,不易管理第8頁/共59頁希望的內(nèi)存分配圖
第9頁/共59頁結(jié)構(gòu)體類型的聲明聲明了一個(gè)結(jié)構(gòu)體類型構(gòu)成結(jié)構(gòu)體的變量稱為結(jié)構(gòu)體的成員(StructureMember)結(jié)構(gòu)體的名字稱為結(jié)構(gòu)體標(biāo)簽(StructureTag)第10頁/共59頁結(jié)構(gòu)體類型的聲明結(jié)構(gòu)體模板(StructureTemplate)Don’tforgetthesemicolon!!形成一個(gè)類型聲明的樣板用于生成結(jié)構(gòu)體變量但并未聲明結(jié)構(gòu)體變量因而編譯器不為其分配內(nèi)存
第11頁/共59頁(1)先定義結(jié)構(gòu)體類型,再定義變量名(2)在定義類型的同時(shí)定義變量(3)直接定義結(jié)構(gòu)體變量(不指定結(jié)構(gòu)體標(biāo)簽)12.2.2結(jié)構(gòu)體變量的定義第12頁/共59頁12.2.3用typedef定義數(shù)據(jù)類型struct
student
stu1,stu2;/*Itworks*/student
stu1,stu2;/*Canthiswork?*/struct
stu1,stu2;/*Canthiswork?*/STUDENT
stu1,stu2;
/*Itworks!*/關(guān)鍵字typedef為一種已存在的類型定義一個(gè)別名,并未定義新類型STUDENT與structstudent類型是同義詞第13頁/共59頁等價(jià)于12.2.4結(jié)構(gòu)體變量的初始化等價(jià)于注意!第14頁/共59頁嵌套的結(jié)構(gòu)體(NestedStructure)就是在一個(gè)結(jié)構(gòu)體內(nèi)包含了另一個(gè)結(jié)構(gòu)體作為其成員12.2.5嵌套的結(jié)構(gòu)體結(jié)構(gòu)體定義可以嵌套第15頁/共59頁訪問結(jié)構(gòu)體變量的成員必須使用成員選擇運(yùn)算符(也稱圓點(diǎn)運(yùn)算符)12.2.6結(jié)構(gòu)體變量的引用當(dāng)出現(xiàn)結(jié)構(gòu)體嵌套時(shí),必須以級聯(lián)方式訪問結(jié)構(gòu)體成員第16頁/共59頁【例12.1】演示結(jié)構(gòu)體變量的賦值和引用方法12.2.6結(jié)構(gòu)體變量的引用按結(jié)構(gòu)體的成員順序逐一對相應(yīng)成員進(jìn)行賦值格式符%02d中2d前面的前導(dǎo)符0表示輸出數(shù)據(jù)時(shí),若左邊有多余位,則補(bǔ)0第17頁/共59頁【例12.1】若要從鍵盤輸入結(jié)構(gòu)體變量stu1的內(nèi)容,那么程序如何修改?兩個(gè)地址有何不同?第18頁/共59頁【例12.1】若要從鍵盤輸入結(jié)構(gòu)體變量stu1的內(nèi)容,那么程序如何修改?結(jié)構(gòu)體成員的地址與該成員在結(jié)構(gòu)體中所處的位置及其所占內(nèi)存的字節(jié)數(shù)相關(guān)結(jié)構(gòu)體變量的地址&stu2是該變量所占內(nèi)存空間的首地址第19頁/共59頁12.2.7結(jié)構(gòu)體所占內(nèi)存的字節(jié)數(shù)struct類型用內(nèi)存字節(jié)數(shù)=?是所有成員變量的內(nèi)存總和嗎?printf("%d\n",sizeof(struct
sample));用運(yùn)算符sizeof獲得結(jié)構(gòu)體大小sizeof(變量或表達(dá)式)sizeof(類型)12Why?printf("%d\n",sizeof(SAMPLE));【例12.2】第20頁/共59頁12.2.7結(jié)構(gòu)體所占內(nèi)存的字節(jié)數(shù)事實(shí)上,所有數(shù)據(jù)類型在內(nèi)存中都是從偶數(shù)地址開始存放的且結(jié)構(gòu)所占的實(shí)際空間一般是按照機(jī)器字長對齊的不同的編譯器、平臺(tái),對齊方式會(huì)有變化結(jié)構(gòu)體變量的成員的存儲(chǔ)對齊規(guī)則是與機(jī)器相關(guān)的具有特定數(shù)據(jù)類型的數(shù)據(jù)項(xiàng)大小也是與機(jī)器相關(guān)的所以一個(gè)結(jié)構(gòu)體在內(nèi)存中的存儲(chǔ)格式也是與機(jī)器相關(guān)的非所有成員變量的內(nèi)存總和12個(gè)字節(jié)chfchchchf第21頁/共59頁12.3結(jié)構(gòu)體數(shù)組的定義和初始化第22頁/共59頁12.3結(jié)構(gòu)體數(shù)組的定義和初始化建立了數(shù)據(jù)庫中的多條記錄,每條對應(yīng)一個(gè)學(xué)生信息第23頁/共59頁【例12.3】利用結(jié)構(gòu)體數(shù)組計(jì)算每個(gè)學(xué)生的平均分第24頁/共59頁12.4結(jié)構(gòu)體指針的定義和初始化ptstu1
STUDENT
stu1;
STUDENT
*pt;pt=&stu1;成員1成員2成員3成員4成員5如何定義指向結(jié)構(gòu)體變量的指針?STUDENT
*pt=&stu1;等價(jià)于第25頁/共59頁12.4結(jié)構(gòu)體指針的定義和初始化如何訪問結(jié)構(gòu)體指針變量所指向的結(jié)構(gòu)體成員呢?STUDENT
stu1;
STUDENT
*pt=&stu1;ptstu1成員1成員2成員3成員4成員5通過stu1和成員選擇運(yùn)算符訪問結(jié)構(gòu)體成員stu1.studentID=1;通過pt和指向運(yùn)算符訪問結(jié)構(gòu)體成員(*pt).studentID=1;
pt->studentID=1;第26頁/共59頁12.4結(jié)構(gòu)體指針的定義和初始化ptstu1成員1成員2成員3成員4成員5當(dāng)結(jié)構(gòu)體嵌套時(shí),如何訪問結(jié)構(gòu)體指針變量所指向的結(jié)構(gòu)體成員?stu1.
birthday.
year=1999;(*pt).
birthday.
year=1999;pt->
birthday.
year=1999;STUDENT
stu1;
STUDENT
*pt=&stu1;第27頁/共59頁12.4結(jié)構(gòu)體指針的定義和初始化
STUDENT
stu[30];
STUDENT
*pt;pt=stu;
如何定義指向結(jié)構(gòu)體數(shù)組的指針?STUDENT
*pt=stu;等價(jià)于STUDENT
*pt=&stu[0];等價(jià)于ptstu[30]stu[0]stu[1]stu[2]stu[3]stu[4]stu[5]......stu[29]第28頁/共59頁使用pt++,使pt指向stu[1]pt->studentID等價(jià)于
stu[1].studentIDpt12.4結(jié)構(gòu)體指針的定義和初始化
STUDENT
stu[30];
STUDENT
*pt=stu;
如何訪問結(jié)構(gòu)體數(shù)組指針指向的結(jié)構(gòu)體成員?stu[30]stu[0]stu[1]stu[2]stu[3]stu[4]stu[5]......stu[29]第29頁/共59頁12.5向函數(shù)傳遞結(jié)構(gòu)體向函數(shù)傳遞結(jié)構(gòu)體的單個(gè)成員復(fù)制單個(gè)成員的內(nèi)容函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu)向函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu)向函數(shù)傳遞結(jié)構(gòu)體的首地址第30頁/共59頁structdate{
intyear;
intmonth;
intday;};voidfunc(structdate
p){
p.year=2000;
p.month=5;
p.day=22;}Beforefunctioncall:1999/04/23Afterfunctioncall:1999/04/23結(jié)構(gòu)體變量
作函數(shù)參數(shù)【例12.4】第31頁/共59頁structdate{
intyear;
intmonth;
intday;};voidfunc(structdate
*p){
p->year=2000;
p->month=5;
p->day=22;}Beforefunctioncall:1999/04/23Afterfunctioncall:2000/05/22結(jié)構(gòu)體指針
作函數(shù)參數(shù)指針作函數(shù)形參實(shí)參必須為地址值【例12.5】第32頁/共59頁structdate{
intyear;
intmonth;
intday;};structdatefunc(structdate
p){
p.year=2000;
p.month=5;
p.day=22;
returnp;}Beforefunctioncall:1999/04/23Afterfunctioncall:2000/05/22結(jié)構(gòu)體變量
作函數(shù)返回值【例12.6】第33頁/共59頁12.5向函數(shù)傳遞結(jié)構(gòu)體向函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu)復(fù)制整個(gè)結(jié)構(gòu)體成員的內(nèi)容,多個(gè)值函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu)內(nèi)容傳遞更直觀,但開銷大向函數(shù)傳遞結(jié)構(gòu)體的首地址用結(jié)構(gòu)體數(shù)組/結(jié)構(gòu)體指針作函數(shù)參數(shù)僅復(fù)制結(jié)構(gòu)體的首地址,一個(gè)值修改結(jié)構(gòu)體指針?biāo)赶虻慕Y(jié)構(gòu)體的內(nèi)容指針傳遞效率高第34頁/共59頁12.5向函數(shù)傳遞結(jié)構(gòu)體【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)編程并輸出計(jì)算學(xué)生的平均分
第35頁/共59頁12.5向函數(shù)傳遞結(jié)構(gòu)體【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)編程并輸出計(jì)算學(xué)生的平均分
第36頁/共59頁12.5向函數(shù)傳遞結(jié)構(gòu)體【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)編程并輸出計(jì)算學(xué)生的平均分
第37頁/共59頁12.5向函數(shù)傳遞結(jié)構(gòu)體【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)編程并輸出計(jì)算學(xué)生的平均分
第38頁/共59頁用戶自定義的數(shù)據(jù)類型結(jié)構(gòu)體(Struct)把關(guān)系緊密且邏輯相關(guān)的多種不同類型的變量,組織到統(tǒng)一的名字之下占用相鄰的一段內(nèi)存單元共用體,也稱聯(lián)合(Union)把情形互斥但邏輯相關(guān)的多種不同類型的變量,組織到統(tǒng)一的名字之下占用同一段內(nèi)存單元,每一時(shí)刻只有一個(gè)數(shù)據(jù)起作用第39頁/共59頁12.6共用體structsample{
shorti;
charch;
floatf;};0x0037b00unionsample{
shorti;
charch;
floatf;};printf("%d\n",sizeof(structsample));8個(gè)字節(jié)ichf4個(gè)字節(jié)printf("%d\n",sizeof(unionsample));ichf【例12.8】第40頁/共59頁12.6共用體sizeof(unionnumber)取決于占空間最多的那個(gè)成員變量0x0037b00同一內(nèi)存單元在每一瞬時(shí)只能存放其中一種類型的成員起作用的成員是最后一次存放的成員,不能作為函數(shù)參數(shù)不能進(jìn)行比較操作,只能對第一個(gè)成員初始化f4個(gè)字節(jié)第41頁/共59頁12.6共用體第42頁/共59頁12.6共用體第43頁/共59頁12.7.1枚舉數(shù)據(jù)類型枚舉(Enumeration)數(shù)據(jù)類型描述的是一組整型值的集合用于當(dāng)某些量僅由有限個(gè)數(shù)據(jù)值組成時(shí)
enumweeks{SUN,MON,TUE,WED,THU,FRI,SAT};
enumweekstoday;enumresponse{no,yes,none};enumresponseanswer;
today=TUE;
answer=yes;
enumresponse{no=-1,yes=1,none=0};其值為2其值為1第44頁/共59頁下面的結(jié)構(gòu)是什么意思?structtemp
{
int data;
structtemppt;
};CB下的錯(cuò)誤提示:field'pt'hasincompletetypeVC下的錯(cuò)誤提示:'pt'usesundefinedstruct'temp'下面的結(jié)構(gòu)是什么意思呢?structtemp
{
intdata;
structtemp*pt;
};結(jié)構(gòu)體聲明時(shí)不能包含本結(jié)構(gòu)體類型成員,系統(tǒng)將無法為這樣的結(jié)構(gòu)體類型分配內(nèi)存
可包含指向本結(jié)構(gòu)體類型的指針變量問題的提出第45頁/共59頁12.7.2動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)——單向鏈表structLink{
int data;
structLink*next;};datanextheaddatanextdatanextdataNULL鏈表(LinkedTable):線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)特點(diǎn):用一組任意的存儲(chǔ)單元存儲(chǔ)線性表的數(shù)據(jù);存儲(chǔ)單元可以是連續(xù)的,也可是不連續(xù)的第46頁/共59頁鏈表的定義datanextheaddatanextdatanextdataNULL鏈表(Linkedtable):線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)為表示每個(gè)元素與后繼元素的邏輯關(guān)系,除存儲(chǔ)元素本身信息外,還要存儲(chǔ)其直接后繼信息兩部分信息組成一個(gè)節(jié)點(diǎn)structLink{
int data;
structLink*next;};第47頁/共59頁datanextheaddatanextdatanextdataNULL數(shù)據(jù)域:存儲(chǔ)數(shù)據(jù)元素信息指針域:存儲(chǔ)直接后繼的節(jié)點(diǎn)信息鏈表的定義鏈表(LinkedTable):線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)為表示每個(gè)元素與后繼元素的邏輯關(guān)系,除存儲(chǔ)元素本身信息外,還要存儲(chǔ)其直接后繼信息structLink{
int data;
structLink*next;};n個(gè)節(jié)點(diǎn)鏈接成一個(gè)鏈表(因?yàn)橹话粋€(gè)指針域,故又稱線性鏈表或單向鏈表)第48頁/共59頁鏈表的建立向鏈表中添加一個(gè)新節(jié)點(diǎn)data=Anodedata=Bnodedata=C∧nodehead空指針NULL表示鏈表結(jié)尾鏈表的頭指針:訪問鏈表的關(guān)鍵第49頁/共59頁鏈表的建立若原鏈表為空表(head==NULL),則將新建節(jié)點(diǎn)p置為頭節(jié)點(diǎn)
head(1)head=pdatanextp新建節(jié)點(diǎn)(2)pr=p∧pr(3)pr->next=NULL第50頁/共59頁datanext新建節(jié)點(diǎn)p鏈表的建立若原鏈表為非空,則將新建節(jié)點(diǎn)p添加到表尾
(1)pr->next=p(2)pr=p∧headdata∧prpr(3)pr->next=NULLnext第51頁/共59頁鏈表的刪除操作若原鏈表為空表,則退出程序
若待刪除節(jié)點(diǎn)p是頭節(jié)點(diǎn),則將head指向當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)即可刪除當(dāng)前節(jié)點(diǎn)
datanext(1)head=p->nexthead待刪除節(jié)點(diǎn)datanextp頭節(jié)點(diǎn)(2)free(p)第52頁/共59頁鏈表的刪除操作若待刪除節(jié)點(diǎn)不是頭節(jié)點(diǎn),則將前一節(jié)點(diǎn)的指針域指向當(dāng)前節(jié)點(diǎn)的下一節(jié)點(diǎn)即可刪除當(dāng)前節(jié)點(diǎn)(1)pr->next=p->nextdatanextdatanext待刪除節(jié)點(diǎn)datan
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公寓聘用合同范本
- 個(gè)人簽訂顧問合同范本
- 供貨提成合同范本
- 危險(xiǎn)藥品買賣合同范本
- 專利許可合同-合同范本
- 關(guān)于花卉生產(chǎn)合同范本
- 賣掉首飾抵債合同范本
- 衛(wèi)生院保潔合同范本
- 單位園林養(yǎng)護(hù)合同范例
- 出讓買房合同范本
- 利息理論期末考試模擬測試試題含參考答案
- 干部選拔任用程序
- 部編人教版五年級下冊道德與法治簡答題歸納總結(jié)
- 保障性住房資格申請表
- PEP五年級上冊Unit3-字母組合ow的發(fā)音
- 2023高二開學(xué)第一課《蛻變》-主題班會(huì)
- 口服降糖藥物分類詳解課件
- 籃球特色學(xué)校實(shí)施方案
- 單人心肺復(fù)蘇技術(shù)操作考核評分標(biāo)準(zhǔn)
- 二級生物安全實(shí)驗(yàn)室設(shè)計(jì)建造與運(yùn)行管理指南
- 圍手術(shù)期疼痛護(hù)理課件
評論
0/150
提交評論