第5章 自定義數(shù)據(jù)類型 NEW_第1頁
第5章 自定義數(shù)據(jù)類型 NEW_第2頁
第5章 自定義數(shù)據(jù)類型 NEW_第3頁
第5章 自定義數(shù)據(jù)類型 NEW_第4頁
第5章 自定義數(shù)據(jù)類型 NEW_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第5章章 自定義數(shù)據(jù)類型自定義數(shù)據(jù)類型本章內(nèi)容本章內(nèi)容l結(jié)構(gòu)體類型結(jié)構(gòu)體類型l共用體類型共用體類型l枚舉類型枚舉類型l類型定義類型定義l位段結(jié)構(gòu)位段結(jié)構(gòu)3結(jié)構(gòu)體類型結(jié)構(gòu)體類型struct struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 數(shù)據(jù)類型成員名數(shù)據(jù)類型成員名1 1; 數(shù)據(jù)類型成員名數(shù)據(jù)類型成員名2 2; : 數(shù)據(jù)類型成員名數(shù)據(jù)類型成員名n n; ; 結(jié)構(gòu)體類型名是用戶定義的任何一個(gè)有效的標(biāo)識(shí)符,結(jié)構(gòu)體類型名是用戶定義的任何一個(gè)有效的標(biāo)識(shí)符,它的作用就如同任何一個(gè)基本類型名,利用它能夠定義它的作用就如同任何一個(gè)基本類型名,利用它能夠定義具有該結(jié)構(gòu)類型的變量或返回該類型值的函數(shù);具有該結(jié)構(gòu)類型的變

2、量或返回該類型值的函數(shù);5.1.1 5.1.1 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型定義的形式結(jié)構(gòu)體類型定義的形式: :定義結(jié)構(gòu)體類定義結(jié)構(gòu)體類型的關(guān)鍵字型的關(guān)鍵字, ,不不能省略能省略注意分號(hào)不要省略注意分號(hào)不要省略struct studentstruct studentchar id7; char id7; /長度為7的字符數(shù)組id,表示學(xué)號(hào) char name10; char name10; /長度為10的字符數(shù)組name,表示學(xué)號(hào) float score; float score; /單精度實(shí)數(shù)類型score,表示入學(xué)分?jǐn)?shù) ; ; /注意分號(hào)不要省略例:用結(jié)構(gòu)體類型來描述學(xué)生的學(xué)

3、籍信息(學(xué)號(hào)、例:用結(jié)構(gòu)體類型來描述學(xué)生的學(xué)籍信息(學(xué)號(hào)、姓名和入學(xué)分?jǐn)?shù))姓名和入學(xué)分?jǐn)?shù))結(jié)構(gòu)體類型的特點(diǎn)總結(jié)如下:結(jié)構(gòu)體類型的特點(diǎn)總結(jié)如下: (1 1)結(jié)構(gòu)體類型是用戶自行構(gòu)造的。)結(jié)構(gòu)體類型是用戶自行構(gòu)造的。(2 2)它由若干不同的基本數(shù)據(jù)類型的數(shù)據(jù)構(gòu)成。)它由若干不同的基本數(shù)據(jù)類型的數(shù)據(jù)構(gòu)成。(3 3)它屬于)它屬于C+C+語言的一種數(shù)據(jù)類型,與整型、語言的一種數(shù)據(jù)類型,與整型、實(shí)型相當(dāng)。因此,定義它時(shí)不分配空間,只有用實(shí)型相當(dāng)。因此,定義它時(shí)不分配空間,只有用它定義變量時(shí)才分配空間。它定義變量時(shí)才分配空間。 5.1.2 5.1.2 結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義這是這是C+C+語言中

4、定義結(jié)構(gòu)體類型變量最語言中定義結(jié)構(gòu)體類型變量最常見的方式,一般語法格式如下:常見的方式,一般語法格式如下:struct struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 成員說明列表;成員說明列表; ;structstruct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 變量名;變量名;在C+中,一般可以省略struct struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員說明列表;成員說明列表; 變量名表列;變量名表列;struct studentstruct student char id7; char id7; char name20; char name20; float score; float score; st1,st2;

5、st1,st2; struct 成員說明列表; 變量名表列;注意注意:該方式?jīng)]有結(jié)構(gòu)體類型名該方式?jīng)]有結(jié)構(gòu)體類型名, ,這種形式雖然簡單,但不這種形式雖然簡單,但不能在再次需要定義該類型能在再次需要定義該類型的變量時(shí),使用所定義的的變量時(shí),使用所定義的結(jié)構(gòu)體類型。結(jié)構(gòu)體類型。 struct char name10; char id7; float score; st1,st2;(1)(1)類型與變量是不同的概念,不要混淆。類型與變量是不同的概念,不要混淆。對(duì)結(jié)構(gòu)體變量來說,對(duì)結(jié)構(gòu)體變量來說,在定義時(shí)一般先定義一個(gè)結(jié)構(gòu)體類型,在定義時(shí)一般先定義一個(gè)結(jié)構(gòu)體類型,然后定義該類型的變量。在編譯時(shí),是不

