第14章-結(jié)構(gòu)與抽象數(shù)據(jù)類型_第1頁
第14章-結(jié)構(gòu)與抽象數(shù)據(jù)類型_第2頁
第14章-結(jié)構(gòu)與抽象數(shù)據(jù)類型_第3頁
第14章-結(jié)構(gòu)與抽象數(shù)據(jù)類型_第4頁
第14章-結(jié)構(gòu)與抽象數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第14章 結(jié)構(gòu)與抽象數(shù)據(jù)類型,學(xué)習(xí)目標(biāo) (1)理解結(jié)構(gòu)的概念,掌握結(jié)構(gòu)的定義和訪問方法。 (2)熟悉結(jié)構(gòu)作為函數(shù)參數(shù)的使用方法。 (3)理解自引用指針的概念,理解利用自引用指針建 立線性鏈表的方法。 (4)理解聯(lián)合的概念,能使用聯(lián)合解決簡單的實(shí)際問題 (5)理解并掌握位運(yùn)算,了解位字段的概念和使用。,基本類型整型、實(shí)型、字符型等。 構(gòu)造類型數(shù)組,數(shù)組中的各元素屬于同一類型。 當(dāng)若干個(gè)不同類型的數(shù)據(jù)項(xiàng)組成一個(gè)組合項(xiàng)時(shí),用什么 數(shù)據(jù)結(jié)構(gòu)? 例如:一個(gè)學(xué)生的學(xué)號,姓名,姓別,年齡,地址等。 C語言中提供了一種實(shí)現(xiàn)這種組合的數(shù)據(jù)結(jié)構(gòu)- -結(jié)構(gòu)體類型,14.1結(jié)構(gòu)體類型的定義和使用,14.1.1 結(jié)構(gòu)體

2、類型的定義 結(jié)構(gòu)體類型的定義的一般形式: struct 結(jié)構(gòu)體名 成員表列 ;,結(jié)構(gòu)體內(nèi)的各個(gè)成員(即分量)對每個(gè)成員都應(yīng)進(jìn)行類型說明,員的命名和類型說明與變量相同。,例如: 將一個(gè)學(xué)生的學(xué)號、姓名、年齡、成績、地址等項(xiàng)定義成一個(gè)結(jié)構(gòu)體類型,struct student int num; char name20; char sex ; int age; float score; char addr30; ;,結(jié)構(gòu)體名的取法與變量名相同,分號,成員列表(稱為域表),這個(gè)定義就表示定義了一種類型名為struct student 的結(jié)構(gòu)體類型,struct 是系統(tǒng)關(guān)鍵字,表示開始定義一個(gè)結(jié)構(gòu)體類型,

3、 經(jīng)過上面的定義, 類型名 struct student 就可以和其它類型(如 int 等) 一樣用來作為定義變量的類型,num name sex age score addr,10010 Li Fun M 18 87.5 Beijng,a,1. 先定義結(jié)構(gòu)體類型再定義變量名, 例如:,struct student int num; char name20; char sex ; int age; float score; char addr30; ; struct student student1, student2;,定義結(jié)構(gòu)體類型 struct student,定義了兩個(gè)結(jié)構(gòu)體類型 的變

4、量student1和student2,student1 10001 Zhang Xin M 19 90.5 Shanghai,student2 10002 Wang Li F 20 98 Beijing,各占 59 個(gè)字節(jié),14.1.2 定義結(jié)構(gòu)體類型變量的方法,定義結(jié)構(gòu)體類型的變量時(shí),必須指定具體的結(jié)構(gòu) 體類型名。 結(jié)構(gòu)體類型名不是變量,上例中:student 2. 可以用宏定義來定義一個(gè)符號常量代表一個(gè)結(jié)構(gòu)體類型, 目的是為了使用方便。 3. 對于較大的程序,往往將結(jié)構(gòu)體類型的定義集中放到一個(gè)文件中,然后在需要用到該結(jié)構(gòu)體類型的源程序中用#include 命令包含進(jìn)來。,注 意,2. 在定

