第13講結構體_第1頁
第13講結構體_第2頁
第13講結構體_第3頁
第13講結構體_第4頁
第13講結構體_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1 第第1313講講 自定義類型數(shù)據(jù)自定義類型數(shù)據(jù)-結構體、枚舉型結構體、枚舉型參考教材第參考教材第7章章黃永峰黃永峰2014.12.272 目錄13.1 13.1 結構體類型的結構體類型的申明申明及變量定義及變量定義13.2 13.2 結構體變量的初始化結構體變量的初始化13.3 13.3 結構體變量的引用結構體變量的引用13.4 13.4 結構體數(shù)組結構體數(shù)組13.5 13.5 結構體指針變量結構體指針變量13.6 13.6 結構體類型數(shù)據(jù)作函數(shù)參數(shù)結構體類型數(shù)據(jù)作函數(shù)參數(shù)13.7 13.7 * *鏈表鏈表13.8 13.8 枚舉類型數(shù)據(jù)枚舉類型數(shù)據(jù)13.9 13.9 用用typedeft

2、ypedef定義類型定義類型3 13.1結構體類型申明及變量定義n問題引入:如何存放1(或100)個學生的學號、姓名、性別、年齡、成績和地址等信息。而且一個人的信息是密不可分密不可分n結構體類型:結構體類型:是一種用戶自定義(組合)數(shù)據(jù)類型是一種用戶自定義(組合)數(shù)據(jù)類型,由由若干個不同數(shù)據(jù)類型的有序組合若干個不同數(shù)據(jù)類型的有序組合n自定義類型:結構體、共用體、枚舉型等4 13.1結構體類型申明及變量定義pstructstruct student student int intnum; num; char name20;char name20;char sex;char sex; int ag

3、e; int age; floatfloatscore; score; char addr30;char addr30; ; /結構體類型申明結構體類型申明pstructstructstudent student studen1studen1; ; /結構體變量定義結構體變量定義p structstruct是關鍵字,是關鍵字,studentstudent是是結構體類型名結構體類型名( (類型標識符類型標識符) )p結構體中的每一項數(shù)據(jù)為結構體結構體中的每一項數(shù)據(jù)為結構體“成員成員”(member)或)或“分量分量”p studen1是屬于是屬于student類型的類型的結構體變量結構體變量5

4、13.1結構體類型申明及變量定義int a;int a44;structstudent studen1;structstudent stud10;生活中的數(shù)據(jù)類型實例生活中的數(shù)據(jù)類型實例6 13.1結構體類型聲明及變量定義結構類型結構類型與數(shù)組的區(qū)別在于結構體內允許有不同類型的與數(shù)組的區(qū)別在于結構體內允許有不同類型的數(shù)據(jù)數(shù)據(jù)結構體變量結構體變量:用來存放某種結構體類型數(shù)據(jù)的變量:用來存放某種結構體類型數(shù)據(jù)的變量結構體類型聲明結構體類型聲明(自定義類型的變量定義一般方法):(自定義類型的變量定義一般方法):先說明先說明( (聲明)一個聲明)一個自定義數(shù)據(jù)類型標識符自定義數(shù)據(jù)類型標識符,再用該標識

5、,再用該標識符來符來定義變量,定義變量,即先即先聲明聲明,后,后定義定義(1)結構體類型聲明聲明的一般形式:Struct 結構體的類型標識符 成員列表;成員也可以是另一種構體類型變量,即嵌套聲明嵌套聲明7 13.1結構體類型聲明及變量定義ustruct date /日期結構 int month; int day;int year; ; ustruct student/學生結構 intnum; char name20; char sex; int age; struct date birthday; /嵌套聲明 charaddr30;; p嵌套聲明8 13.1結構體類型聲明及變量定義(2)結構體

6、結構體變量變量的的定義定義3種方式種方式方法1:先聲明結構體類型,再定義變量方法2:在聲明類型的同時定義變量方法3:在聲明類型時省略類型名直接定義變量u方式1struct student intnum; /* 學號 */char name20;/* 姓名 */char sex; /* 性別 */int age; /* 年齡 */floatscore; /* 成績 */char addr30;; struct student student1, student2;9 #define STUDENT struct studentSTUDENTintnum; char name20;char sex

7、; int age; floatscore; char addr30;; STUDENT student1, student2;提問:是否可以這樣寫?10 方式2:申明類型的同時定義變量 struct student int num; char name20; char sex; int age; floatscore; char addr30;student1, student2;方式方式3 3:直接定義變量直接定義變量struct struct int intnum; num; char char name20;name20; char char sex;sex; int int age;