6、會(huì)為類型分配空然后定義該類型的變量。在編譯時(shí),是不會(huì)為類型分配空間的,只為變量分配空間。間的,只為變量分配空間。關(guān)于結(jié)構(gòu)體變量的幾點(diǎn)說明關(guān)于結(jié)構(gòu)體變量的幾點(diǎn)說明: :struct studentstruct student char id7; char id7; char char name10; name10; float score; float score; st1;st1; (2)(2)結(jié)構(gòu)體變量的存儲(chǔ)空間結(jié)構(gòu)體變量的存儲(chǔ)空間 理論上理論上, ,是結(jié)構(gòu)體變量各成員是結(jié)構(gòu)體變量各成員所占內(nèi)存空間的總和。所占內(nèi)存空間的總和。 結(jié)構(gòu)變量占實(shí)際內(nèi)存大小可結(jié)構(gòu)變量占實(shí)際內(nèi)存大小可用用 sizeo

7、f sizeof 運(yùn)算:運(yùn)算:sizeof(sizeof(運(yùn)算量運(yùn)算量) )struct studentstruct studentchar id7; char id7; char name10; char name10; float score; float score; ; ; structstruct student st1,st2; student st1,st2;例:定義描述學(xué)生的學(xué)籍信息(學(xué)號(hào)、姓名例:定義描述學(xué)生的學(xué)籍信息(學(xué)號(hào)、姓名和入學(xué)分?jǐn)?shù))的變量和入學(xué)分?jǐn)?shù))的變量在C+中,一般寫成: student st1,st2;struct date int month;int day

8、;int year;struct student int num; char name20; char sex; date birthday; char addr40;stu1stu1,stu2stu2; datedate是結(jié)構(gòu)體類型,是結(jié)構(gòu)體類型,birthdaybirthday是是datedate類型的成員類型的成員(3) (3) 成員也可以是一個(gè)結(jié)構(gòu)體變量成員也可以是一個(gè)結(jié)構(gòu)體變量, ,即結(jié)構(gòu)體嵌套定義。即結(jié)構(gòu)體嵌套定義。5.1.3 5.1.3 結(jié)構(gòu)體變量的引用和初始化結(jié)構(gòu)體變量的引用和初始化一、用結(jié)構(gòu)體變量名引用其成員一、用結(jié)構(gòu)體變量名引用其成員格式:格式: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.

9、成員名成員名struct datestruct date int month;int month; int day; int day; int year; int year;struct studentstruct student int num; int num; char name20; char name20; char sex; char sex; date birthday; date birthday; char addr40; char addr40;stu1,stu2;stu1,stu2; stu1.num=20312; stu1.num表示引用結(jié)表示引用結(jié)構(gòu)體變量構(gòu)體變量st

10、u1中的中的num成成員員注意:注意: 1. 1.如果成員本身也是一個(gè)結(jié)如果成員本身也是一個(gè)結(jié)構(gòu)體類型,則要用若干個(gè)成構(gòu)體類型,則要用若干個(gè)成員運(yùn)算符員運(yùn)算符, ,一級(jí)一級(jí)地找到最一級(jí)一級(jí)地找到最低一級(jí)的成員。低一級(jí)的成員。stu1.birthday.month=5stu1.birthday.month=5;struct studentstruct student int num; int num; char name20; char name20; char sex; char sex; date birthday; date birthday; char addr40; char addr

11、40; stu1stu1, ,stu2stu2; ; struct datestruct date int month;int month; int day; int day; int year; int year; 2. 2.對(duì)結(jié)構(gòu)體變量的成員可以像普通對(duì)結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運(yùn)算變量一樣進(jìn)行各種運(yùn)算 stu2.numstu1.num; stu1.birthday.day+;由于由于“.”“.”運(yùn)算符的優(yōu)先級(jí)最高,運(yùn)算符的優(yōu)先級(jí)最高,因此因此stu1.birthday.day+; stu1.birthday.day+; 相當(dāng)于相當(dāng)于(stu1.birthday.day)+

12、;(stu1.birthday.day)+;注意:注意:struct datestruct date int month;int month; int day; int day; int year; int year;struct studentstruct student int num; int num; char name20; char name20; char sex; char sex; date birthday; date birthday; char addr40; char addr40; stu1stu1, ,stu2stu2; ; 3. 3.屬于同一結(jié)構(gòu)體類型的各個(gè)屬于

13、同一結(jié)構(gòu)體類型的各個(gè)成員之間可以相互賦值成員之間可以相互賦值。 stu2stu1; 4.不能將一個(gè)結(jié)構(gòu)體變量作為一不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出,只能對(duì)個(gè)整體進(jìn)行輸入和輸出,只能對(duì)結(jié)構(gòu)體變量中的各個(gè)成員分別進(jìn)結(jié)構(gòu)體變量中的各個(gè)成員分別進(jìn)行輸入和輸出。行輸入和輸出。coutstu1; /錯(cuò)誤錯(cuò)誤cout成員名成員名通過結(jié)構(gòu)體變量的指針來引用結(jié)通過結(jié)構(gòu)體變量的指針來引用結(jié)構(gòu)體變量的成員,必須使用構(gòu)體變量的成員,必須使用“-”運(yùn)算符。運(yùn)算符。p.x = 23.7; p.y=3.5 pt=&u;pt-x=12.2; pt-y=24.3;struct nodestruct nod

