版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計教程
(第4版)第9章結(jié)構(gòu)李麗娟2013年2月第9章結(jié)構(gòu)本章主要內(nèi)容1.了解結(jié)構(gòu)數(shù)據(jù)類型的定義及使用。2.了解結(jié)構(gòu)數(shù)據(jù)類型的意義及作用。3.了解結(jié)構(gòu)變量與函數(shù)的關(guān)系。4.掌握鏈表的作用及操作。5.了解聯(lián)合數(shù)據(jù)類型的定義及使用。6.了解枚舉類型的定義及使用。第9章結(jié)構(gòu)結(jié)構(gòu)體數(shù)據(jù)類型:一種自定義的數(shù)據(jù)類型。由不同數(shù)據(jù)類型的數(shù)據(jù)組合而成的數(shù)據(jù)整體。結(jié)構(gòu)體中所包含的數(shù)據(jù)元素稱之為成員。如:“職員”——→一種結(jié)構(gòu)體描述職員的信息有:編號、姓名、年齡、性別、身份證號碼、民族、文化程度、職務(wù)、住址、聯(lián)系電話等。9.1
結(jié)構(gòu)體數(shù)據(jù)類型9.1.1結(jié)構(gòu)體的定義結(jié)構(gòu)類型的定義形式:
struct結(jié)構(gòu)體名 {
成員項表列; };成員項表列同簡單變量的定義形式相同。例如:對“職員”數(shù)據(jù),可以定義如下的結(jié)構(gòu)體類型:structperson{longno;
/*職員號*/charname[12];
/*姓名*/intage;
/*年齡*/charsex;
/*性別*/longindentityNo;
/*身份證號*/chareducation[12];
/*學(xué)歷*/charaddr[40];
/*住址*/longtelno;
/*電話號碼*/};9.1
結(jié)構(gòu)體數(shù)據(jù)類型9.1.2結(jié)構(gòu)體變量的定義定義了結(jié)構(gòu)體之后,就可以定義結(jié)構(gòu)體變量。結(jié)構(gòu)變量的定義形式。(1)類型標(biāo)識符
<變量名列表>;例如:
struct
person
stu,worker;(2)在定義一個結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體類型變量:
struct<結(jié)構(gòu)體名> {
成員項列表; }<變量名列表>;(3)直接定義結(jié)構(gòu)體類型的變量:
struct
{
成員項列表;
}<變量名列表>;9.1
結(jié)構(gòu)體數(shù)據(jù)類型9.1.3結(jié)構(gòu)體變量的初始化
(略)9.1.4結(jié)構(gòu)體變量成員的引用(1)引用結(jié)構(gòu)體變量中的成員。
引用格式:<結(jié)構(gòu)變量名>.<成員名>例如:
stu.no、
stu.age、
[0]等。成員名不能單獨代表變量,不能直接使用結(jié)構(gòu)中的成員名。若結(jié)構(gòu)體類型中含有另一個結(jié)構(gòu)類型,訪問該成員時,應(yīng)采取逐級訪問的方法。(2)將結(jié)構(gòu)體變量作為一個整體來使用。結(jié)構(gòu)體變量可以相互賦值。
(條件是這兩個變量必須具有相同的結(jié)構(gòu)體類型。)9.1
結(jié)構(gòu)體數(shù)據(jù)類型例1:閱讀程序example9_1.c,了解結(jié)構(gòu)體成員的使用方法。9.1.5結(jié)構(gòu)體變量成員的輸入/輸出只允許對結(jié)構(gòu)變量的成員進(jìn)行輸入輸出。不允許將結(jié)構(gòu)體變量作為整體進(jìn)行輸入或輸出操作。9.2結(jié)構(gòu)體數(shù)組9.2.1結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義:(1)先定義結(jié)構(gòu)體,再定義結(jié)構(gòu)體數(shù)組。
struct<結(jié)構(gòu)體名> { <成員項表列> };
struct<結(jié)構(gòu)體名>
<數(shù)組名>[<數(shù)組大小>];(2)在定義結(jié)構(gòu)體的同時,定義結(jié)構(gòu)體數(shù)組。
struct<結(jié)構(gòu)體名> { <成員項表列> }<數(shù)組名>[<數(shù)組大小>];9.2結(jié)構(gòu)體數(shù)組(3)直接定義結(jié)構(gòu)體變量而不定義結(jié)構(gòu)體名。 struct { <成員項表列> }<數(shù)組名>[<數(shù)組大小>];9.2.2結(jié)構(gòu)體數(shù)組成員的初始化和引用
(略)9.3結(jié)構(gòu)體變量與函數(shù)9.3.1函數(shù)的形參與實參為結(jié)構(gòu)體作用:傳值例2:閱讀程序example9_2.c,了解結(jié)構(gòu)變量作為函數(shù)參數(shù)的作用。9.3.2函數(shù)的返回值類型為結(jié)構(gòu)體新的C標(biāo)準(zhǔn)中允許函數(shù)的返回值為結(jié)構(gòu)體類型的值。例3:修改例9-2所示的程序,將“輸入購書信息”模塊的返回值修改成結(jié)構(gòu)類型。9.4聯(lián)合體數(shù)據(jù)類型9.4聯(lián)合體數(shù)據(jù)類型聯(lián)合體又稱為共用體。聯(lián)合體類型與結(jié)構(gòu)體類型的同異:相同之處:定義形式與結(jié)構(gòu)體類型的定義形式相同。
不同之處:①關(guān)鍵字不同,共用體的關(guān)鍵字為union。
②占用的內(nèi)存單元不同。特點:
不同類型的數(shù)組項在內(nèi)存中所占用的起始單元是相同的。提示:
注意聯(lián)合類型變量的使用特點。9.4聯(lián)合體數(shù)據(jù)類型比較結(jié)構(gòu)類型變量和聯(lián)合類型變量占用的內(nèi)存情況:結(jié)構(gòu)類型:structmemb{floatv;intn;charc;}stag;聯(lián)合類型:unionmemb{floatv;intn;charc;}utag;stag占用內(nèi)存單元utag占用內(nèi)存單元9.4聯(lián)合體數(shù)據(jù)類型例4:閱讀程序example9_4.c,分析和了解聯(lián)合體變量成員的取值情況。例5:閱讀程序example9_5.c,了解聯(lián)合體類型變量的賦值情況。9.5枚舉數(shù)據(jù)類型枚舉數(shù)據(jù)類型:用標(biāo)識符表示的整數(shù)常量的集合。枚舉類型定義的一般形式:
enum<枚舉類型名>{標(biāo)識符1,標(biāo)識符2,……,標(biāo)識符n};枚舉常量的起始值為0。例如:
enummonths{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};標(biāo)識符的值被依次自動設(shè)置為整數(shù)0~11??梢愿淖儤?biāo)識符的取值,例如:
enummonths{JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};標(biāo)識符的值被依次自動設(shè)置為整數(shù)1~12。9.5枚舉數(shù)據(jù)類型幾點說明:枚舉類型定義中的標(biāo)識符必須是唯一的??梢栽诿杜e類型定義時為每一個枚舉常量指定不同的值。也可以對中間的某個枚舉常量指定不同的值。例如:
enumclolor{red,blue,green,yellow=5,black,white};由于只指定了yellow的值,則枚舉常量的取值情況為: red=0,blue=1,green=2, yellow=5,black=6,while=7。枚舉常量的值不可更改,但可以作為整型數(shù)使用。9.5枚舉數(shù)據(jù)類型枚舉變量的定義形式:
enum<枚舉類型名>變量名1,變量名2,……變量名n;例如:
enummonthwork_day,rest_day;也可以在定義枚舉類型的同時定義枚舉變量。例如:
enumcolor{red,yellow,green}
light;枚舉常量標(biāo)識符是不能直接輸入/輸出的,要通過其他方式來輸出枚舉常量標(biāo)識符。9.5枚舉數(shù)據(jù)類型例6:閱讀程序example9_6.c,了解枚舉變量的輸出方式。9.6鏈表的概念基本概念:①鏈表指的是將若干個數(shù)據(jù)項按一定的規(guī)則連接起來的表。②鏈表中的數(shù)據(jù)項稱為結(jié)點。③鏈表中每一個結(jié)點的數(shù)據(jù)類型都有一個自引用結(jié)構(gòu)④自引用結(jié)構(gòu)就是結(jié)構(gòu)成員中包含一個指針成員,該指針指向與自身同一個類型的結(jié)構(gòu)。例如:
structnode {intdata;
structnode*nextPtr; };9.6鏈表的概念鏈表是用鏈節(jié)指針連接在一起的結(jié)點的線性集合。其結(jié)構(gòu)如圖所示:自引用結(jié)構(gòu)成員的變量通常是指針型的。結(jié)構(gòu)成員的引用與成員的類型相關(guān)。假如有:
structnode {
intdata;
structnode*nextPtr; };定義結(jié)構(gòu)變量:
structnode*pt;結(jié)構(gòu)成員的引用:
pt->data; pt->nextptr;或:
(*pt).data; (*pt).nextptr;9.6鏈表的概念鏈表可以組成較為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。根據(jù)數(shù)據(jù)之間的相互關(guān)系,鏈表又可分為單鏈表、循環(huán)鏈表、雙向鏈表等。鏈表的可以建立動態(tài)的數(shù)據(jù)結(jié)構(gòu),可以將不連續(xù)的內(nèi)存數(shù)據(jù)連接起來。本章重點:單鏈表。其他鏈表參見“數(shù)據(jù)結(jié)構(gòu)”等教程。9.6鏈表的概念9.6.1動態(tài)分配內(nèi)存動態(tài)分配內(nèi)存空間的系統(tǒng)函數(shù):
malloc()和free()函數(shù)以及sizeof運算符的配合使用
(注:
malloc()和free()函數(shù)在頭文件stdlib.h或alloc.h)。函數(shù)原型及功能如下。1.函數(shù)原型:void*malloc(unsignedsize)功能:從內(nèi)存分配一個大小為size個字節(jié)的內(nèi)存空間。若成功,返回新分配內(nèi)存的首地址;若沒有足夠的內(nèi)存分配,則返回NULL。通常函數(shù)malloc()通常和運算符sizeof一起使用。9.6鏈表的概念例如:
int*p;
p=malloc(20*sizeof(int));/*分配20個整型數(shù)所需的內(nèi)存空間*/系統(tǒng)分配能存放20個整型數(shù)連續(xù)空間,
p指向該存儲空間的首地址。例如: structstudent {intno;
intscore;
structstudent*next; }; structstudent*stu; stu=malloc(sizeof(structstudent));通過sizeof計算structstudent的字節(jié)數(shù),分配sizeof(structstudent)個字節(jié)數(shù)的內(nèi)存空間,
stu指向該存儲空間的首地址。9.6鏈表的概念2.函數(shù)原型:voidfree(void*p)功能:釋放由malloc函數(shù)所分配的內(nèi)存塊,無返回值。例如:free(stu);作用:將stu所指的內(nèi)存空間釋放。幾點注意:①結(jié)構(gòu)類型占用的內(nèi)存空間不一定是連續(xù)的,因此,應(yīng)該用sizeof運算符來確定結(jié)構(gòu)類型占用內(nèi)存空間的大小。②使用malloc()函數(shù)時,應(yīng)對其返回值進(jìn)行檢測是否為NULL,以確保程序的正確。③要及時地使用free()函數(shù)釋放不再需要的內(nèi)存空間,避免系統(tǒng)資源過早地用光。④不要引用已經(jīng)釋放的內(nèi)存空間。9.6鏈表的概念9.6.2單鏈表的建立鏈表:通過自引用結(jié)構(gòu)的指針域,將各節(jié)點相互連接。關(guān)于鏈表的基本概念:(1)鏈表的第一個結(jié)點稱頭指針或頭結(jié)點,它指向鏈表在內(nèi)存中的首地址,(2)其后的結(jié)點是通過結(jié)點中的鏈節(jié)指針成員訪問的。(3)鏈表的最后一個結(jié)點稱為尾節(jié)點。尾節(jié)點的指針域通常被設(shè)置成NULL。(4)鏈表中的每一個結(jié)點是在需要的時候建立的。(5)各結(jié)點在內(nèi)存中的存儲地址不一定是連續(xù)的,由系統(tǒng)自動分配的,即有可能是連續(xù)分配內(nèi)存空間,也有可能是跳躍式的不連續(xù)分配內(nèi)存空間。9.6鏈表的概念建立單鏈表的主要步驟:①定義單鏈表的數(shù)據(jù)結(jié)構(gòu)(定義自引用結(jié)構(gòu))。②建立表頭(建立一個空表)。③利用malloc函數(shù)向系統(tǒng)申請分配一個結(jié)點空間。④將新結(jié)點的指針成員的值賦為空(NULL),若是空表,將新結(jié)點連接到表頭;若非空表,則將新結(jié)點連接到表尾。⑤若有后續(xù)結(jié)點要接入鏈表,則轉(zhuǎn)到③,否則結(jié)束。輸出一個單鏈表的主要步驟:①找出表頭結(jié)束,結(jié)點指針P指向頭結(jié)點。②若P非空,循環(huán)執(zhí)行下列操作。{
輸出結(jié)點值;P指向下一結(jié)點;}9.6鏈表的概念例7:編寫程序,創(chuàng)建一個鏈表,該鏈表可以存放從鍵盤輸入的任意長度的字符串,以按下回車鍵作為輸入的結(jié)束。統(tǒng)計輸入的字符個數(shù)并將其字符串輸出。程序:example9_7.c例8:編寫程序,用鏈表的結(jié)構(gòu)建立一條公交線路的站點信息,從鍵盤依次輸入從起點到終點的各站站名,以單個“#”字符作為輸入結(jié)束,統(tǒng)計站的數(shù)量并輸出這些站點。分析:站點信息結(jié)構(gòu)設(shè)計如下:
structstation { charname[8]; structstation*nextSta; };設(shè)計函數(shù):structstation*creat_sta(structstation*h);
/*將鍵盤輸入的站點名依次插入到鏈表h中*/程序:example9_8.c9.6鏈表的概念9.6.3從單鏈表中刪除結(jié)點在鏈表中刪去一個結(jié)點,不允許破壞原鏈表的結(jié)構(gòu)。例如,對于這樣的自引用結(jié)構(gòu):
structnode {intn;
structnode*next; };假定已建好鏈表:刪除s節(jié)點后的鏈表:9.6鏈表的概念刪除節(jié)點方法:修改指針域的值。根據(jù)被刪節(jié)點的位置,修改指針域的方法要分3種不同情況:①s結(jié)點在表的中間(即不在表頭,也不在表尾):
p->next=s->next;②s結(jié)點位于表頭:
head=s->next;③s結(jié)點位于表尾:
p->next=NULL;結(jié)點刪除后,用free()函數(shù)釋放被刪除結(jié)點所占用的內(nèi)存空間。例如:free(s);
/*釋放了節(jié)點s所占用的空間。*/9.6鏈表的概念例9:修改例9-8的程序,再從鍵盤輸入一個要刪除的站點名,并將刪除后的站點依次輸出。分析:在例9-8程序的基礎(chǔ)上增加一個刪除節(jié)點的函數(shù):
structstation*del_sta(structstation*h,
char*str);函數(shù)功能:
在h所指的鏈表中,刪除結(jié)點值為str所指字符串的結(jié)點。程序:
example9_9.c請分析函數(shù):
structstation*del_sta(structstation*h,char*str);的算法。思考程序中存在的問題,怎樣處理可以使程序更加完善?9.6鏈表的概念9.6.4向鏈表中插入結(jié)點插入節(jié)點方法:修改指針域的值。根據(jù)節(jié)點插入的位置,修改指針域的方法要分3種不同情況:①s結(jié)點插入到表中(即不在表頭,也不在表尾)修改指針:
s->next=t; p->next=s;9.6鏈表的概念②s結(jié)點插入到表頭。圖(a)所示為插入前的鏈表,圖(b)所示為插入后的鏈表。修改指針:
s->next=t; head=s;9.6鏈表的概念②s結(jié)點插入到表尾。圖(a)所示為插入前的鏈表,圖(b)所示為插入后的鏈表。修改指針:
p->next=s; s->next=NULL;9.6鏈表的概念例10:修改例9-8的程序,從鍵盤輸入一個要加入的站點名,并將加入后的站點依次輸出。分析:可以在例9-8程序的基礎(chǔ)上增加一個增加節(jié)點的函數(shù):structstation*add_sta(structstation*h,char*stradd,char*strafter);函數(shù)功能:將stradd所指的站點插入到h鏈表中站點原有的站點strafter的后面。程序:example9_10.c9.7程序范例例11:編寫程序,從鍵盤輸入一個矩形的左下角和右上角的坐標(biāo),輸出該矩形的中心點坐標(biāo)值,再輸入任意一個點的坐標(biāo),判斷該點是否在矩形內(nèi)。分析:用xd、yd代表矩形的左下角坐標(biāo);用xu、yu代表矩形的右上角坐標(biāo);用xm、ym代表矩形的中點坐標(biāo);設(shè)計函數(shù):intptin(structpointp,structrectr),用于判斷輸入的點p是否在矩形r的內(nèi)部。程序:example9_11.c9.7程序范例例12:改進(jìn)例8-25的程序。采用結(jié)構(gòu),設(shè)計一個洗牌和發(fā)牌的程序,用H代表紅桃,D代表方片,C代表梅花,S代表黑桃,用1~13代表每一種花色的面值。分析:可用結(jié)構(gòu)類型來表示撲克牌的花色和面值:
structcard{ char*face;/*撲克牌的面值*/ char*suit;
/*撲克牌的花色*/ };設(shè)計函數(shù):voidshuffle(Card*)完成對撲克牌洗牌。程序:example9_12.c9.7程序范例例13:修改例9-12,用位段結(jié)構(gòu)成員表示一副牌,發(fā)牌時顯示每張牌的顏色。分析:因為牌的面值只有13種,牌的花色只有4種,牌的顏色只有2種,因此,可用一個位段結(jié)構(gòu)來表示一副牌:struc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版股權(quán)轉(zhuǎn)讓合同協(xié)議書
- 2024年城市綜合體蔬菜配送與社區(qū)團(tuán)購服務(wù)合同3篇
- 2024年度建筑工程水電安裝勞務(wù)分包合同9篇
- 2024年公益項目商標(biāo)使用權(quán)捐贈合同3篇
- 2024全新校園配套設(shè)施轉(zhuǎn)讓合同包含體育設(shè)施與綠化工程3篇
- 2024年企業(yè)歷史視頻記錄制作合同范本3篇
- 2024年度圖書館資源共享與文獻(xiàn)互借合同2篇
- 2024年標(biāo)準(zhǔn)化屋頂修復(fù)服務(wù)協(xié)議版B版
- 2024年度全國統(tǒng)一版房屋買賣契稅標(biāo)準(zhǔn)及優(yōu)惠政策應(yīng)用合同3篇
- 2024年度消防員應(yīng)急響應(yīng)及處置服務(wù)合同2篇
- 大英縣“互聯(lián)網(wǎng)+智慧教育”建設(shè)項目 ?招標(biāo)文件(采購)
- GB/T 7533-1993有機化工產(chǎn)品結(jié)晶點的測定方法
- GB/T 6728-2017結(jié)構(gòu)用冷彎空心型鋼
- 紅色喜慶新年快樂企業(yè)年會PPT
- 智慧港口信息化平臺建設(shè)方案
- 水土保持工程學(xué)課程設(shè)計
- 《牛常見病防治技術(shù)》課件
- 腰椎骨折的圍手術(shù)期護(hù)理詳解演示文稿
- 變壓器變比測試課件
- 音樂、社會領(lǐng)域核心經(jīng)驗梳理課件
- 強制執(zhí)行恢復(fù)執(zhí)行申請書范本
評論
0/150
提交評論