版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第9章 用戶自己建立數(shù)據(jù)類型,9.1 定義和使用結(jié)構(gòu)體變量 9.2 使用結(jié)構(gòu)體數(shù)組 9.3 結(jié)構(gòu)體指針 9.4 用指針處理鏈表 9.5 共用體類型 9.6 使用枚舉類型 9.7 用typedef聲明新類型名,9.1 定義和使用結(jié)構(gòu)體變量,9.1.1 自己建立結(jié)構(gòu)體類型 9.1.2 定義結(jié)構(gòu)體類型變量 9.1.3 結(jié)構(gòu)體變量的初始化和引用,9.1.1 自己建立結(jié)構(gòu)體類型,用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體 例如,一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、家庭地址等項,是屬于同一個學(xué)生的,因此組成一個組合數(shù)據(jù),可以定義一個學(xué)生結(jié)構(gòu)體類型。,9.1.1 自己建立結(jié)構(gòu)體類型,
2、struct Student int num; char name20; char sex; int age; float score; char addr30; ;,由程序設(shè)計者指定了一個結(jié)構(gòu)體類型struct Student 它包括num,name,sex,age,score,addr等不同類型的成員,9.1.1 自己建立結(jié)構(gòu)體類型,聲明一個結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名 成員表列 ;,類型名 成員名;,9.1.1 自己建立結(jié)構(gòu)體類型,說明: (1)結(jié)構(gòu)體類型并非只有一種,而是可以設(shè)計出許多種結(jié)構(gòu)體類型,例如 struct Teacher struct Worker st
3、ruct Date等結(jié)構(gòu)體類型 各自包含不同的成員,9.1.1 自己建立結(jié)構(gòu)體類型,(2) 成員可以屬于另一個結(jié)構(gòu)體類型。 struct Date int month; int day; int year; ; struct Stu int num;char name20; char sex;int age; struct Date birthday; char addr30; ;,9.1.2 定義結(jié)構(gòu)體類型變量,前面只是建立了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,并沒有定義變量,其中并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲單元。 為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量,并在其中存
4、放具體的數(shù)據(jù)。,9.1.2 定義結(jié)構(gòu)體類型變量,1. 先聲明結(jié)構(gòu)體類型,再定義該類型變量 聲明結(jié)構(gòu)體類型struct Student,可以用它來定義變量 struct Student student1,student2;,結(jié)構(gòu)體類型名,結(jié)構(gòu)體變量名,struct Student int num; char name20; char sex; int age; float score; char addr30; ;,9.1.2 定義結(jié)構(gòu)體類型變量,2.在聲明類型的同時定義變量 struct Student int num; char name20; char sex; int age; floa
5、t score; char addr30; student1,student2;,9.1.2 定義結(jié)構(gòu)體類型變量,3. 不指定類型名而直接定義結(jié)構(gòu)體類型變量 其一般形式為: struct 成員表列 變量名表列; 指定了一個無名的結(jié)構(gòu)體類型 。,9.1.2 定義結(jié)構(gòu)體類型變量,(1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不要混同。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。在編譯時,對類型是不分配空間的,只對變量分配空間。,9.1.2 定義結(jié)構(gòu)體類型變量,(2) 結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同,但二者不代表同一對象。 (3) 對結(jié)構(gòu)體變量中的成員(即“域”),可以
6、單獨使用,它的作用與地位相當(dāng)于普通變量。 在程序中使用結(jié)構(gòu)體中成員的方法為: 結(jié)構(gòu)體變量名 . 成員名稱,例:要用結(jié)構(gòu)體描述一個人的基本情況,可以定義如下結(jié)構(gòu)體: struct person /* 定義person結(jié)構(gòu)體類型 */ char name30; char sex; struct date birthday; /* 結(jié)構(gòu)體的嵌套定義 */ man; 如果要在變量man中存入一個1960年3月28日出生的zhang先生,可以采用如下賦值語句: strcpy(, “zhang”); /*不能寫成 =zhang; */ man.sex = M; /* 為結(jié)構(gòu)
7、體中的字符成員賦值 */ man.birthday.year = 1960; man.birthday.month = 3; man.birthday.day = 28; /*嵌套定義的結(jié)構(gòu)體中的成員賦值*/,例9.1 把一個學(xué)生的信息(包括學(xué)號、姓名、性別、住址)放在一個結(jié)構(gòu)體變量中,然后輸出這個學(xué)生的信息。 解題思路: 自己建立一個結(jié)構(gòu)體類型,包括有關(guān)學(xué)生信息的各成員 用它定義結(jié)構(gòu)體變量,同時賦以初值 輸出該結(jié)構(gòu)體變量的各成員,9.1.3 結(jié)構(gòu)體變量的初始化和引用,#include int main() struct Student long int num; char name20; c
8、har sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%ldnname:%sn sex:%cnaddress:%sn, a.num,,a.sex,a.addr); return 0; ,#include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%ldnname:%sn sex:%c
9、naddress:%sn, a.num,,a.sex,a.addr); return 0; ,9.2 使用結(jié)構(gòu)體數(shù)組,9.2.1定義結(jié)構(gòu)體數(shù)組 9.2.2 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例,定義結(jié)構(gòu)體數(shù)組一般形式是 struct 結(jié)構(gòu)體名 成員表列 數(shù)組名數(shù)組長度; 先聲明一個結(jié)構(gòu)體類型,然后再用此類型定義結(jié)構(gòu)體數(shù)組: 結(jié)構(gòu)體類型 數(shù)組名數(shù)組長度; 如: struct Person leader3;,9.2.1定義結(jié)構(gòu)體數(shù)組,struct student char num10; /學(xué)號 char name20; /姓名 float maths; /數(shù)學(xué)成績 float C; /程序設(shè)計成績 f
10、loat sum; /總分 stud100; for(i=0;i100;i+) scanf(“%s%s%f%f”,studi.num, , ,例如:struct stu int num; char name10; char sex; float score; student5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58; ,對結(jié)構(gòu)數(shù)組可以作初始化賦值。,9.2.2 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例,例9.4 有n個學(xué)生的信息(包
11、括學(xué)號、姓名、成績),要求按照成績的高低順序輸出各學(xué)生的信息。 解題思路:用結(jié)構(gòu)體數(shù)組存放n個學(xué)生信息,采用選擇法對各元素進行排序(進行比較的是各元素中的成績)。,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ;
12、 int i,j,k;,常變量,若人數(shù)變?yōu)?0,30,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;,#define N 5,注意temp的類型,printf(The order is:n
13、); for(i=0;istuk.score) k=j; temp=stuk; stuk=stui; stui=temp; for(i=0;in;i+) printf(%6d %8s %6.2fn, stui.num,,stui.score); printf(n); return 0; ,寫法上與普通變量一致,9.3 結(jié)構(gòu)體指針,9.3.1 指向結(jié)構(gòu)體變量的指針 9.3.2 指向結(jié)構(gòu)體數(shù)組的指針 9.3.3 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù),9.3.1 指向結(jié)構(gòu)體變量的指針,指向結(jié)構(gòu)體對象的指針變量既可以指向結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。 指針變量的基
14、類型必須與結(jié)構(gòu)體變量的類型相同。例如: struct Student *pt;,結(jié)構(gòu)體指針說明的一般形式 struct 結(jié)構(gòu)體類型名稱 * 結(jié)構(gòu)體指針變量名; 例如: struct date * pdate, today; 說明了兩個變量,一個是指向結(jié)構(gòu)體 date 的結(jié)構(gòu)體指針pdate,today是一個 date 結(jié)構(gòu)體變量。 執(zhí)行語句:pdate = ,這樣,today.year即(*pdate).year today.month 即(*pdate).month today.day 即(*pdate).day,通過指針訪問結(jié)構(gòu)體中的成員 采用運算符“-”進行操作。 即:結(jié)構(gòu)體指針-成員名
15、 “-”運算符優(yōu)先級是最高的(1級),從左至右結(jié)合 通過結(jié)構(gòu)體指針pdate訪問成員year的操作就可以寫成: pdate-year = 1963; 等價于:today.year = 1963; (* pdate).year = 1963;,9.3.2 指向結(jié)構(gòu)體數(shù)組的指針,例9.6 有3個學(xué)生的信息,放在結(jié)構(gòu)體數(shù)組中,要求輸出全部學(xué)生的信息。,解題思路:用指向結(jié)構(gòu)體變量的指針處理 (1)聲明struct Student,并定義結(jié)構(gòu)體數(shù)組、初始化 (2)定義指向struct Student類型指針p (3)使p指向數(shù)組首元素,輸出元素中各信息 (4)使p指向下一個元素,輸出元素中各信息 (5)
16、再使p指向結(jié)構(gòu)體數(shù)組的下一個元素,輸出它指向的元素中的有關(guān)信息,#include struct Student int num; char name20; char sex; int age; ; struct Student stu3= 10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20 ;,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,stu0,stu1
17、,stu2,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,p,stu0,stu1,stu2,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,p,stu0,stu1,stu2,int main() struct Student *p; printf( No. Na
18、me sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,p,stu0,stu1,stu2,9.4 用指針處理鏈表,9.4.1 什么是鏈表 9.4.2 建立簡單的靜態(tài)鏈表 9.4.3 建立動態(tài)鏈表 9.4.4 輸出鏈表,9.4.1 什么是鏈表,鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu) 它是動態(tài)地進行存儲分配的一種結(jié)構(gòu),head,1249,1249,A,1356,1356,1475,B,1475,C,1021,1021,D,0,頭指針,各結(jié)點地址不連續(xù),各結(jié)點含有兩個部分,表尾,9.4.1 什么是鏈表,鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu) 它
19、是動態(tài)地進行存儲分配的一種結(jié)構(gòu) 鏈表必須利用指針變量才能實現(xiàn),struct Student int num; float score; struct Student *next; a,b,c;,a結(jié)點,b結(jié)點,c結(jié)點,a.next=,b.next=,num,score,next,9.4.2 建立簡單的靜態(tài)鏈表,例9.8 建立一個如圖所示的簡單鏈表,它由3個學(xué)生數(shù)據(jù)的結(jié)點組成,要求輸出各結(jié)點中的數(shù)據(jù)。,a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,9.4.2 建立簡單的靜態(tài)鏈表,解題思路:,a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,head,head=,a.next=,b.n
20、ext=,NULL,c.next=NULL;,#include struct Student int num; float score; struct Student *next; ;,int main() struct Student a,b,c,*head,*p; a. num=10101; a.score=89.5; b. num=10103; b.score=90; c. num=10107; c.score=85; head= ,9.4.3 建立動態(tài)鏈表,所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。,動態(tài)
21、鏈表的示意圖,對鏈表的主要操作有以下幾種: 1. 建立鏈表; 2. 結(jié)點的查找與輸出; 3. 插入一個結(jié)點; 4. 刪除一個結(jié)點;,申請內(nèi)存函數(shù) (malloc) void * malloc( unsigned size ) 功能:申請長度為size字節(jié)的內(nèi)存區(qū)。若申請成功,函數(shù)返回所分配的內(nèi)存區(qū)首字節(jié)的地址,即指向該內(nèi)存的指針;若申請失敗,函數(shù)返回NULL。 說明:函數(shù)malloc的返回值為指向void類型的指針。這是通用指針類型,在實際申請內(nèi)存空間時,要按照實際指針?biāo)笇ο蟮念愋瓦M行指針類型強制轉(zhuǎn)換。 實例:要申請1個長度為10的整型數(shù)組空間,用指針指向數(shù)組的首地址,則可使用下列語句動態(tài)申
22、請內(nèi)存空間。 int * p; p = (int *) malloc( 10 * sizeof(int ) );,動態(tài)存儲分配函數(shù)-malloc,釋放內(nèi)存 (free) void free (void * p ) 功能:釋放p所指的內(nèi)存空間。函數(shù)無返回值。這里p所指的內(nèi)存區(qū)域必須是用函數(shù)malloc申請的內(nèi)存空間,否則調(diào)用時使用其它指針,可能會破壞系統(tǒng)。 例:動態(tài)申請10個元素的數(shù)組。 #include void main ( ) int *p=(int *)malloc( 10 * sizeof(int) ); printf(“nResult:”); try ( p, 10); free(p
23、); try(int a ,int m ) /*以數(shù)組方式使用主函數(shù)空間*/ int k; for ( k=0; km; k+ )a k = k*10; for ( k=0; km; k+ )printf (“%d,”, ak); ,動態(tài)存儲分配函數(shù)-free,#define NULL 0 #define LEN sizeof(struct stu) struct stu int num,age; struct stu *next; ; struct stu *creat(int n) struct stu *head,*p1,*p2; int i; for(i=1;inum, ,建立鏈表的函數(shù),算法的思路: 1、讓P1指向新開的結(jié)點; 2、p2指向鏈表中最后一個結(jié)點; 3、把p1所指的結(jié)點連接在p2所指的結(jié)點后面,訪問鏈表中全部數(shù)據(jù)結(jié)點 void print(struct stu * head ) struct stu *p; p = head; /* p指向第一個數(shù)據(jù)
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版投票權(quán)委托協(xié)議范本:企業(yè)重大決策投票權(quán)委托3篇
- 二零二五版高端景觀欄桿定制安裝工程合同3篇
- 2025年國際工程臨時用工勞動合同4篇
- 二零二五版能源互聯(lián)網(wǎng)項目合同履行擔(dān)保書3篇
- 2025年度車輛過戶車輛維修保障服務(wù)協(xié)議4篇
- 二零二五版船舶靠岸作業(yè)噪音控制與環(huán)保措施合同4篇
- 個性化離婚合同范本(私人定制版)版B版
- 2025年度新材料產(chǎn)業(yè)園區(qū)廠房租賃及知識產(chǎn)權(quán)保護合同4篇
- 2025年度個人信用借款合同(跨境交易貨幣兌換附加條款)4篇
- 二零二五年度廚房設(shè)備進出口貿(mào)易合同范本8篇
- 2025年麗水龍泉市招商局招考招商引資工作人員高頻重點提升(共500題)附帶答案詳解
- 職業(yè)衛(wèi)生培訓(xùn)課件
- 柴油墊資合同模板
- 湖北省五市州2023-2024學(xué)年高一下學(xué)期期末聯(lián)考數(shù)學(xué)試題
- 城市作戰(zhàn)案例研究報告
- 【正版授權(quán)】 ISO 12803:1997 EN Representative sampling of plutonium nitrate solutions for determination of plutonium concentration
- 道德經(jīng)全文及注釋
- 2024中考考前地理沖刺卷及答案(含答題卡)
- 多子女贍養(yǎng)老人協(xié)議書范文
- 彩票市場銷售計劃書
- 骨科抗菌藥物應(yīng)用分析報告
評論
0/150
提交評論