14、e float x,y; float x,y;p, u, p, u, * *pt;pt; “*指針變量指針變量”表示指針變量表示指針變量所指對(duì)象,所以通過指向結(jié)構(gòu)體所指對(duì)象,所以通過指向結(jié)構(gòu)體的指針變量引用結(jié)構(gòu)體成員也可的指針變量引用結(jié)構(gòu)體成員也可寫成以下形式:寫成以下形式: (*指針變量指針變量).結(jié)構(gòu)體成員名結(jié)構(gòu)體成員名(*pt).x=12.2這里圓括號(hào)是必須的,因?yàn)檫\(yùn)算符這里圓括號(hào)是必須的,因?yàn)檫\(yùn)算符“* *”的優(yōu)先級(jí)低于運(yùn)算符的優(yōu)先級(jí)低于運(yùn)算符“. .”。 二、用指向結(jié)構(gòu)體變量的指針引用其成員二、用指向結(jié)構(gòu)體變量的指針引用其成員 結(jié)構(gòu)體變量結(jié)構(gòu)體變量. .成員名。如成員名。如:stu.

15、num:stu.num ( (* *p).p).成員名。如成員名。如:(:(* *p).nump).num p- p-成員名。如成員名。如:p-num:p-num。p-np-np-n+ p-n+ +p-n+p-n:得到p指向的結(jié)構(gòu)體變量中的成員n的值。p指向的結(jié)構(gòu)體變量中的成員n的值,用完該值后使它加1。p指向的結(jié)構(gòu)體變量中的成員n的值,并使之加1,然后再使用它。總結(jié):結(jié)構(gòu)體成員的三種表示方法:總結(jié):結(jié)構(gòu)體成員的三種表示方法:5.1.3 5.1.3 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量初始化的方式和數(shù)組類似,也是在定結(jié)構(gòu)體變量初始化的方式和數(shù)組類似,也是在定義后面用花括號(hào)括起來義后面

16、用花括號(hào)括起來 struct Student int num; char name20; char sex; int age; float score; char addr30; student1=10001,Zhangin,M,19,90.5,Shanghai;Student student2=10002,Wang Li“,F,20,98,Beijing; 也可以采取聲明類型與定義變量分開的形式,在定義變量時(shí)進(jìn)行初始化【例】結(jié)構(gòu)體變量的引用與初始化示例#includestruct student int num; char name10; char sex; float score; ;vo

17、id main() student st1,st2=1001,Lin qiang,m,95.5,*p; p=&st1; /p指向結(jié)構(gòu)體變量指向結(jié)構(gòu)體變量st1 st1=st2; coutst1.numendl; /輸出輸出st1中的中的num成員的值成員的值 coutnameendl; /輸出輸出p所指變量所指變量st1中的中的name成員的值成員的值 coutsexendl; /輸出輸出p所指變量所指變量st1中的中的sex成員的值成員的值 coutst1.scoreendl; /輸出輸出st1中的中的score成員的值成員的值運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:1001Lin qiangm

18、 結(jié)構(gòu)體數(shù)組 一個(gè)結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)一個(gè)結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如(如一個(gè)學(xué)生的學(xué)號(hào)、姓名、成績等數(shù)據(jù))。如一個(gè)學(xué)生的學(xué)號(hào)、姓名、成績等數(shù)據(jù))。如果有果有10個(gè)學(xué)生的數(shù)據(jù)需要參加運(yùn)算,顯然應(yīng)個(gè)學(xué)生的數(shù)據(jù)需要參加運(yùn)算,顯然應(yīng)該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。 結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組的結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組的不同之處在于:不同之處在于: 每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個(gè)成員項(xiàng)。體類型的數(shù)據(jù),它們都分別包括各個(gè)成員項(xiàng)。struct student struct studen

19、t /聲明結(jié)構(gòu)體類型聲明結(jié)構(gòu)體類型 int num; int num;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr30;char addr30;student stu3; student stu3; /定義定義studentstudent類型的數(shù)組類型的數(shù)組stustu數(shù)組各元素在內(nèi)存中連續(xù)存放數(shù)組各元素在內(nèi)存中連續(xù)存放struct studentstruct student int num; int num; char name20; char name2

20、0; char sex; char sex; int age; int age; float score; float score; char addr30; char addr30; stu3=stu3= 10101,Li Lin,M,18,87.5,103 Beijing Road,10101,Li Lin,M,18,87.5,103 Beijing Road,10102, Zhang Fun, M,19,99, 130 Shanghai Road,10102, Zhang Fun, M,19,99, 130 Shanghai Road,10104, Wang Min,F,20,78.5,

21、 1010,Zhongshan Road10104, Wang Min,F,20,78.5, 1010,Zhongshan Road ; ;結(jié)構(gòu)體數(shù)組初始化的一般結(jié)構(gòu)體數(shù)組初始化的一般形式是在所定義的數(shù)組名形式是在所定義的數(shù)組名的后面加上的后面加上 =初值表列初值表列;設(shè)有設(shè)有3 3個(gè)候選人,最終只能有個(gè)候選人,最終只能有1 1人當(dāng)選為領(lǐng)導(dǎo)。今人當(dāng)選為領(lǐng)導(dǎo)。今有有1010個(gè)人參加投票,從鍵盤先后輸入這個(gè)人參加投票,從鍵盤先后輸入這1010個(gè)人所個(gè)人所投的候選人的名字,要求最后輸出這投的候選人的名字,要求最后輸出這3 3個(gè)候選人的個(gè)候選人的得票結(jié)果。得票結(jié)果。#include #include