5、義類型的同時(shí)定義變量,一般形式為:,定義了兩個(gè)類型為struct student的變量student1和student2,struct student int num; char name20; char sex ; int age; float score; char addr30; student1, student2;,注意;的位置,struct 結(jié)構(gòu)體名 成員表列 變量名表列 ;,3. 直接定義結(jié)構(gòu)類型的變量(無結(jié)構(gòu)體名),這里不出現(xiàn)結(jié)構(gòu)體名!,struct 成員表列 變量名表列 ;,一般形式為:,1. 注意“類型”與“變量”區(qū)分。 2. 結(jié)構(gòu)體中的成員(即“域”)可以單獨(dú)使用,作用和

6、地 位相當(dāng)于普通變量。 3. 結(jié)構(gòu)體中的成員還可以是另一個(gè)結(jié)構(gòu)體變量。,結(jié) 構(gòu) 體 類 型 的 說 明,struct date int month; int day; int year; ;,定義一個(gè)結(jié)構(gòu)體類型 struct date,struct studen int num; char name20; int age ; float score; struct date birthday; char addr30; student1, student2 ;,定義結(jié)構(gòu)體類型 struct student,struct date類型的變量birthday,定義了兩個(gè)具有struct stude

7、nt類型的變量student1和student2,例 如 :,4. 成員名可以和程序中的其它變量名相同,兩者互不干涉。,num name sex age,birthday,month day year,addr,struct student,struct day,student1 student2,存儲形式:,在定義了結(jié)構(gòu)體變量以后,就可以引用這個(gè)變量以及變量中的各個(gè)成員。 (1) 結(jié)構(gòu)體變量中的成員的引用方式: 結(jié)構(gòu)體變量名 . 成員名 結(jié)構(gòu)體變量的成員變量的用法和一般變量一樣。 如: 被賦值 , 參與運(yùn)算,. student1 . num=10010 ; 表示變量 student1 中的成

8、員 num賦于10010值。,“.” 成員(分量)運(yùn)算符級別最高,14.1.3 結(jié)構(gòu)體類型變量的引用,(2) 如果結(jié)構(gòu)體變量的成員本身又屬于一個(gè)結(jié)構(gòu)體類型,則需要用若干個(gè)成員運(yùn)算符逐級找到最低一級的成員。如 : student1 . birthday . year,新標(biāo)準(zhǔn)C語言允許將一個(gè)結(jié)構(gòu)體變量直接賦值給另一個(gè)相同類型的結(jié)構(gòu)體變量。 例如: student2=student1 ; 把 student1中所有成員的值一 一賦給 student2 中相應(yīng)的成員.,注意,只能對最低一級的成員進(jìn)行賦值、存取以及運(yùn)算.,(4) 可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址,如 : 以八進(jìn)制 輸出 s

9、tudent1的地址,(3) 結(jié)構(gòu)體變量的成員變量可以像普通變量一樣進(jìn)行各種運(yùn)算, 例如:,student1 . score=student2 . score ; sum=student1 . score+student2 . score ; student1 . age+ ; +student1 . age ;,( 5)不能用以下語句整體輸入結(jié)構(gòu)體變量,如 : scanf(%d , %s , %c , %d , %f , %s , ,結(jié)構(gòu)體數(shù)組中的每個(gè)元素都是一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù), 而且都分別包括各個(gè)成員項(xiàng)。,struct student int num; char name20; char

10、 sex ; int age; float score; char addr30; ; struct student stu3;,定義了一個(gè)數(shù)組stu3,其各元素 為 struct student 類型的數(shù)據(jù),定義結(jié)構(gòu)體類型 struct student,14.2 結(jié)構(gòu)體數(shù)組,類似于結(jié)構(gòu)體變量的定義,只需將變量改為數(shù)組,例如:,14.2.1 定義結(jié)構(gòu)體數(shù)組,也可以直接定義:,struct student 或: struct . . stu3; stu3;,num name sex age score address,stu 0 10101 Li Lin M 18 87.5 103 Beijin