8、 age; floatfloatscore; score; char char addr30;addr30;student1, student2student1, student2; 11 13.2 結構體變量的初始化u在定義結構變量的同時也可以對結構體類型變量賦初值在定義結構變量的同時也可以對結構體類型變量賦初值. . struct studentlong int num; char name20;char sex;char addr20;student1= 10010, Li Fun, M, 123 Beijing Road;注意:不能在結構體申明時的說明語句中賦初值,為什么?為什么? s

9、truct studentlong int num = 89031; char name20 = Li Lin; charsex = M; char addr30 = 123 Bejing Road; a; 結構體類型申明時不分配內存空間)12 13.3 結構體變量的引用u一般情況下,不能將一個結構體變量作為一般情況下,不能將一個結構體變量作為整體整體來來引用,只能引用其中的成員(分量)引用,只能引用其中的成員(分量)u引用格式:引用格式:結構體變量名結構體變量名.成員名成員名.是是“成員運算符成員運算符”(分量運算符)(分量運算符)例1、printf(%d,%s,%c,%d,%f,%s, s

10、tudent1.num, , student1.sex,student1.age, student1.score, sutdent1.addr);例2、student2.score = student1.score;例3、scanf(%d, &student1.num);13 13.3 結構體變量的引用u當結構體的某成員是另一結構體類型的變量時(即嵌套說當結構體的某成員是另一結構體類型的變量時(即嵌套說明時),應一級一級地引用成員明時),應一級一級地引用成員例4、student1.num; ; student1.birthday.mo

11、nth; student1.birthday.day; student1.birthday.year;u僅在以下兩種情況下,可以把結構體變量作為一個僅在以下兩種情況下,可以把結構體變量作為一個整體整體來來引用引用(1 1)結構體變量整體賦值,例:)結構體變量整體賦值,例:student2 = student1;student2 = student1;(2 2)取結構體變量地址,例:)取結構體變量地址,例:printf(%x, &student1);printf(%x, &student1); / /輸出輸出student1student1的地址的地址14 13.1結構體類型說明

12、及變量定義類型說明類型嵌套定義變量及初始化變量引用15 13.4 結構體數(shù)組u結構體數(shù)組的定義struct student int num; char name20; char sex;int age;float score;char addr30;lstruct student stu3; /定義3個元素的結構體數(shù)組 16 13.4 結構體數(shù)組u結構體數(shù)組的初始化struct student int num; char name20; char sex; int age;float score;char addr30;stu3 = 10101,Li Lin, M, 18, 87.5, 103

13、 Bejing Road,10102,Zhang Fun,M, 19, 99, 130 Shanghai Roaad,10104, Wang Min, F, 20, 713.5, 1010 Zhongshan Road;17 13.4 結構體數(shù)組p統(tǒng)計候選人得票的程序。設有三個候選人,每次輸入一個得票的候選人的名字,統(tǒng)計候選人得票的程序。設有三個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各候選人得票結果要求最后輸出各候選人得票結果 18 13.5 結構體指針變量u結構體的指針變量 struct studentlong int num; char name20; char sex; f

14、loatscore; struct student stu_1; /結構體變量 struct student *p; /結構體指針變量 p = &stu_1; u通過結構體指針變量引用成員的2種方法 通過指向運算符引用結構體中的成員例:p-nump-namep-sexp-score (*p).num方式 /在此:(*p)= stu_1;19 13.5 結構體指針變量20 13.5 結構體指針變量u指向結構體數(shù)組的指針變量 struct student stu3;struct student *p = stu; /指向stu0p+; /指向stu1p+; /指向stu2up = stu;

15、p-num; /引用stu0.numup+;p-num; /引用stu1.numup+;p-num; /引用stu2.num 21 13.6 結構體類型數(shù)據(jù)作函數(shù)參數(shù)u用結構指針作函數(shù)的參數(shù)用結構指針作函數(shù)的參數(shù)(1 1)結構體的成員結構體的成員作函數(shù)的參數(shù)。與普通變量作函數(shù)的參數(shù)。與普通變量作函數(shù)參數(shù)的用法相同。值傳送,單向傳遞作函數(shù)參數(shù)的用法相同。值傳送,單向傳遞 (2 2)結構體變量結構體變量作函數(shù)的參數(shù)。將結構體的全作函數(shù)的參數(shù)。將結構體的全部成員值傳送給函數(shù),值傳送,單向傳遞部成員值傳送給函數(shù),值傳送,單向傳遞(3 3)結構體指針變量結構體指針變量作函數(shù)的參數(shù)。實參將結作函數(shù)的參數(shù)。