22、using namespace std;using namespace std;struct Person struct Person char name20;char name20; int count; int count;void main( )void main( ) Person leader3=Li,0, Zhang,0, Sun,0; Person leader3=Li,0, Zhang,0, Sun,0; int i,j;int i,j;char leader_name20; char leader_name20; for(i=0;i10;i+)for(i=0;ileader_

23、name; cinleader_name; /先后輸入先后輸入1010張票上所寫的姓名張票上所寫的姓名 for(j=0;j3;j+) for(j=0;j3;j+) /將票上姓名與將票上姓名與3 3個(gè)候選人的姓個(gè)候選人的姓名比較名比較 if(strcmp(leader_name,)=0) if(strcmp(leader_name,)=0) leaderj.count+; leaderj.count+; coutendl; coutendl; for(i=0;i3;i+) for(i=0;i3;i+) /輸出輸出3 3個(gè)候選人的姓名與最后得票個(gè)候選

24、人的姓名與最后得票數(shù)數(shù) :leaderi.countendl; :leaderi.countendl; 將一個(gè)結(jié)構(gòu)體變量中的數(shù)據(jù)傳遞給另一個(gè)函數(shù):將一個(gè)結(jié)構(gòu)體變量中的數(shù)據(jù)傳遞給另一個(gè)函數(shù): (1) 用結(jié)構(gòu)體變量名作參數(shù)用結(jié)構(gòu)體變量名作參數(shù)(傳值調(diào)用傳值調(diào)用)。一般較少。一般較少用這種方法。用這種方法。(2) 用指向結(jié)構(gòu)體變量的指針作實(shí)參,將結(jié)構(gòu)體變用指向結(jié)構(gòu)體變量的指針作實(shí)參,將結(jié)構(gòu)體變量的地址傳給形參量的地址傳給形參(傳址調(diào)用傳址調(diào)用) 。(3) 用結(jié)構(gòu)體變量的引用變量作函數(shù)參數(shù)用結(jié)構(gòu)體變量的引用變量作函數(shù)參數(shù)(引用調(diào)引用調(diào)用用

25、) 。.5 結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)#include struct student int num; char name20; float score3;void print(student stustu);int main( ) student stu=12345,Li Fung,67.5,89,78.5; print(stu); return 0; void print(student stu)coutstu.num stu.score0 stu.score1 stu.score2endl;#include using name

26、space std;struct student int num; char name20; float score3;void print(student *stustu);int main( ) student stu=12345,Li Fung,67.5,89,78.5,*pt=&stu; print(pt); /或print(&stu); return 0; void print(student *p) coutnum name p-score0 score1 score2 endl;student *pt=&stu;print(pt); void print(

27、student *p) #include using namespace std;struct student int num; char name20; float score3;void print(student *stustu);int main( ) student stu=12345,Li Fung,67.5,89,78.5; print(stu); return 0; void print(student &stud) coutstud.num stud.score0 stud.score1 stud.score2endl;(1)用結(jié)構(gòu)體變量作實(shí)參和形

28、參,程序直觀易懂,效用結(jié)構(gòu)體變量作實(shí)參和形參,程序直觀易懂,效率不高;率不高;(2)指針變量作為實(shí)參和形參,空間和時(shí)間的開銷都指針變量作為實(shí)參和形參,空間和時(shí)間的開銷都很小,效率較高,但不如很小,效率較高,但不如(1)直觀。直觀。(3)實(shí)參是結(jié)構(gòu)體類型變量,而形參用結(jié)構(gòu)體類型的實(shí)參是結(jié)構(gòu)體類型變量,而形參用結(jié)構(gòu)體類型的引用,虛實(shí)結(jié)合時(shí)傳遞的是地址,因而效率較高。引用,虛實(shí)結(jié)合時(shí)傳遞的是地址,因而效率較高。它兼有它兼有(1)和和(2)的優(yōu)點(diǎn)。引用變量主要用作函數(shù)參的優(yōu)點(diǎn)。引用變量主要用作函數(shù)參數(shù),它可以提高效率,而且保持程序良好的可讀性。數(shù),它可以提高效率,而且保持程序良好的可讀性。 鏈表是最簡

29、單也是最常用的一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。鏈表是最簡單也是最常用的一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。它是對(duì)動(dòng)態(tài)獲得的內(nèi)存進(jìn)行組織的一種結(jié)構(gòu);不它是對(duì)動(dòng)態(tài)獲得的內(nèi)存進(jìn)行組織的一種結(jié)構(gòu);不同于數(shù)組,數(shù)組存儲(chǔ)數(shù)據(jù)時(shí),必須事先定義固定同于數(shù)組,數(shù)組存儲(chǔ)數(shù)據(jù)時(shí),必須事先定義固定的長度(即數(shù)組元素個(gè)數(shù))且占有一片連續(xù)單元;的長度(即數(shù)組元素個(gè)數(shù))且占有一片連續(xù)單元;而而鏈表是動(dòng)態(tài)組織元素,不需要占用一片連續(xù)內(nèi)鏈表是動(dòng)態(tài)組織元素,不需要占用一片連續(xù)內(nèi)存。存。5.1.6 5.1.6 鏈表(自學(xué)鏈表(自學(xué)) )一、鏈表的概念一、鏈表的概念下面是一個(gè)單向鏈表結(jié)點(diǎn)的類型說明:下面是一個(gè)單向鏈表結(jié)點(diǎn)的類型說明:struct node int

