




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計教程
(第4版)第9章結構李麗娟2013年2月第9章結構本章主要內容1.了解結構數據類型的定義及使用。2.了解結構數據類型的意義及作用。3.了解結構變量與函數的關系。4.掌握鏈表的作用及操作。5.了解聯合數據類型的定義及使用。6.了解枚舉類型的定義及使用。第9章結構結構體數據類型:一種自定義的數據類型。由不同數據類型的數據組合而成的數據整體。結構體中所包含的數據元素稱之為成員。如:“職員”——→一種結構體描述職員的信息有:編號、姓名、年齡、性別、身份證號碼、民族、文化程度、職務、住址、聯系電話等。9.1
結構體數據類型9.1.1結構體的定義結構類型的定義形式:
struct結構體名 {
成員項表列; };成員項表列同簡單變量的定義形式相同。例如:對“職員”數據,可以定義如下的結構體類型:structperson{longno;
/*職員號*/charname[12];
/*姓名*/intage;
/*年齡*/charsex;
/*性別*/longindentityNo;
/*身份證號*/chareducation[12];
/*學歷*/charaddr[40];
/*住址*/longtelno;
/*電話號碼*/};9.1
結構體數據類型9.1.2結構體變量的定義定義了結構體之后,就可以定義結構體變量。結構變量的定義形式。(1)類型標識符
<變量名列表>;例如:
struct
person
stu,worker;(2)在定義一個結構體類型的同時定義結構體類型變量:
struct<結構體名> {
成員項列表; }<變量名列表>;(3)直接定義結構體類型的變量:
struct
{
成員項列表;
}<變量名列表>;9.1
結構體數據類型9.1.3結構體變量的初始化
(略)9.1.4結構體變量成員的引用(1)引用結構體變量中的成員。
引用格式:<結構變量名>.<成員名>例如:
stu.no、
stu.age、
[0]等。成員名不能單獨代表變量,不能直接使用結構中的成員名。若結構體類型中含有另一個結構類型,訪問該成員時,應采取逐級訪問的方法。(2)將結構體變量作為一個整體來使用。結構體變量可以相互賦值。
(條件是這兩個變量必須具有相同的結構體類型。)9.1
結構體數據類型例1:閱讀程序example9_1.c,了解結構體成員的使用方法。9.1.5結構體變量成員的輸入/輸出只允許對結構變量的成員進行輸入輸出。不允許將結構體變量作為整體進行輸入或輸出操作。9.2結構體數組9.2.1結構體數組的定義結構體數組的定義:(1)先定義結構體,再定義結構體數組。
struct<結構體名> { <成員項表列> };
struct<結構體名>
<數組名>[<數組大小>];(2)在定義結構體的同時,定義結構體數組。
struct<結構體名> { <成員項表列> }<數組名>[<數組大小>];9.2結構體數組(3)直接定義結構體變量而不定義結構體名。 struct { <成員項表列> }<數組名>[<數組大小>];9.2.2結構體數組成員的初始化和引用
(略)9.3結構體變量與函數9.3.1函數的形參與實參為結構體作用:傳值例2:閱讀程序example9_2.c,了解結構變量作為函數參數的作用。9.3.2函數的返回值類型為結構體新的C標準中允許函數的返回值為結構體類型的值。例3:修改例9-2所示的程序,將“輸入購書信息”模塊的返回值修改成結構類型。9.4聯合體數據類型9.4聯合體數據類型聯合體又稱為共用體。聯合體類型與結構體類型的同異:相同之處:定義形式與結構體類型的定義形式相同。
不同之處:①關鍵字不同,共用體的關鍵字為union。
②占用的內存單元不同。特點:
不同類型的數組項在內存中所占用的起始單元是相同的。提示:
注意聯合類型變量的使用特點。9.4聯合體數據類型比較結構類型變量和聯合類型變量占用的內存情況:結構類型:structmemb{floatv;intn;charc;}stag;聯合類型:unionmemb{floatv;intn;charc;}utag;stag占用內存單元utag占用內存單元9.4聯合體數據類型例4:閱讀程序example9_4.c,分析和了解聯合體變量成員的取值情況。例5:閱讀程序example9_5.c,了解聯合體類型變量的賦值情況。9.5枚舉數據類型枚舉數據類型:用標識符表示的整數常量的集合。枚舉類型定義的一般形式:
enum<枚舉類型名>{標識符1,標識符2,……,標識符n};枚舉常量的起始值為0。例如:
enummonths{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};標識符的值被依次自動設置為整數0~11??梢愿淖儤俗R符的取值,例如:
enummonths{JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};標識符的值被依次自動設置為整數1~12。9.5枚舉數據類型幾點說明:枚舉類型定義中的標識符必須是唯一的??梢栽诿杜e類型定義時為每一個枚舉常量指定不同的值。也可以對中間的某個枚舉常量指定不同的值。例如:
enumclolor{red,blue,green,yellow=5,black,white};由于只指定了yellow的值,則枚舉常量的取值情況為: red=0,blue=1,green=2, yellow=5,black=6,while=7。枚舉常量的值不可更改,但可以作為整型數使用。9.5枚舉數據類型枚舉變量的定義形式:
enum<枚舉類型名>變量名1,變量名2,……變量名n;例如:
enummonthwork_day,rest_day;也可以在定義枚舉類型的同時定義枚舉變量。例如:
enumcolor{red,yellow,green}
light;枚舉常量標識符是不能直接輸入/輸出的,要通過其他方式來輸出枚舉常量標識符。9.5枚舉數據類型例6:閱讀程序example9_6.c,了解枚舉變量的輸出方式。9.6鏈表的概念基本概念:①鏈表指的是將若干個數據項按一定的規則連接起來的表。②鏈表中的數據項稱為結點。③鏈表中每一個結點的數據類型都有一個自引用結構④自引用結構就是結構成員中包含一個指針成員,該指針指向與自身同一個類型的結構。例如:
structnode {intdata;
structnode*nextPtr; };9.6鏈表的概念鏈表是用鏈節指針連接在一起的結點的線性集合。其結構如圖所示:自引用結構成員的變量通常是指針型的。結構成員的引用與成員的類型相關。假如有:
structnode {
intdata;
structnode*nextPtr; };定義結構變量:
structnode*pt;結構成員的引用:
pt->data; pt->nextptr;或:
(*pt).data; (*pt).nextptr;9.6鏈表的概念鏈表可以組成較為復雜的數據結構。根據數據之間的相互關系,鏈表又可分為單鏈表、循環鏈表、雙向鏈表等。鏈表的可以建立動態的數據結構,可以將不連續的內存數據連接起來。本章重點:單鏈表。其他鏈表參見“數據結構”等教程。9.6鏈表的概念9.6.1動態分配內存動態分配內存空間的系統函數:
malloc()和free()函數以及sizeof運算符的配合使用
(注:
malloc()和free()函數在頭文件stdlib.h或alloc.h)。函數原型及功能如下。1.函數原型:void*malloc(unsignedsize)功能:從內存分配一個大小為size個字節的內存空間。若成功,返回新分配內存的首地址;若沒有足夠的內存分配,則返回NULL。通常函數malloc()通常和運算符sizeof一起使用。9.6鏈表的概念例如:
int*p;
p=malloc(20*sizeof(int));/*分配20個整型數所需的內存空間*/系統分配能存放20個整型數連續空間,
p指向該存儲空間的首地址。例如: structstudent {intno;
intscore;
structstudent*next; }; structstudent*stu; stu=malloc(sizeof(structstudent));通過sizeof計算structstudent的字節數,分配sizeof(structstudent)個字節數的內存空間,
stu指向該存儲空間的首地址。9.6鏈表的概念2.函數原型:voidfree(void*p)功能:釋放由malloc函數所分配的內存塊,無返回值。例如:free(stu);作用:將stu所指的內存空間釋放。幾點注意:①結構類型占用的內存空間不一定是連續的,因此,應該用sizeof運算符來確定結構類型占用內存空間的大小。②使用malloc()函數時,應對其返回值進行檢測是否為NULL,以確保程序的正確。③要及時地使用free()函數釋放不再需要的內存空間,避免系統資源過早地用光。④不要引用已經釋放的內存空間。9.6鏈表的概念9.6.2單鏈表的建立鏈表:通過自引用結構的指針域,將各節點相互連接。關于鏈表的基本概念:(1)鏈表的第一個結點稱頭指針或頭結點,它指向鏈表在內存中的首地址,(2)其后的結點是通過結點中的鏈節指針成員訪問的。(3)鏈表的最后一個結點稱為尾節點。尾節點的指針域通常被設置成NULL。(4)鏈表中的每一個結點是在需要的時候建立的。(5)各結點在內存中的存儲地址不一定是連續的,由系統自動分配的,即有可能是連續分配內存空間,也有可能是跳躍式的不連續分配內存空間。9.6鏈表的概念建立單鏈表的主要步驟:①定義單鏈表的數據結構(定義自引用結構)。②建立表頭(建立一個空表)。③利用malloc函數向系統申請分配一個結點空間。④將新結點的指針成員的值賦為空(NULL),若是空表,將新結點連接到表頭;若非空表,則將新結點連接到表尾。⑤若有后續結點要接入鏈表,則轉到③,否則結束。輸出一個單鏈表的主要步驟:①找出表頭結束,結點指針P指向頭結點。②若P非空,循環執行下列操作。{
輸出結點值;P指向下一結點;}9.6鏈表的概念例7:編寫程序,創建一個鏈表,該鏈表可以存放從鍵盤輸入的任意長度的字符串,以按下回車鍵作為輸入的結束。統計輸入的字符個數并將其字符串輸出。程序:example9_7.c例8:編寫程序,用鏈表的結構建立一條公交線路的站點信息,從鍵盤依次輸入從起點到終點的各站站名,以單個“#”字符作為輸入結束,統計站的數量并輸出這些站點。分析:站點信息結構設計如下:
structstation { charname[8]; structstation*nextSta; };設計函數:structstation*creat_sta(structstation*h);
/*將鍵盤輸入的站點名依次插入到鏈表h中*/程序:example9_8.c9.6鏈表的概念9.6.3從單鏈表中刪除結點在鏈表中刪去一個結點,不允許破壞原鏈表的結構。例如,對于這樣的自引用結構:
structnode {intn;
structnode*next; };假定已建好鏈表:刪除s節點后的鏈表:9.6鏈表的概念刪除節點方法:修改指針域的值。根據被刪節點的位置,修改指針域的方法要分3種不同情況:①s結點在表的中間(即不在表頭,也不在表尾):
p->next=s->next;②s結點位于表頭:
head=s->next;③s結點位于表尾:
p->next=NULL;結點刪除后,用free()函數釋放被刪除結點所占用的內存空間。例如:free(s);
/*釋放了節點s所占用的空間。*/9.6鏈表的概念例9:修改例9-8的程序,再從鍵盤輸入一個要刪除的站點名,并將刪除后的站點依次輸出。分析:在例9-8程序的基礎上增加一個刪除節點的函數:
structstation*del_sta(structstation*h,
char*str);函數功能:
在h所指的鏈表中,刪除結點值為str所指字符串的結點。程序:
example9_9.c請分析函數:
structstation*del_sta(structstation*h,char*str);的算法。思考程序中存在的問題,怎樣處理可以使程序更加完善?9.6鏈表的概念9.6.4向鏈表中插入結點插入節點方法:修改指針域的值。根據節點插入的位置,修改指針域的方法要分3種不同情況:①s結點插入到表中(即不在表頭,也不在表尾)修改指針:
s->next=t; p->next=s;9.6鏈表的概念②s結點插入到表頭。圖(a)所示為插入前的鏈表,圖(b)所示為插入后的鏈表。修改指針:
s->next=t; head=s;9.6鏈表的概念②s結點插入到表尾。圖(a)所示為插入前的鏈表,圖(b)所示為插入后的鏈表。修改指針:
p->next=s; s->next=NULL;9.6鏈表的概念例10:修改例9-8的程序,從鍵盤輸入一個要加入的站點名,并將加入后的站點依次輸出。分析:可以在例9-8程序的基礎上增加一個增加節點的函數:structstation*add_sta(structstation*h,char*stradd,char*strafter);函數功能:將stradd所指的站點插入到h鏈表中站點原有的站點strafter的后面。程序:example9_10.c9.7程序范例例11:編寫程序,從鍵盤輸入一個矩形的左下角和右上角的坐標,輸出該矩形的中心點坐標值,再輸入任意一個點的坐標,判斷該點是否在矩形內。分析:用xd、yd代表矩形的左下角坐標;用xu、yu代表矩形的右上角坐標;用xm、ym代表矩形的中點坐標;設計函數:intptin(structpointp,structrectr),用于判斷輸入的點p是否在矩形r的內部。程序:example9_11.c9.7程序范例例12:改進例8-25的程序。采用結構,設計一個洗牌和發牌的程序,用H代表紅桃,D代表方片,C代表梅花,S代表黑桃,用1~13代表每一種花色的面值。分析:可用結構類型來表示撲克牌的花色和面值:
structcard{ char*face;/*撲克牌的面值*/ char*suit;
/*撲克牌的花色*/ };設計函數:voidshuffle(Card*)完成對撲克牌洗牌。程序:example9_12.c9.7程序范例例13:修改例9-12,用位段結構成員表示一副牌,發牌時顯示每張牌的顏色。分析:因為牌的面值只有13種,牌的花色只有4種,牌的顏色只有2種,因此,可用一個位段結構來表示一副牌:struc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- lng合同標準文本
- 2025年全面積壓勞動合同范本
- 農村祠堂修建合同樣本
- 構建靈活的公司財務規劃體系的方案計劃
- 農藥產品供貨合同樣本
- 企業員工內部生產合同樣本
- 減肥合同范例寫
- 代理投資咨詢合同樣本
- 第12講 人體內物質的運輸 2025年會考生物學專題練習(含答案)
- 親子鑒定合同樣本
- 開寵物店創新創業計劃
- 2022-2027年中國公共廁所行業市場調研及未來發展趨勢預測報告
- 2025年浙江省建筑安全員-A證考試題庫及答案
- 2024年電子商務物流挑戰試題及答案
- 2025年高考英語二輪復習專題05 閱讀七選五(練習)(解析版)
- 育嬰師綜合素質試題及答案展示
- ESG領域的倫理與合規性問題試題及答案
- 2025年湖北省部分高中高三語文3月一模聯考試卷附答案解析
- 門式架搭設方案
- 2025年南通師范高等??茖W校高職單招(數學)歷年真題考點含答案解析
- 第10課 金與南宋對峙 教案2024-2025學年七年級歷史下冊新課標
評論
0/150
提交評論