16、實參將結構體的變量地址傳送給形參,兩者指向同一存儲構體的變量地址傳送給形參,兩者指向同一存儲空間,可以實現(xiàn)空間,可以實現(xiàn)雙向傳遞雙向傳遞u例:有一個結構體變量例:有一個結構體變量stu,內含學生學號、姓名和,內含學生學號、姓名和3門門課程的成績。要求在課程的成績。要求在main中賦以值,在函數(shù)中賦以值,在函數(shù)print中打印中打印輸出輸出22 13.6 結構體類型數(shù)據(jù)作函數(shù)參數(shù)23 13.6 結構體類型數(shù)據(jù)作函數(shù)參數(shù)24 u有4個學生,每個學生包括學號、姓名和成績。要求找出成績最高者的姓名和成績25 分析該程序功能26 u跳馬。依下圖將每一步跳馬之后的位置跳馬。依下圖將每一步跳馬之后的位置(x

17、,y)(x,y)放到一個放到一個“結結點點”里,再用里,再用“鏈子穿起來鏈子穿起來”,形成一條鏈,相鄰兩結點,形成一條鏈,相鄰兩結點間用一個指針將兩者連到一起間用一個指針將兩者連到一起 0 1 2 3 4 5 6 7 8 4 3 2 1 結結點點 1 2 3 4 5 6 7 13.7* 鏈表鏈表u為了表示這種既為了表示這種既有數(shù)據(jù)又有指針有數(shù)據(jù)又有指針的情況,引入的情況,引入鏈鏈表表這種數(shù)據(jù)類型這種數(shù)據(jù)類型27 u例如跳馬棋局可如下定義例如跳馬棋局可如下定義struct TMint x; int y; / 結構結構TM的成員,的成員,x,y為整數(shù)型為整數(shù)型struct TM *next / 結

18、構結構TM的成員,屬的成員,屬TM型型u下面的表是馬的跳步方案,從左下角跳到右上角下面的表是馬的跳步方案,從左下角跳到右上角結點結點n1n2n3n4n5n6n7xy0012244364728428 鏈表特征鏈表特征(1)有一個有一個“頭指針頭指針”head,它指向鏈表的第一個元素,它指向鏈表的第一個元素(2)鏈表的一個元素稱為一個鏈表的一個元素稱為一個“結點結點”(node)結點中包含)結點中包含兩部分內容,數(shù)據(jù)域和指針域。其中數(shù)據(jù)域是存放節(jié)點兩部分內容,數(shù)據(jù)域和指針域。其中數(shù)據(jù)域是存放節(jié)點的數(shù)據(jù),指針域指向下一個節(jié)點的地址的數(shù)據(jù),指針域指向下一個節(jié)點的地址(3)最后一個結點稱為最后一個結點稱

19、為“表尾表尾”,表尾結點的指針為空(,表尾結點的指針為空(NULL)提問:結構體數(shù)組和鏈表的區(qū)別?29 13.7* 鏈表鏈表u鏈表需要鏈表需要動態(tài)動態(tài)地進行存儲分配,語言內存管理函數(shù)地進行存儲分配,語言內存管理函數(shù) (1)void (1)void * * malloc(size_t size) malloc(size_t size)在動態(tài)存儲區(qū)分配長度為在動態(tài)存儲區(qū)分配長度為sizesize的連續(xù)空間,并返回指向該空的連續(xù)空間,并返回指向該空間起始地址的指針。若分配失?。ㄏ到y(tǒng)不能提供所需內存)間起始地址的指針。若分配失?。ㄏ到y(tǒng)不能提供所需內存),則返回,則返回NULLNULL (2)void

20、free(void (2)void free(void * * ptr) ptr)釋放釋放ptrptr指向的內存空間。指向的內存空間。ptrptr是是malloc()malloc()或或calloc()calloc()函數(shù)返函數(shù)返回的值回的值u注意注意 ( () )函數(shù)原型在函數(shù)原型在alloc.halloc.h和和stdlib.hstdlib.h中定義。中定義。size_tsize_t是專用于是專用于描述內存大小和計數(shù)值的數(shù)據(jù)類型,描述內存大小和計數(shù)值的數(shù)據(jù)類型, 等于等于unsigned intunsigned int (2)C+(2)C+使用使用NEW NEW 和和delete dele

21、te 運算法來分配和釋放內存,運算法來分配和釋放內存,P217P21730 13.7* 鏈表鏈表u建立鏈表建立鏈表 例例:寫一個函數(shù)寫一個函數(shù)creat(),建立一個有,建立一個有5個學生的單向鏈表個學生的單向鏈表。分析建立過程。分析建立過程設:鏈表結構為:設:鏈表結構為:struct student longnum;float score;struct student *next;當輸入的當輸入的num等于零時,表示建立過程結束。等于零時,表示建立過程結束。定義以下變量:定義以下變量:struct student *head; /表頭表頭struct student *p1; /新建結點新建

22、結點struct student *p2; /表尾結點表尾結點31 13.7* 鏈表鏈表32 13.7* 鏈表鏈表33 13.7* 鏈表鏈表34 13.7* 鏈表鏈表35 13.7* 鏈表鏈表36 #include stdio.h#include alloc.h#include stdlib.hstruct student longnum;float score;struct student *next;#define LEN sizeof(struct student)/* 注意,#define NULL 0不需要,NULL已在stdio.h中定義 */int n;struct studen