30、data; struct node *next; /存放下一結(jié)點(diǎn)的地址;其中,其中,data成員用于存儲(chǔ)一個(gè)整數(shù),成員用于存儲(chǔ)一個(gè)整數(shù),next成成員是指針類型的,它指向員是指針類型的,它指向struct node類型數(shù)類型數(shù)據(jù)據(jù)一個(gè)單向鏈表結(jié)點(diǎn)的類型說明:一個(gè)單向鏈表結(jié)點(diǎn)的類型說明: 每一個(gè)結(jié)點(diǎn)都屬于node類型,在它的成員next中存放下一個(gè)結(jié)點(diǎn)的地址,程序設(shè)計(jì)者不必知道各結(jié)點(diǎn)的具體地址,只要保證能將下一個(gè)結(jié)點(diǎn)的地址放到前一結(jié)點(diǎn)的成員next中即可。鏈表有一個(gè)鏈表有一個(gè)“頭指針頭指針”變量,圖中以變量,圖中以head表示表示二、內(nèi)存動(dòng)態(tài)管理運(yùn)算符二、內(nèi)存動(dòng)態(tài)管理運(yùn)算符l申請(qǐng)一個(gè)存儲(chǔ)指定數(shù)據(jù)

31、類型的值的內(nèi)存空間申請(qǐng)一個(gè)存儲(chǔ)指定數(shù)據(jù)類型的值的內(nèi)存空間 = new = new ( ); ;l為數(shù)組申請(qǐng)內(nèi)存:為數(shù)組申請(qǐng)內(nèi)存: = new = new ; 內(nèi)存空間申請(qǐng)內(nèi)存空間申請(qǐng)new new運(yùn)算符的功能是根據(jù)指定數(shù)據(jù)類型的大小申運(yùn)算符的功能是根據(jù)指定數(shù)據(jù)類型的大小申請(qǐng)一塊適當(dāng)?shù)膭?dòng)態(tài)存儲(chǔ)區(qū),并返回指向該動(dòng)態(tài)存請(qǐng)一塊適當(dāng)?shù)膭?dòng)態(tài)存儲(chǔ)區(qū),并返回指向該動(dòng)態(tài)存儲(chǔ)空間的起始地址;若申請(qǐng)不成功,則會(huì)返回儲(chǔ)空間的起始地址;若申請(qǐng)不成功,則會(huì)返回NULL值。值。 一般將一般將new操作的結(jié)果賦給具有相應(yīng)數(shù)據(jù)類型的指操作的結(jié)果賦給具有相應(yīng)數(shù)據(jù)類型的指針變量。針變量。 二、內(nèi)存動(dòng)態(tài)管理運(yùn)算符二、內(nèi)存動(dòng)態(tài)管理運(yùn)算

32、符2. 內(nèi)存空間釋放內(nèi)存空間釋放delete使用使用newnew運(yùn)算符動(dòng)態(tài)分配給用戶的存儲(chǔ)空間,可以通運(yùn)算符動(dòng)態(tài)分配給用戶的存儲(chǔ)空間,可以通過使用過使用deletedelete運(yùn)算符重新歸還給系統(tǒng),若沒有使用運(yùn)算符重新歸還給系統(tǒng),若沒有使用deletedelete釋放該內(nèi)存區(qū)域,則只有等到整個(gè)程序運(yùn)行結(jié)釋放該內(nèi)存區(qū)域,則只有等到整個(gè)程序運(yùn)行結(jié)束才被系統(tǒng)重新自動(dòng)回收。束才被系統(tǒng)重新自動(dòng)回收。l用于釋放先前申請(qǐng)到的內(nèi)存空間用于釋放先前申請(qǐng)到的內(nèi)存空間: :delete delete ;l用于釋放先前為數(shù)組申請(qǐng)到的空間用于釋放先前為數(shù)組申請(qǐng)到的空間: : delete delete ;例如:floa

33、t *pf=new float(55.8);int *pa=new int20;int m;int *pi=&m;delete pf; /釋放pf所指的動(dòng)態(tài)內(nèi)存空間delete pi; /錯(cuò)誤,pi所指的內(nèi)存空間不是new分配的,不能用delete釋放delete pa; /釋放pa所指的動(dòng)態(tài)數(shù)組內(nèi)存空間delete只能釋放用只能釋放用new申請(qǐng)的動(dòng)態(tài)內(nèi)存空間。申請(qǐng)的動(dòng)態(tài)內(nèi)存空間。三、鏈表的基本操作三、鏈表的基本操作鏈表的基本操作包括建立鏈表、鏈表的插入、刪鏈表的基本操作包括建立鏈表、鏈表的插入、刪除、輸出和查找等。除、輸出和查找等。1. 1. 建立鏈表建立鏈表所謂建立鏈表是指一個(gè)一個(gè)

