版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第九章 結(jié)構(gòu)體與鏈表,北京郵電大學(xué)出版社,內(nèi)容提要,結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體類型變量 結(jié)構(gòu)體類型數(shù)組 結(jié)構(gòu)體類型指針 結(jié)構(gòu)體與函數(shù) 鏈表,結(jié)構(gòu)體概述(1),結(jié)構(gòu)體 結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型 用途:把不同類型的數(shù)據(jù)組合成一個(gè)整體-自定義數(shù)據(jù)類型 結(jié)構(gòu)體類型定義,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名1; 類型標(biāo)識(shí)符 成員名2; . ;,成員類型可以是 基本型或構(gòu)造型,struct是關(guān)鍵字, 不能省略,合法標(biāo)識(shí)符 可省:無名結(jié)構(gòu)體,結(jié)構(gòu)體概述(2),定義結(jié)構(gòu)體類型,描述下列數(shù)據(jù) (1) 學(xué)生情況: 包含學(xué)生的學(xué)號(hào)、 姓名、 性別、 年齡、C語言課程成績(jī):,struct student int
2、no; /*學(xué)號(hào)*/ char name10; /*姓名*/ char sex; /*性別*/ int age; /*年齡*/ float score; /*C成績(jī)*/ ;注:;不能省,結(jié)構(gòu)體類型定義描述結(jié)構(gòu) 的組織形式,不分配內(nèi)存,如考慮10門課程成績(jī), 加上總成績(jī)與平均成績(jī),可作如下定義:,struct student int no; /*學(xué)號(hào)*/ char name10; /*姓名*/ char sex; /*性別*/ int age; /*年齡*/ float score10; /*10門課程成績(jī)*/ float tcj, acj; /*總成績(jī), 平均成績(jī)*/ ;,定義結(jié)構(gòu)體類型,描述
3、下列數(shù)據(jù) (2)個(gè)人數(shù)據(jù): 包含姓名、性別、年齡、身高、體重、住址:,struct person char name20; /*姓名*/ char sex; /*性別*/ int age; /*年齡*/ float height; /*身高*/ float weight; /*體重*/ char addr50; /*住址*/ ;,(3)日期結(jié)構(gòu)體類型包括年、月、日: struct date int year; /*年*/ month; /*月*/ day; /*日*/ ;,(4)如職工信息結(jié)構(gòu)體類型: struct person char name20; /*姓名*/ char address
4、40; /*地址*/ float salary; /*工資*/ float cost; /*扣款*/ struct date hiredate; /*聘任日期*/ ;,結(jié)構(gòu)體類型可以嵌套定義即一個(gè)結(jié)構(gòu)體類型中的某些成員又是其他結(jié)構(gòu)體類型,結(jié)構(gòu)體類型變量的定義(1),先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量 一般形式:,例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員
5、名; . ; struct 結(jié)構(gòu)體名 變量名表列;,例 #define STUDENT struct student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2;,結(jié)構(gòu)體類型變量的定義(2),定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量 一般形式:,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 變量名表列;,例 struct student int num; char name20; char sex; int age; float
6、score; char addr30; stu1,stu2;,結(jié)構(gòu)體類型變量的定義(3),直接定義結(jié)構(gòu)體變量 一般形式:,struct 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 變量名表列;,例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,用無名結(jié)構(gòu)體直接定義 變量只能一次,結(jié)構(gòu)體類型聲明的說明,說明 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同 類型:不分配內(nèi)存; 變量:分配內(nèi)存 類型:不能賦值、存取、運(yùn)算; 變量:可以 結(jié)構(gòu)體可嵌套 結(jié)構(gòu)體成員名與程序中變量名可相同,不會(huì)混
7、淆 結(jié)構(gòu)體類型及變量的作用域與生存期,結(jié)構(gòu)體變量的使用(1),由結(jié)構(gòu)體變量名引用其成員 結(jié)構(gòu)體變量不能整體引用,只能引用變量成員,可以將一個(gè)結(jié)構(gòu)體變量賦值給另一個(gè)結(jié)構(gòu)體變量 結(jié)構(gòu)體嵌套時(shí)逐級(jí)引用,引用方式: 結(jié)構(gòu)體變量名.成員名,成員(分量)運(yùn)算符 優(yōu)先級(jí): 1 結(jié)合性:從左向右,結(jié)構(gòu)體變量的初始化(1),形式一:,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . ; struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量=初始數(shù)據(jù);,例 struct student int num; char name20; char sex; int age; char addr30; ; struct
8、 student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,結(jié)構(gòu)體變量的初始化(2),形式二:,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 結(jié)構(gòu)體變量=初始數(shù)據(jù);,例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,結(jié)構(gòu)體變量的初始化(3),形式三:,struct 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 結(jié)構(gòu)體變量=初始數(shù)據(jù);,例
9、 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,結(jié)構(gòu)體變量存儲(chǔ)分配示意圖,例 9.1 求某同學(xué)上學(xué)期8門課程的總成績(jī)與平均成績(jī)。,程序如下: main( ) int i; struct st char xm8; float cj9; float tcj, acj; stu;,scanf(%s, stu.xm); /*輸入*/ for(i=1; i=8;i+) scan(%f, i+) stu.tcj+=stu.cji; stu.
10、acj=stu.tcji/8; /*求平均成績(jī)*/ printf(%s總成績(jī)=%6.2f, 平均成績(jī)=%6.2f,stu.tcj,stu.acj); ,輸入數(shù)據(jù): CHEN 80 86 79 98 88 72 96 66 運(yùn)行結(jié)果: CHEN的總成績(jī)=577.00, 平均成績(jī)= 72.13,結(jié)構(gòu)體類型數(shù)組,結(jié)構(gòu)體數(shù)組的定義 三種形式:,形式一: struct student int num; char name20; char sex; int age; ; struct student stu2;,形式二: struct student int num; char name20; char
11、sex; int age; stu2;,形式三: struct int num; char name20; char sex; int age; stu2;,結(jié)構(gòu)體數(shù)組初始化與引用,結(jié)構(gòu)體數(shù)組初始化,例 struct int num; char name20; char sex; int age; stu =,;,順序初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,
12、19;,例 struct student int num; char name20; char sex; int age; stu =,;,結(jié)構(gòu)體數(shù)組引用,引用方式: 結(jié)構(gòu)體數(shù)組名下標(biāo).成員名,例 統(tǒng)計(jì)候選人選票,struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,leaderj
13、.name)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); ,指向結(jié)構(gòu)體變量的指針,指向結(jié)構(gòu)體變量的指針 定義形式:struct 結(jié)構(gòu)體名 *結(jié)構(gòu)體指針名; 例 struct student *p;,使用結(jié)構(gòu)體指針變量引用成員形式,存放結(jié)構(gòu)體變量在內(nèi)存的起始地址,指向運(yùn)算符 優(yōu)先級(jí): 1 結(jié)合方向:從左向右,例 指向結(jié)構(gòu)體的指針變量,main() struct student long int num; char name20; char sex; float score; stu_1
14、,*p; p= ,例 int n; int *p= n=10,struct student stu1; struct student *p= (*p).num=101,總結(jié):結(jié)構(gòu)體成員變量引用方式,結(jié)構(gòu)體變量.成員名 (*p).成員名 p-成員名 其中,-稱為指向運(yùn)算符 請(qǐng)分析下列幾種運(yùn)算: p-n p-n+ +p-n,指向結(jié)構(gòu)體數(shù)組元素的指針,例 指向結(jié)構(gòu)體數(shù)組的指針,struct student int num; char name20; char sex; int age; stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang
15、Min,F,20; main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age); ,結(jié)構(gòu)體變量作為函數(shù)參數(shù),用結(jié)構(gòu)體變量的成員作參數(shù)-值傳遞 用指向結(jié)構(gòu)體變量或數(shù)組的指針作參數(shù)-地址傳遞 用結(jié)構(gòu)體變量作參數(shù)-多值傳遞,效率低,struct data int a, b, c; ; main() void func(struct data); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,ar
16、g.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,par
17、m.b,parm.c); printf(Return.n); ,例 用結(jié)構(gòu)體變量作函數(shù)參數(shù),struct data int a, b, c; ; main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func( ,例 用結(jié)構(gòu)體指針變量作函數(shù)參數(shù),結(jié)構(gòu)體變量作為函數(shù)參數(shù),總結(jié) 注意:ANSI C允許用整個(gè)結(jié)構(gòu)體作為
18、函數(shù)的參數(shù)傳遞,但是必須保證實(shí)參與形參的類型相同 把一個(gè)完整的結(jié)構(gòu)體變量作為參數(shù)傳遞,雖然合法,但要將全部成員值一個(gè)一個(gè)傳遞,既費(fèi)時(shí)間又費(fèi)空間,開銷大,因此一般不采用 在函數(shù)中要結(jié)構(gòu)體中成員變量的值,需要傳結(jié)構(gòu)體指針變量或結(jié)構(gòu)體地址,函數(shù)的返回值為結(jié)構(gòu)體類型,struct student input() /*輸入一個(gè)學(xué)生的數(shù)據(jù)*/ int i; struct student stud; scanf(%ld,/*返回結(jié)構(gòu)體數(shù)據(jù)*/ ,函數(shù)的返回值可以是結(jié)構(gòu)體類型。例如,定義了結(jié)構(gòu)體數(shù)組: struct student stud100; 數(shù)據(jù)輸入可由如下形式的語句實(shí)現(xiàn): for(i=0;i100;
19、 i+) studi=input(); 函數(shù)input()的功能是輸入一個(gè)結(jié)構(gòu)體數(shù)據(jù),并將輸入結(jié)構(gòu)體數(shù)據(jù)作為返回值,返回給第i個(gè)學(xué)生記錄,實(shí)現(xiàn)第i個(gè)學(xué)生的數(shù)據(jù)輸入,鏈表概述(1),所謂鏈表是指若干個(gè)數(shù)據(jù)項(xiàng)(每個(gè)數(shù)據(jù)項(xiàng)稱為一個(gè)“結(jié)點(diǎn)”)按一定的原則連接起來。每個(gè)數(shù)據(jù)項(xiàng)都包含有若干個(gè)數(shù)據(jù)和一個(gè)指向下一個(gè)數(shù)據(jù)項(xiàng)的指針,依靠這些指針將所有的數(shù)據(jù)項(xiàng)連接成一個(gè)鏈表。,鏈表概述(2),struct student long num; float score; sturct student *next ; struct student *head;,一個(gè)簡(jiǎn)單鏈表示例:,內(nèi)存動(dòng)態(tài)管理函數(shù),動(dòng)態(tài)分配存儲(chǔ) 根據(jù)需要
20、開辟或釋放存儲(chǔ)單元 相關(guān)函數(shù) malloc函數(shù) calloc函數(shù) free函數(shù) 說明 應(yīng)包含malloc.h或stdlib.h,malloc函數(shù),函數(shù)原型 typedef unsigned size_t; void *malloc(size_t size); 參數(shù) size:分配存儲(chǔ)空間的字節(jié)數(shù) 返回值 若成功,返回指向分配區(qū)域起始地址的指針 若失敗,返回NULL,calloc函數(shù),函數(shù)原型 void *calloc(size_t n, size_t size); 參數(shù) n :分配內(nèi)存的項(xiàng)目數(shù) size:分配內(nèi)存的每個(gè)項(xiàng)目的字節(jié)數(shù) 返回值 若成功,返回指向分配區(qū)域起始地址的指針 若失敗,返回NULL,free函數(shù),函數(shù)原型 void free(void *ptr); 參數(shù) ptr:要釋放的內(nèi)存區(qū)地址 說明 釋放prt指向的內(nèi)存區(qū) 釋放后的內(nèi)存區(qū)能夠分配給其他變量使用,realloc函數(shù),函數(shù)原型 void *realloc(void *ptr,unsigned int size) 參數(shù) ptr:需要改變存儲(chǔ)空間的內(nèi)存區(qū)地址 size:將ptr所指的存儲(chǔ)區(qū)的大
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB 7300.208-2025飼料添加劑第2部分:維生素及類維生素L-抗壞血酸鈣
- 平度語文中考題目及答案
- 啟蒙形態(tài)類比推理題目及答案
- 小學(xué)梯形和比的幾何題目及答案
- 養(yǎng)老院藥品采購(gòu)制度
- 1.2.4絕對(duì)值 課后培優(yōu)檢測(cè)(含答案) 人教版(2024)數(shù)學(xué)七年級(jí)上冊(cè)
- 養(yǎng)老院老人生活?yuàn)蕵坊顒?dòng)組織人員培訓(xùn)制度
- 養(yǎng)老院老人疾病預(yù)防措施制度
- 辦公室環(huán)境衛(wèi)生維護(hù)制度
- 針對(duì)保安公司滿意度調(diào)查制度
- 白內(nèi)障疾病教學(xué)案例分析
- 2026中國(guó)電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘?jìng)淇碱}庫完整參考答案詳解
- 2026年黃委會(huì)事業(yè)單位考試真題
- 供水管網(wǎng)及配套設(shè)施改造工程可行性研究報(bào)告
- 表面粗糙度與檢測(cè)(新國(guó)標(biāo))課件
- 人工智能在系統(tǒng)集成中的應(yīng)用
- 大九九乘法口訣表(可下載打印)
- 金屬非金屬礦山安全操作規(guī)程
- 壓鑄鋁合金熔煉改善
- EVE國(guó)服歷史匯編
- 排水管道溝槽土方開挖專項(xiàng)方案
評(píng)論
0/150
提交評(píng)論