11、g Road,stu1 10102 Zhang Fun M 19 99 130 Shanghai Road,stu2 10104 Wang Min F 20 78.5 1010 Zhongshan Road,數(shù)組各元素在內(nèi)存中連續(xù)存放:,內(nèi)存中是連續(xù)存放的:,stu0,10101 2個(gè)字節(jié),Li Lin 20個(gè)字節(jié),M 1個(gè)字節(jié),18 2個(gè)字節(jié),87.5 4個(gè)字節(jié),103 Beijing Road 30個(gè)字節(jié),59 個(gè)字節(jié),stu1,stu2,。 。 。 。 。 。,只需在定義數(shù)組時(shí)在數(shù)組名后面加上 =初值表列; 例如:,1. 元素內(nèi)部按成員順序初始化; 2. 按數(shù)組元素順序,每個(gè)元素可用 括

12、起來;,14.2.2 結(jié)構(gòu)體數(shù)組的初始化,struct student int num; char name20; stu3= 97001,Zhang,97002,Li,97003,Wang ;,3. 元素個(gè)數(shù),如果缺省,按初值個(gè)數(shù)來確定,例如:,struct student int num ; char name20 ; stu = 97001,Zhang,97002,Li,97003,Wang ;,也可以另外定義和初始化 struct student stu =97001,Zhang,97002,Li,97003,Wang ;,#include struct person char nam

13、e20; int count; leader3= Li,0,Zhang,0,Wang,0 ;,有三個(gè)候選人,統(tǒng)計(jì)得票次數(shù)。 (設(shè)有10個(gè)人選),leader3,name count,Li 0,Zhang 0,Fun 0,14.2.3 結(jié)構(gòu)體數(shù)組應(yīng)用舉例,例 14.2,void main( ) int i , j; char leader_name20; for (i=1; i=10 ; i+) /* 執(zhí)行10次 */ scanf(%s, leader_name); for (j=0 ; j3 ; j+) if (strcmp(leader_name , )=0) lea

14、derj . count+ ; /* 注意優(yōu)先級 */ printf(n); for (i=0 ; i3 ; i+) printf(%s : %dn,leaderi . name , leaderi . count); ,14.3.1 指向結(jié)構(gòu)體變量的指針,#include void main( ) struct student long int num; char name20; float score; ; struct student stu; struct student *p; p=,/* 定義結(jié)構(gòu)體變量 stu */,/* 定義指向 struct student 型數(shù)據(jù)的指針變量

15、p */,/* p指向stu的起始地址 */,/* 變量成員賦值 */,例 14.3,14.3 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針,為了使用方便,將指針p所指向的結(jié)構(gòu)體變量中的成員表示為: p-成員名 等價(jià)于: (*p).成員名 - 稱為指向運(yùn)算符。也就是說有三種形式:,注意: (*p ) . num不可省( ),因?yàn)?. 的優(yōu)先級最高 (*p) 表示 p 所指向的結(jié)構(gòu)體變量,一個(gè)結(jié)構(gòu)體變量的指針就是指向一個(gè)結(jié)構(gòu)變量所占據(jù)的內(nèi)存段的起始地址。,(1)結(jié)構(gòu)體變量名 .成員名 stu . num (2) (* p) . 成員名 (若 p= . ; struct student stu3; struct st

16、udent *p;,14.4.2 指向結(jié)構(gòu)體數(shù)組的指針,(1) p+1 表示下一個(gè)數(shù)組元素的起始地址,即 表示令 p 指向結(jié)構(gòu)體數(shù)組 stu 的首地址,則,14. 5 共用體,共用體類型的結(jié)構(gòu):幾個(gè)不同類型的變量共占同一段內(nèi)存的結(jié)構(gòu)。,共用體類型變量的定義:,union 共用體類型名 成員表列 ; union 共用體類型名 變量表列 ;,union 共用體類型名 成員表列 變量表列 ;,union 成員表列 變量表列 ;,14.5.1 共用體的概念,共用體變量所占的內(nèi)存長度等于最長的成員的長度。,例如:,union data int i ; char ch ; float x ; a ;,變量 a 占幾個(gè) 字節(jié)?,i , ch , x,想一想,a,14.5.2 共用體變量的引用,只能引用共用體變量中的成員,引用方式: 共用體變量名 . 成

溫馨提示

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

最新文檔

評論

0/150

提交評論