34、地輸入各結(jié)點(diǎn)數(shù)據(jù),所謂建立鏈表是指一個(gè)一個(gè)地輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起各結(jié)點(diǎn)前后相鏈的關(guān)系。并建立起各結(jié)點(diǎn)前后相鏈的關(guān)系。下面通過一個(gè)例子來說明如何建立一個(gè)鏈表。下面通過一個(gè)例子來說明如何建立一個(gè)鏈表。 兩種方式:插鏈表尾、插鏈表頭三、鏈表的基本操作三、鏈表的基本操作插鏈表尾:插鏈表尾:是指新插入的結(jié)點(diǎn)總是放在鏈表尾部。一般地,鏈表是在一個(gè)空鏈表的基礎(chǔ)上逐步插入新結(jié)點(diǎn)而成的,空鏈表是指沒有一個(gè)結(jié)點(diǎn),此時(shí)鏈表的頭指針為空。 用插表尾法建立鏈表的過程如下:用插表尾法建立鏈表的過程如下:1) 建立空鏈表,head = last =NULL; head表示頭表頭,指向空,表示鏈表為空, last是表尾指

35、針。2) 產(chǎn)生新結(jié)點(diǎn)p,對(duì)新結(jié)點(diǎn)的數(shù)據(jù)域和指針域賦值。由于新插入的結(jié)點(diǎn)總是表尾結(jié)點(diǎn),則它的后繼結(jié)點(diǎn)為空。三、鏈表的基本操作三、鏈表的基本操作3) 將p結(jié)點(diǎn)插入鏈表,如果head 為NULL,則 head = p; 新結(jié)點(diǎn)作為表頭,這時(shí)鏈表只有一個(gè)結(jié)點(diǎn),否則,last-next=p; 即插入鏈尾操作。4) last = p;表示表尾指針last指向新結(jié)點(diǎn)p。5) 循環(huán)執(zhí)行2)4),可繼續(xù)建立新結(jié)點(diǎn)直到結(jié)束為止 寫一函數(shù)采用插表尾法建立一個(gè)有n個(gè)node結(jié)點(diǎn)的單向鏈表。struct node int data; struct node *next;void creat(node * &he

36、ad, int n)/建立以head指針的具有n個(gè)結(jié)點(diǎn)的鏈表,head為引用參數(shù),/以使對(duì)應(yīng)的實(shí)參為該鏈表的表頭指針 if(n0) coutn值無效endl; exit(1); if(n=0)head=NULL; return; /置表頭指針為空后返回 cout從鍵盤上輸入n個(gè)整數(shù)x; p-data=x; p-next=NULL; head=last=p;if(n=1) return; for(i=1;inext=p; cinx; p-data=x; last=p; p-next=NULL; 2.鏈表的輸出鏈表的輸出 要依次輸出鏈表中各結(jié)點(diǎn)的數(shù)據(jù)比較容易處理。首先要知道鏈表頭結(jié)點(diǎn)的地址,也就是

37、head的值,然后設(shè)一個(gè)指針變量p,先指向第一個(gè)結(jié)點(diǎn),輸出p所指結(jié)點(diǎn)的數(shù)據(jù)域的值,然后使p后移一個(gè)結(jié)點(diǎn),再輸出其數(shù)據(jù)域的值;依鏈表順序而行,依次輸出相應(yīng)結(jié)點(diǎn)數(shù)據(jù)域的值,直到鏈表的尾結(jié)點(diǎn)。輸出鏈表的函數(shù)traverse如下:void traverse (node *head) node *p; p=head; while(p) coutdatanext; /使p指針移動(dòng)到下一個(gè)結(jié)點(diǎn) coutnext;(移動(dòng)指針p,繼續(xù)找)3)如果找到了刪除結(jié)點(diǎn)p,如果 p= = head 刪除的是頭結(jié)點(diǎn),則 head = head-next ; /*刪除頭結(jié)點(diǎn)*/ else p1-next = p-next ;

38、 /*刪除p指向的結(jié)點(diǎn)*/4)delete p; 釋放刪除結(jié)點(diǎn)的內(nèi)存空間。刪除鏈表中一個(gè)結(jié)點(diǎn)的函數(shù)erase如下:void erase(node* &head,int no) node *p,*p1; p=p1=head; if (head=NULL) cout 鏈表為空,無結(jié)點(diǎn)可刪data=no) head=p-next; delete p; else while(p-data!=no) p1=p; p=p-next; if(p=NULL) cout鏈表中沒有要?jiǎng)h除的結(jié)點(diǎn)next=p-next; delete p; cout刪除結(jié)點(diǎn)成功-”運(yùn)算符來運(yùn)算符來引用共用體變量的成員。引用共

39、用體變量的成員。 引用共用體變量的引用共用體變量的i、ch、f成員,成員,通過變量通過變量a可以表示為:可以表示為: a.i, a.ch, a.f通過指針通過指針px可以表示為:可以表示為: px-i, px-ch, px-f(*px).i, (*px).ch, (*px).f注意注意: :不能直接用共用體變量名進(jìn)行輸入輸出,而只能對(duì)共用不能直接用共用體變量名進(jìn)行輸入輸出,而只能對(duì)共用體變量的具體成員進(jìn)行輸入輸出。體變量的具體成員進(jìn)行輸入輸出。 couta; 錯(cuò)誤cout a.i; 正確一個(gè)共用體變量在某一時(shí)刻只能存儲(chǔ)其中的一個(gè)成員值,一個(gè)共用體變量在某一時(shí)刻只能存儲(chǔ)其中的一個(gè)成員值,當(dāng)對(duì)一個(gè)

