版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十二章,結(jié)構(gòu)體與共用體,問題: 有時(shí)需要將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī) 的整體,以便于引用。如: 一個(gè)學(xué)生有學(xué)號(hào)/姓名/性別/年齡/地址等屬性 int num; char name20; char sex; int age; int char addr30;,12.2結(jié)構(gòu)體的定義,結(jié)構(gòu)是一種構(gòu)造數(shù)據(jù)類型(“結(jié)構(gòu)”是由若干個(gè)成員組成的),在使用之前必須先定義,然后才能用來定義相應(yīng)的結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針變量。,結(jié)構(gòu)體類型一般形式:struct 結(jié)構(gòu)體名 成員列表 ; 其中各成員都應(yīng)進(jìn)行類型說明,即 類型名 成員名;,例:struct student int num; char na
2、me20; char sex; int age; float score; char addr30; ;,結(jié)構(gòu)體變量的定義,(1)先聲明結(jié)構(gòu)類型,再定義結(jié)構(gòu)體變量 例:struct student int num; char name20; float score; ; struct student stu1, stu2;,結(jié)構(gòu)體變量的定義,(2)在聲明結(jié)構(gòu)類型的同時(shí)定義結(jié)構(gòu)體變量 例:struct student int num; char name20; float score; stu1, stu2;,結(jié)構(gòu)體變量的定義,(3)直接定義結(jié)構(gòu)體類型變量 例:struct int num; c
3、har name20; float score; stu1, stu2;,結(jié)構(gòu)體變量的引用,一般對(duì)結(jié)構(gòu)體變量的使用,包括賦值、輸入、輸出、運(yùn)算等都是通過其成員來實(shí)現(xiàn)的。 結(jié)構(gòu)體變量成員的表示方法: 結(jié)構(gòu)體變量名.成員名 例:stu1.num (學(xué)生1的學(xué)號(hào)) stu1.score(學(xué)生1的分?jǐn)?shù)),結(jié)構(gòu)體變量的初始化,和其他類型變量一樣,定義結(jié)構(gòu)體變量的同時(shí),給它的成員賦初值。 例:#include void main( ) struct student int num; char name20; float score; stu1=1301,”Zhang San”,82.50; printf(
4、“No.%d,Name:%s,Score:%fn”, stu1.num,,stu1.score); ,結(jié)構(gòu)體變量的賦值,通過輸入語句或賦值語句,實(shí)現(xiàn)對(duì)結(jié)構(gòu)體變量的成員賦值。 例:#include void main( ) struct student int num; char name20; float score; stu1; stu1.num=1301; =”Zhang San”; scanf(“%f”, ,嵌套的結(jié)構(gòu)體,一個(gè)結(jié)構(gòu)體的成員又是一個(gè)結(jié)構(gòu)體。 例: struct date struct student int month; int num;
5、 int day; char name20; int year; char sex; int age; struct date birthday; char addr30; ;,12.3結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體數(shù)組的每一個(gè)元素都是具有相同結(jié)構(gòu)類型的結(jié)構(gòu)體變量。,例:struct student int num; char name20; float score; stu3; 其中,定義了一個(gè)結(jié)構(gòu)體數(shù)組stu,共有3個(gè)元素,每個(gè)元素都具有struct student的結(jié)構(gòu)形式。,結(jié)構(gòu)體數(shù)組的初始化賦值,例:struct student int num; char name20; float score
6、; stu3=1301,”Zhang San”,57, 1302,“Li Si”,82.50,1303,“Wang Wu”,69; 當(dāng)對(duì)全部元素進(jìn)行初始化賦值時(shí),也可以不給出長(zhǎng)度。,12.4結(jié)構(gòu)體指針變量,12.4.1指向結(jié)構(gòu)體變量的指針,一般形式為: struct 結(jié)構(gòu)名 *結(jié)構(gòu)體指針變量名; 例:struct student int num; char name20; float score; ; struct student *pstu; 其中定義了一個(gè)指向student的指針變量pstu。,12.4.1指向結(jié)構(gòu)體變量的指針變量,用結(jié)構(gòu)體指針變量,訪問結(jié)構(gòu)體變量的各個(gè)成員,一般形式為:
7、(*結(jié)構(gòu)體指針變量).成員名; 或 結(jié)構(gòu)體指針變量- 成員名; 例: (*pstu).num 或 pstu- num,例:#include void main( ) struct student int num; char name20; float score; stu1=1301,”Zhang San”,82.50,*pstu; pstu= ,12.4.2指向結(jié)構(gòu)體數(shù)組的指針變量,結(jié)構(gòu)體指針變量可指向一個(gè)結(jié)構(gòu)體數(shù)組,其指針變量的值是整個(gè)結(jié)構(gòu)體數(shù)組的首地址。 例: 設(shè)ps為指向結(jié)構(gòu)體數(shù)組的指針變量, 則ps指向該結(jié)構(gòu)體數(shù)組的0號(hào)元素; ps+1指向該結(jié)構(gòu)體數(shù)組的1號(hào)元素。,例:#includ
8、e void main( ) struct student int num; char name20; float score; stu3=1301,”Zhang San”,57, 1302,“Li Si”,82.50,1303,“Wang Wu”,69; struct student *ps=stu; ps+; printf(“No.%d,Name:%s,Score:%fn”, ps-num, ps- name, ps- score); ,12.5向函數(shù)傳遞結(jié)構(gòu)體(3種方式),1.用結(jié)構(gòu)體的單個(gè)成員作為函數(shù)參數(shù),向函數(shù)傳遞結(jié) 構(gòu)體的單個(gè)成員。,這與普通類型的變量作函數(shù)參數(shù)沒什么區(qū)別,都是傳值
9、調(diào)用,在函數(shù)內(nèi)部對(duì)其進(jìn)行操作,不會(huì)引起實(shí)參結(jié)構(gòu)體成員值的變化。,2.用結(jié)構(gòu)體變量作為函數(shù)參數(shù),向函數(shù)傳遞結(jié)構(gòu)體的 完整結(jié)構(gòu)。,這種傳遞,是將整個(gè)結(jié)構(gòu)體成員的內(nèi)容復(fù)制給被調(diào)函數(shù)。這種方式是傳值調(diào)用,在函數(shù)內(nèi)部對(duì)其進(jìn)行操作,不會(huì)引起實(shí)參結(jié)構(gòu)體成員值的變化。,3.用結(jié)構(gòu)體指針或結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù),向函數(shù) 傳遞結(jié)構(gòu)體的地址。,由于是傳地址調(diào)用,在函數(shù)內(nèi)部對(duì)其進(jìn)行操作,將影響實(shí)參結(jié)構(gòu)體成員值的變化。,12.6共用體,共用體(也稱為聯(lián)合)也是一種構(gòu)造的數(shù)據(jù)類型。 共用體是將不同類型的數(shù)據(jù)組織在一起共同占用同一段內(nèi)存的一種構(gòu)造數(shù)據(jù)類型。,例如,在校學(xué)生和教師都填寫以下表格: 姓名 年齡 職業(yè) 單位 其中
10、,職業(yè)分兩類:教師和學(xué)生; 而單位一欄里,學(xué)生填寫班級(jí)編號(hào)(整型類型),教師填寫某系某教研室(整型類型) 。,共用體的定義,共用體與結(jié)構(gòu)體的類型聲明方法類似。 共用體的關(guān)鍵字為union。,一般形式:union 共用體名 成員列表 ; 其中各成員都應(yīng)進(jìn)行類型說明,即 類型名 成員名;,union department int class; char office20; ;,共用體變量的說明(3種形式),(1)union department 先定義再說明; int class; char office20; ; union department a,b; (2)union department
11、 定義同時(shí)說明; int class; char office20; a,b; (3)union 直接說明。 int class; char office20; a,b;,共用體與結(jié)構(gòu)體的區(qū)別,(1)結(jié)構(gòu)體變量所占內(nèi)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度之和。每個(gè)成員分別占有自己的內(nèi)存單元。 (2)共用體變量所占內(nèi)存長(zhǎng)度是最長(zhǎng)的成員的長(zhǎng)度。即共用體變量的地址和它的各成員的地址是同一地址。,共用體變量的引用,對(duì)共用體變量的使用,包括賦值、使用只能是對(duì)變量的成員進(jìn)行。 共用體變量成員的表示方法: 共用體變量名.成員名 例:a.class a.office 不允許對(duì)共用體變量作初始化賦值,賦值只能在程序中進(jìn)行。
12、,#include #define PN 3 void main( ) struct char name10; int age; char job; union int class; char office10; units; bodyPN;,例:設(shè)有一個(gè)教師和學(xué)生通用的表格,有姓名、年齡、職業(yè)、單位4項(xiàng)。在職業(yè)項(xiàng)中,用s表示學(xué)生,用t表示教師。編程輸入人員數(shù)據(jù),再以表格輸出。,int n,i; for(i=0;iPN;i+) printf(“input name,age,job and departmentn”); scanf(“%s%d%c”,, ,printf(“na
13、metagetjobtclass/officen”); for(i=0;iPN;i+) if(bodyi.job=s) printf(“%st%dt%3ct%dn”,, bodyi.age,bodyi.job,bodyi.units.class); else printf(“%st%dt%3ct%sn”,, bodyi.age,bodyi.job,bodyi.units.office); ,12.7枚舉數(shù)據(jù)類型,當(dāng)某些變量?jī)H由有限個(gè)數(shù)據(jù)值組成時(shí),通常用枚舉類型來表示。 所謂枚舉是指將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi)。如一周只有7天
14、,一年只有12個(gè)月等等。 注意:枚舉類型是一種基本數(shù)據(jù)類型,而不是一種構(gòu)造類型。關(guān)鍵字為enum。,一般形式:enum 枚舉名 枚舉值表 ; 在枚舉值表中應(yīng)羅列出所有可用值,這些值稱之為枚舉元素。 例:enum weekday sun,mon,tue,wed,thu,fri,sat; 聲明了一個(gè)枚舉類型enum weekday,可以用此類型來定義變量,該變量只能取7天中的某一天。,枚舉變量的說明(3種形式),(1)enum weekday 先定義再說明; sun,mon,tue,wed,thu,fri,sat; enum weekday a,b,c; (2)enum weekday 定義同時(shí)說
15、明; sun,mon,tue,wed,thu,fri,sata,b,c; (3)enum 直接說明。 sun,mon,tue,wed,thu,fri,sata,b,c;,枚舉變量的賦值和使用,(1)在C編譯中,對(duì)枚舉元素按常量處理,故稱枚舉常量。它們不是變量,不能對(duì)它們賦值。 例:sun=5; mon=2; sun=mon;是錯(cuò)誤的。,枚舉變量的賦值和使用,(2) 枚舉元素本身由系統(tǒng)定義為有序號(hào)的數(shù)值,從0開始順序定義為0,1,2, 例如在weekday中,sun值為0,mon值為1,sat值為6。這個(gè)序號(hào)值是可以輸出的。 例:#include void main( ) enum weekda
16、y sun,mon,tue,wed,thu,fri,sata,b,c; a=sun; b=mon; c=tue; printf(“%d,%d,%d”a,b,c); ,運(yùn)行結(jié)果:0,1,2,枚舉變量的賦值和使用,(3) 只能把枚舉值賦予枚舉變量,不能把元素的數(shù)值直接賦予枚舉變量。 例:a=sun; b=mon; 是正確的。 a=0; b=1; 是錯(cuò)誤的。 如果一定要把數(shù)值賦予枚舉變量,則必須用強(qiáng)制類型轉(zhuǎn)換,則應(yīng)b=(enum weekday)1; 其意義是將順序號(hào)為1的枚舉元素賦予枚舉變量b,等價(jià)于b=mon; (4) 枚舉元素不是字符常量,也不是字符串常量,使用時(shí)無須加單、雙引號(hào)。,用type
17、def定義數(shù)據(jù)類型,C語言允許用戶用typedef來自定義類型說明符。 例:typedef int INTEDER; (指定用INTEDER來代表int類型) 因此, INTEDER a,b;等價(jià)于int a,b;,typedef定義的一般形式為: typedef 原類型名 新類型名;,用typedef定義數(shù)據(jù)類型,例:typedef char NAME20; 其中,NAME是字符數(shù)組類型,長(zhǎng)度為20。然后可以用NAME說明變量: NAME s1,s2; 等價(jià)于char s120,s220;,用typedef定義數(shù)據(jù)類型,例: typedef struct student int num;y
18、char name20; float score; STU; STU表示struct student的結(jié)構(gòu)類型,然后可以用STU來說明結(jié)構(gòu)變量: STU stu1,stu2;,12.8動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)單向鏈表,一、問題 1.用數(shù)組的方式存儲(chǔ)學(xué)生的數(shù)據(jù),需要預(yù)先確定學(xué)生的人數(shù),并且數(shù)組占用的是一塊連續(xù)的內(nèi)存區(qū)域。 2.用動(dòng)態(tài)存儲(chǔ)的方法:每次分配一塊空間存放一個(gè)學(xué)生的數(shù)據(jù),稱之為一個(gè)結(jié)點(diǎn)。有多少學(xué)生就申請(qǐng)分配多少塊空間,也就建立多少個(gè)結(jié)點(diǎn)。當(dāng)學(xué)生留級(jí)、退學(xué)后,可刪除該結(jié)點(diǎn),并釋放該結(jié)點(diǎn)占用的空間。使用動(dòng)態(tài)分配,每個(gè)結(jié)點(diǎn)之間的內(nèi)存空間可以是不連續(xù)的(結(jié)點(diǎn)內(nèi)是連續(xù)的)。結(jié)點(diǎn)之間的聯(lián)系可以用指針實(shí)現(xiàn)。,二、
19、鏈表的定義 用一個(gè)指針變量head指向第1個(gè)結(jié)點(diǎn)的首地址,以后每個(gè)結(jié)點(diǎn)都分為兩個(gè)域,一個(gè)是數(shù)據(jù)域,存放各種實(shí)際的數(shù)據(jù);另一個(gè)域是指針域,存放下一個(gè)結(jié)點(diǎn)的首地址。最后一個(gè)結(jié)點(diǎn)因無后續(xù)結(jié)點(diǎn)連接,其指針域可賦予NULL。 這種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱為鏈表。 鏈表中每一個(gè)結(jié)點(diǎn)都是同一種結(jié)構(gòu)類型。,例:一個(gè)存放學(xué)生的學(xué)號(hào)和成績(jī)的結(jié)點(diǎn)為: struct student1 int num; float score; struct student1 *next; 前兩個(gè)成員項(xiàng)組成數(shù)據(jù)域,后一個(gè)成員項(xiàng)next構(gòu)成指針域,它是一個(gè)指向同類型結(jié)構(gòu)的指針變量。,#include #define NULL 0 struct student long num; float score; struct student *next; ; void main( ) struct student a,b,c,*head,*p; a.num=00101;a.score=89.5; b.num=00103;b.score=90; c.num=00107;c.score=85;,例:建立一個(gè)簡(jiǎn)單鏈表,由3個(gè)學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成。輸出各結(jié)點(diǎn)中的數(shù)據(jù)。,head= ,三、單向鏈表的建立 可以采取向鏈表中添加結(jié)點(diǎn)的方式來建立一個(gè)單向鏈表。 為了向鏈表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)氧乙烷(乙二醇)裝置操作工安全綜合測(cè)試考核試卷含答案
- 電子電氣產(chǎn)品能效檢驗(yàn)員持續(xù)改進(jìn)強(qiáng)化考核試卷含答案
- 礦井通風(fēng)工安全培訓(xùn)競(jìng)賽考核試卷含答案
- 凹版制版員安全生產(chǎn)基礎(chǔ)知識(shí)能力考核試卷含答案
- 燃?xì)廨斉鋱?chǎng)站運(yùn)行工崗前基礎(chǔ)實(shí)操考核試卷含答案
- 學(xué)生清明節(jié)回家掃墓的請(qǐng)假條
- 2025年聚烯烴類線纜項(xiàng)目發(fā)展計(jì)劃
- 2025年聲增敏保偏光纖合作協(xié)議書
- 遼寧省葫蘆島市2025-2026學(xué)年高一上學(xué)期1月期末考試政治試卷
- 2026年數(shù)字藝術(shù)品收藏項(xiàng)目公司成立分析報(bào)告
- 2026年中國(guó)航空傳媒有限責(zé)任公司市場(chǎng)化人才招聘?jìng)淇碱}庫(kù)有答案詳解
- 2026年《全科》住院醫(yī)師規(guī)范化培訓(xùn)結(jié)業(yè)理論考試題庫(kù)及答案
- 2026北京大興初二上學(xué)期期末語文試卷和答案
- 專題23 廣東省深圳市高三一模語文試題(學(xué)生版)
- 廣元市利州區(qū)何家坪石材廠飾面用灰?guī)r礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 保健按摩師初級(jí)試題
- 上腔靜脈綜合征的護(hù)理
- 2021年度四川省專業(yè)技術(shù)人員繼續(xù)教育公需科目(答案整合)
- 醫(yī)療廢物處理方案
- 船舶靠離泊作業(yè)風(fēng)險(xiǎn)辨識(shí)表
- DB37T 2673-2019醫(yī)療機(jī)構(gòu)能源消耗定額標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論