23、t * creat() /* 創(chuàng)建鏈表,并返回表頭指針 */ struct student *head; /* 表頭 */struct student *p1; /* 新建結點 */struct student *p2; /* 表尾結點 */ n = 0; /* 結點數(shù)為0 */head = NULL; /* 還沒有任何結點,表頭為指向空 */p1 = (struct student *)malloc(LEN); /* 創(chuàng)建一個新結點p1 */p2 = p1; /* 表尾p2也指向p1 */ 37 scanf(%ld,%f, &p1-num, &p1-score); /* 讀入

24、第一個結點的學生數(shù)據(jù) */while(p1-num != 0) /* 假設num=0表示輸入結束 */n = n + 1;if (n = 1) head = p1; /* 第一個新建結點是表頭 */else p2-next = p1; /* 原表尾下一個結點是新建結點 */p2 = p1; /* 新建結點成為表尾 */p1 = (struct student *)malloc(LEN); /* 新建一個結點 */scanf(%ld,%f, &p1-num, &p1-score); /* 讀入新建結點的學生數(shù)據(jù) */ free(p1); /* 對于num=0的結點,未加入鏈表,應

25、刪除其空間 */p2-next = NULL; /* 輸入結束,表尾結點下一結點為空 */return (head);/* 返回表頭指針 */ 38 13.8 枚舉類型u如果一個變量只有幾種可能的值,可以定義為枚舉類型如果一個變量只有幾種可能的值,可以定義為枚舉類型. .“枚舉枚舉”是將變量可能的值一一列舉出來。變量的值只能取列是將變量可能的值一一列舉出來。變量的值只能取列舉出來的值之一舉出來的值之一u枚舉類型說明和變量定義格式枚舉類型說明和變量定義格式 類型說明類型說明: enum weekday sun, mon, tue, wed, thu, fri, sat; weekday是枚舉類型

26、標識符,可以用于定義變量是枚舉類型標識符,可以用于定義變量 變量定義變量定義:enum weekday workday, week_end; 定義了兩個枚舉變量:定義了兩個枚舉變量:workday,week_end, 它們只能取它們只能取sun到到sat之一,如:之一,如:weekday = mon,week_end = sun;usun、mon、.、sat稱為稱為“枚舉元素枚舉元素”或或“枚舉常量枚舉常量”39 13.8 枚舉類型說明:l枚舉元素是常量。在+中,按定義順序取值0、1、2、。例:weekday = mon; printf(%d, weekday); 輸出整數(shù)1l枚舉元素不是變量

27、,不能賦值。如:sun = 0;(錯)。但在定義枚舉類型時,可以指定枚舉常量的值,如: enum weekday sun=7, mon=1, tue, wed, thu, fri, sat; 此時,tue、wed、.值從mon的值順序加1。如,tue=2l枚舉值可以作判斷,例、if (weekday = mon) 整型與枚舉類型變量是不同的數(shù)據(jù)類型,不能直接賦值,如、workday = 2; (錯誤)。但通過強制類型轉換賦值,如:workday = (enum weekday)2;或workday = enum weekday(2)40 u例:袋里有紅、黃、藍、白、黑五種顏色的球若干。每次從口

28、袋中取出三個球,打印三種不同顏色球可能取法41 13.9 用typedef定義類型別名u定義類型標識符:關鍵字定義類型標識符:關鍵字typedef可以用來定義一種新的可以用來定義一種新的數(shù)據(jù)類型標識符。它代表已有數(shù)據(jù)類型,是已有數(shù)據(jù)類數(shù)據(jù)類型標識符。它代表已有數(shù)據(jù)類型,是已有數(shù)據(jù)類型的別名。型的別名。u例:例:typedef int INTEGER;typedef float REAL; 定義新數(shù)據(jù)類型定義新數(shù)據(jù)類型INTEGER,它代表已有數(shù)據(jù)類型,它代表已有數(shù)據(jù)類型int;REAL代表已有數(shù)據(jù)類型代表已有數(shù)據(jù)類型floatu通過上述定義后,以下兩行等價:通過上述定義后,以下兩行等價: IN

29、TEGER i, j; /等價于等價于int i, j ; REAL a, b; /等價于等價于 float a, b; 42 (1)定義新數(shù)據(jù)類型,專用于某種類型變量,使程序更清晰 例1、typedef unsigned int size_t 定義size_t數(shù)據(jù)類型,專用于內存字節(jié)計數(shù)。size_t size; 例2、void void * * malloc(size_t size) malloc(size_t size)(2)簡化數(shù)據(jù)類型的書寫。 例、typedef struct int month;int day;int year; DATE ;DATE birthday;DATE *p

溫馨提示

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

評論

0/150

提交評論