40、新的成員賦值后,原有成員的值就被覆蓋掉。共當(dāng)對(duì)一個(gè)新的成員賦值后,原有成員的值就被覆蓋掉。共用體變量中存儲(chǔ)的值就是最后賦給它的成員的值。用體變量中存儲(chǔ)的值就是最后賦給它的成員的值。 a.i=278; a.ch=D; a.f=5.78;共用體變量中最后存儲(chǔ)的值是5.78C+允許在兩個(gè)同類型的共用體變量之間賦值允許在兩個(gè)同類型的共用體變量之間賦值 如果a、b均是已定義為上面的union data類型的變量,則執(zhí)行b=a;后,b的內(nèi)容與a完全相同【例】 寫出下列程序的執(zhí)行結(jié)果#includevoid main() union ex int a; char ch; ; ex m; m.a=48; /m

41、中存儲(chǔ)一個(gè)整數(shù)48 cout”m.a=”m.aendl; m.a=65; /m中存儲(chǔ)一個(gè)整數(shù)65,原來存儲(chǔ)的數(shù)被覆蓋 cout”m.a=”m.a” ”m.ch=”m.chendl; 程序運(yùn)行結(jié)果如下:m.a=48m.a=65 m.ch=A5.2.3 5.2.3 共用體與結(jié)構(gòu)體的聯(lián)合使用共用體與結(jié)構(gòu)體的聯(lián)合使用 共用體雖然可以有多個(gè)成員,但在某一時(shí)共用體雖然可以有多個(gè)成員,但在某一時(shí)刻,只能使用其中的一個(gè)成員。共用體一般不刻,只能使用其中的一個(gè)成員。共用體一般不單獨(dú)使用,通常作為結(jié)構(gòu)體的成員,這樣結(jié)構(gòu)單獨(dú)使用,通常作為結(jié)構(gòu)體的成員,這樣結(jié)構(gòu)體可根據(jù)不同情況存儲(chǔ)不同類型的數(shù)據(jù)。體可根據(jù)不同情況存儲(chǔ)

42、不同類型的數(shù)據(jù)。 【例【例5.6】 輸入輸入15個(gè)學(xué)生或教師的數(shù)據(jù),并輸個(gè)學(xué)生或教師的數(shù)據(jù),并輸出。學(xué)生和教師的數(shù)據(jù)相同的部分有:姓名、出。學(xué)生和教師的數(shù)據(jù)相同的部分有:姓名、編號(hào)和身份;但也有不同的部分:學(xué)生需要保編號(hào)和身份;但也有不同的部分:學(xué)生需要保存存3門課程的分?jǐn)?shù),分?jǐn)?shù)用浮點(diǎn)數(shù)表示,教師則門課程的分?jǐn)?shù),分?jǐn)?shù)用浮點(diǎn)數(shù)表示,教師則保存工作情況簡介,用字符串表示。保存工作情況簡介,用字符串表示。5.2.3 5.2.3 共用體與結(jié)構(gòu)體的聯(lián)合使用共用體與結(jié)構(gòu)體的聯(lián)合使用對(duì)于教師和學(xué)生的不同部分可以用共用體描述。對(duì)于教師和學(xué)生的不同部分可以用共用體描述。union condition float

43、 score3; char situation80;struct person char name20; char num10; char kind; condition state;personnel15;結(jié)構(gòu)體的成員state為共用體,根據(jù)kind的值來決定state是存儲(chǔ)3門課程的分?jǐn)?shù),還是存儲(chǔ)教師工作情況簡介。例如,教師的kind為字符t,學(xué)生的kind為字符s。 #include#includeunion condition float score3; char situation80;struct people char name10; char num7; char kind;

44、condition state;people person15;void main() int i,j; for(i=0;i15;i+) ; coutpersoni.num; coutpersoni.kind;if (personi.kind=t) coutpersoni.state.situation; else coutEnter 3 course score:; for(j=0;jpersoni.state.scorej; kind的值為t則輸入字符串到personnel i.state.situation,否則輸入3個(gè)浮點(diǎn)數(shù)到personnel i.st

45、ate.score j。 coutThe Result is:endl;for(i=0;i3;i+) personi.num personi.kind ; if(personi.kind=t) coutpersoni.state.situationendl; elsefor(j=0;j3;j+) coutpersoni.state.scorej ; coutendl; 5.3 5.3 枚舉類型枚舉類型枚舉類型定義的一般形式:枚舉類型定義的一般形式: enum enum 枚舉名枚舉名 枚舉常量取值表枚舉常量取值表 ; ;例如:例如:enum color1 blu

46、e, green, red ;enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ;枚舉類型實(shí)際上是一個(gè)整型符號(hào)常量的集合,枚舉類型實(shí)際上是一個(gè)整型符號(hào)常量的集合,每一個(gè)枚舉符都對(duì)應(yīng)著一個(gè)整數(shù)值每一個(gè)枚舉符都對(duì)應(yīng)著一個(gè)整數(shù)值 枚舉符號(hào)常量的整型值:枚舉符號(hào)常量的整型值: l隱式定義:隱式定義: 按照類型定義時(shí)枚舉常量列舉的順序分別代按照類型定義時(shí)枚舉常量列舉的順序分別代表表0、1、2、等整型值,依次類推。等整型值,依次類推。 例如:例如: enum weekday enum weekday Sun, Mon, Tue, Wed, Thu, Fri, S

47、un, Mon, Tue, Wed, Thu, Fri, Sat ;Sat ;Sun,MonSat的整型值依次為:,的整型值依次為:,枚舉符號(hào)常量的整型值:枚舉符號(hào)常量的整型值:l顯式定義:顯式定義:在定義類型的同時(shí)指定枚舉常量的值,其中如有未指在定義類型的同時(shí)指定枚舉常量的值,其中如有未指定值的枚舉常量,則根據(jù)前面的枚舉常量的值依次遞定值的枚舉常量,則根據(jù)前面的枚舉常量的值依次遞增增1。例如:例如: enum weekday enum weekday Sun= Sun=, Mon=1, Tue, Wed, Thu, , Mon=1, Tue, Wed, Thu, Fri, Sat ;Fri,

48、 Sat ;Sun,MonSat的整型值依次為:的整型值依次為:7,枚舉類型變量定義的三種形式:枚舉類型變量定義的三種形式:例如:例如: enum weekday enum weekday Sun= Sun=, Mon=1, Tue, Wed, Thu, Fri, , Mon=1, Tue, Wed, Thu, Fri, Sat ;Sat ; enum weekday d1,d2; enum weekday d1,d2; enumenum 枚舉名枚舉名 枚舉變量名表枚舉變量名表; ; enumenum 枚舉名枚舉名 枚舉常量取值表枚舉常量取值表 枚舉變量表枚舉變量表; ; enumenum 枚

49、舉常量取值表枚舉常量取值表 枚舉變量表枚舉變量表; ;將將d1,d2定義成枚舉類型定義成枚舉類型weekday的變量,每的變量,每一個(gè)變量都可取該枚舉表中列出的任一個(gè)值一個(gè)變量都可取該枚舉表中列出的任一個(gè)值 l 整數(shù)值不能直接賦給枚舉變量,如需整數(shù)值不能直接賦給枚舉變量,如需要將整數(shù)賦值給枚舉變量,應(yīng)進(jìn)行強(qiáng)要將整數(shù)賦值給枚舉變量,應(yīng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換。制類型轉(zhuǎn)換。l 在直接輸出某個(gè)枚舉變量的值時(shí),所在直接輸出某個(gè)枚舉變量的值時(shí),所顯示的是枚舉符的整型值而不是枚舉顯示的是枚舉符的整型值而不是枚舉類型的枚舉符,若要輸出枚舉符則需類型的枚舉符,若要輸出枚舉符則需要編程實(shí)現(xiàn)。要編程實(shí)現(xiàn)。枚舉類型應(yīng)用說明

50、:枚舉類型應(yīng)用說明:如如: d1=(weekday)6;【例】【例】 一個(gè)描述三種顏色的枚舉類型實(shí)例一個(gè)描述三種顏色的枚舉類型實(shí)例#includemain() enum colors Red,White,Black; colors c1, c2, c; c1=White; c2=(colors)2; coutc1 c2endl; for(c=Red;c=Black;c=(colors)(int)c+1) switch(c) case Red: coutRedendl;break; case White: coutWhiteendl;break; case Black: coutBlackend

51、l;break; 程序的運(yùn)行結(jié)果:程序的運(yùn)行結(jié)果:1 2RedWhiteBlack5.4 5.4 類型定義類型定義用用typedeftypedef聲明一個(gè)新的類型名來代替已有的類型名。聲明一個(gè)新的類型名來代替已有的類型名。typedef int INTEGERtypedef int INTEGER;/指定用標(biāo)識(shí)符指定用標(biāo)識(shí)符INTEGERINTEGER代表代表intint類型類型typedef float REALtypedef float REAL;/指定用指定用REALREAL代表代表floatfloat類型類型 int i,j; int i,j; float a,b; float a,b

52、; INTEGER i,j INTEGER i,j; REAL a,b; REAL a,b;也可以聲明結(jié)構(gòu)體類型: typedeftypedef struct struct /在在structstruct之前用之前用typedeftypedef,表示是聲明新名,表示是聲明新名 int month; int month; int day; int day; int year; int year;DATEDATE; /注意注意DATEDATE是新類型名,而不是結(jié)構(gòu)體變量名是新類型名,而不是結(jié)構(gòu)體變量名 所聲明的新類型名所聲明的新類型名DATEDATE代表上面指定的一個(gè)結(jié)代表上面指定的一個(gè)結(jié)構(gòu)體類型

53、。這樣就可以用構(gòu)體類型。這樣就可以用DATEDATE定義變量:定義變量:DATE birthday; / birthday為上述結(jié)構(gòu)體類型DATE *p; /p為指向此結(jié)構(gòu)體類型數(shù)據(jù)的指針 typedef int NUM100 typedef int NUM100;/聲明NUM為整型數(shù)組類型,包含100個(gè)元素NUM nNUM n; /定義n為包含100個(gè)整型元素的數(shù)組 typedef char typedef char * *STRINGSTRING; /聲明STRING為字符指針類型STRING p,s10STRING p,s10;/p為字符指針變量,s為指針數(shù)組(有10個(gè)元素) typedef int ( typedef int (* *POINTER)( )POINTER)( ) /聲明POINTER為指向函數(shù)的指針類型,函數(shù)返回整型值的指針類型,函數(shù)返回整型值POINTER p1POINTER p1,p2;p2; / p1,p2為POINTER類型的指針變量o #include o using namespa

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論