c++4自定義數(shù)據(jù)類型信息學競賽、C++編程初學者_第1頁
c++4自定義數(shù)據(jù)類型信息學競賽、C++編程初學者_第2頁
c++4自定義數(shù)據(jù)類型信息學競賽、C++編程初學者_第3頁
c++4自定義數(shù)據(jù)類型信息學競賽、C++編程初學者_第4頁
c++4自定義數(shù)據(jù)類型信息學競賽、C++編程初學者_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、自定義數(shù)據(jù)類型目目 錄錄u結(jié)構(gòu)體類型結(jié)構(gòu)體類型u共用體類型共用體類型u枚舉類型枚舉類型u自定義類型自定義類型3結(jié)構(gòu)體類型結(jié)構(gòu)體類型5.1.1 5.1.1 結(jié)構(gòu)體的概念結(jié)構(gòu)體的概念 一個學生的信息有一個學生的信息有學號學號、姓名姓名、性別性別、年齡年齡、住址住址、成績成績等。等。 一個教師的信息有一個教師的信息有職工編號職工編號、姓名姓名、性別性別、年年齡齡、職稱職稱、工資工資等。等。 如何描述這些類型不同的相關(guān)數(shù)據(jù)?如何描述這些類型不同的相關(guān)數(shù)據(jù)?一種構(gòu)造類型數(shù)據(jù)一種構(gòu)造類型數(shù)據(jù) 結(jié)構(gòu)體結(jié)構(gòu)體由若干不同類型的數(shù)據(jù)項組成,由若干不同類型的數(shù)據(jù)項組成, 構(gòu)成結(jié)構(gòu)體的各個數(shù)據(jù)項稱為構(gòu)成結(jié)構(gòu)體的各個數(shù)

2、據(jù)項稱為結(jié)構(gòu)體成員結(jié)構(gòu)體成員。 struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 數(shù)據(jù)類型成員名數(shù)據(jù)類型成員名1; 數(shù)據(jù)類型成員名數(shù)據(jù)類型成員名2; : 數(shù)據(jù)類型成員名數(shù)據(jù)類型成員名n; 結(jié)構(gòu)體類型名是用戶定義的任何一個有效的標結(jié)構(gòu)體類型名是用戶定義的任何一個有效的標識符,它的作用就如同任何一個基本類型名,利用識符,它的作用就如同任何一個基本類型名,利用它能夠定義具有該結(jié)構(gòu)類型的變量或函數(shù);它能夠定義具有該結(jié)構(gòu)類型的變量或函數(shù);5.1.2 5.1.2 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型定義的形式結(jié)構(gòu)體類型定義的形式: :定義結(jié)構(gòu)體類定義結(jié)構(gòu)體類型的關(guān)鍵字型的關(guān)鍵字, ,不不能省略能省略注意分號不

3、要省略注意分號不要省略struct studentchar id7; /長度為7的字符數(shù)組id,表示學號 char name10; /長度為10的字符數(shù)組name,表示姓名 float score; /單精度實數(shù)類型score,表示入學分數(shù) ; /注意分號不要省略例:用結(jié)構(gòu)體類型來描述學生的學籍信息(學號、例:用結(jié)構(gòu)體類型來描述學生的學籍信息(學號、姓名和入學分數(shù))姓名和入學分數(shù))結(jié)構(gòu)體類型的特點總結(jié)如下:結(jié)構(gòu)體類型的特點總結(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

4、3)它屬于)它屬于C+C+語言的一種數(shù)據(jù)類型,與整型、實型語言的一種數(shù)據(jù)類型,與整型、實型相當。因此,定義它時不分配空間,只有用它定義變相當。因此,定義它時不分配空間,只有用它定義變量時才分配空間。量時才分配空間。 5.1.3 結(jié)構(gòu)體變量的定義這是這是C+C+語言中定義結(jié)構(gòu)體類型變量最常見語言中定義結(jié)構(gòu)體類型變量最常見的方式,一般語法格式如下:的方式,一般語法格式如下:struct struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 成員說明列表;成員說明列表; ;structstruct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 變量名;變量名;在C+中,一般可以省略struct studentchar id7; ch

5、ar name10; float score; ; struct student st1,st2;例:定義描述學生的學籍信息(學號、姓名和入學例:定義描述學生的學籍信息(學號、姓名和入學分數(shù))的變量分數(shù))的變量在C+中,一般寫成: student st1,st2;struct struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員說明列表;成員說明列表; 變量名表列;變量名表列;struct student char id7; char name20; float score; st1,st2; struct 成員說明列表; 變量名表列;注意注意:該方式?jīng)]有結(jié)構(gòu)體類該方式?jīng)]有結(jié)構(gòu)體類型名型名, ,這種形式雖然簡

6、這種形式雖然簡單,但不能在再次需單,但不能在再次需要定義該類型的變量要定義該類型的變量時,使用所定義的結(jié)時,使用所定義的結(jié)構(gòu)體類型。構(gòu)體類型。 struct char name10; char id7; float score; st1,st2;(1)(1)類型與變量是不同的概念,不要混淆。類型與變量是不同的概念,不要混淆。對結(jié)構(gòu)體變量來說,對結(jié)構(gòu)體變量來說,在定義時一般在定義時一般先定義一個結(jié)構(gòu)先定義一個結(jié)構(gòu)體類型,然后定義該類型的變量體類型,然后定義該類型的變量。在編譯時,是不。在編譯時,是不會為類型分配空間的,只為變量分配空間。會為類型分配空間的,只為變量分配空間。關(guān)于結(jié)構(gòu)體變量的幾點說

7、明關(guān)于結(jié)構(gòu)體變量的幾點說明: :(2)(2)結(jié)構(gòu)體變量的存儲空間結(jié)構(gòu)體變量的存儲空間 理論上理論上, ,是結(jié)構(gòu)體變量各成員所占是結(jié)構(gòu)體變量各成員所占內(nèi)存空間的總和內(nèi)存空間的總和。 例如例如: : 結(jié)構(gòu)體變量結(jié)構(gòu)體變量st1在內(nèi)存中占在內(nèi)存中占(7+10+4=217+10+4=21)個字節(jié))個字節(jié), ,但系統(tǒng)通常為一個但系統(tǒng)通常為一個結(jié)構(gòu)體變量分配整數(shù)倍大小的機器字長結(jié)構(gòu)體變量分配整數(shù)倍大小的機器字長(對(對32位機而言,一個字長占位機而言,一個字長占4個字節(jié)),個字節(jié)),所以,實際上系統(tǒng)為所以,實際上系統(tǒng)為st1分配了分配了24個字節(jié)的個字節(jié)的內(nèi)存空間。內(nèi)存空間。但一般情況下,對于結(jié)構(gòu)體類型變

8、量的內(nèi)但一般情況下,對于結(jié)構(gòu)體類型變量的內(nèi)存空間,只討論其理論值。存空間,只討論其理論值。結(jié)構(gòu)變量占實際內(nèi)存大小可用結(jié)構(gòu)變量占實際內(nèi)存大小可用 sizeof 運算:運算:sizeof(運算量運算量)struct student char id7; char name10; float score; st1; struct date int month;int day;int year;struct student int num; char name20; char sex; date birthday; char addr40;stu1,stu2; date是結(jié)構(gòu)體類型,birthday是d

9、ate類型的成員(3) 成員也可以是一個結(jié)構(gòu)體變量,即結(jié)構(gòu)體嵌套定義。5.1.4 結(jié)構(gòu)體變量的引用和初始化一、用結(jié)構(gòu)體變量名引用其成員一、用結(jié)構(gòu)體變量名引用其成員格式: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名struct date int month; int day; int year;struct student int num; char name20; char sex; date birthday; char addr40;stu1,stu2; stu1.num=20312; stu1.num表示引用結(jié)表示引用結(jié)構(gòu)體變量構(gòu)體變量stu1中的中的num成員成員5.1.4 結(jié)構(gòu)體變量的引

10、用和初始化注意:注意: 1. 1.如果成員本身也是一個結(jié)構(gòu)體類型,則要用如果成員本身也是一個結(jié)構(gòu)體類型,則要用若干個成員運算符若干個成員運算符, ,一級一級地找到最低一級的一級一級地找到最低一級的成員。成員。stu1.birthday.month=5stu1.birthday.month=5; 2. 2.對結(jié)構(gòu)體變量的成員可以像普通對結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算變量一樣進行各種運算 stu2.numstu1.num; stu1.birthday.day+;由于由于“.”.”運算符的優(yōu)先級最高,因此運算符的優(yōu)先級最高,因此stu1.birthday.day+; stu1.bir

11、thday.day+; 相當于相當于(stu1.birthday.day)+;(stu1.birthday.day)+;5.1.4 結(jié)構(gòu)體變量的引用和初始化struct date int month; int day; int year;struct student int num; char name20; char sex; date birthday; char addr40;stu1,stu2; 3. 3.屬于同一結(jié)構(gòu)體類型的各個成屬于同一結(jié)構(gòu)體類型的各個成員之間可以相互賦值員之間可以相互賦值。 stu2stu1; 4.不能將一個結(jié)構(gòu)體變量作為一不能將一個結(jié)構(gòu)體變量作為一個整體進行輸入

12、和輸出,只能對個整體進行輸入和輸出,只能對結(jié)構(gòu)體變量中的各個成員分別進結(jié)構(gòu)體變量中的各個成員分別進行輸入和輸出。行輸入和輸出。coutstu1; /錯誤錯誤cout成員名成員名 一個指向結(jié)構(gòu)體變量的一個指向結(jié)構(gòu)體變量的指針指針就是該變量所占據(jù)的內(nèi)存段的就是該變量所占據(jù)的內(nèi)存段的起始起始地址地址。如果要通過結(jié)構(gòu)體變量的指。如果要通過結(jié)構(gòu)體變量的指針來引用結(jié)構(gòu)體變量的成員,必須針來引用結(jié)構(gòu)體變量的成員,必須使用使用“-”運算符。運算符。p.x = 23.7; p.y=3.5 pt=&u;pt-x=12.2; pt-y=24.3;5.1.4 結(jié)構(gòu)體變量的引用和初始化“*指針變量指針變量”表示

13、指針變量表示指針變量所指對象,所以通過指向結(jié)構(gòu)體所指對象,所以通過指向結(jié)構(gòu)體的指針變量引用結(jié)構(gòu)體成員也可的指針變量引用結(jié)構(gòu)體成員也可寫成以下形式:寫成以下形式: (*指針變量指針變量).結(jié)構(gòu)體成員名結(jié)構(gòu)體成員名(*pt).x=12.2這里圓括號是必須的,因為運算符這里圓括號是必須的,因為運算符“* *”的優(yōu)先級低于運算符的優(yōu)先級低于運算符“.”.”。 5.1.4 結(jié)構(gòu)體變量的引用和初始化struct node float x,y;p, u, *pt; 結(jié)構(gòu)體變量結(jié)構(gòu)體變量.成員名。如成員名。如:stu.num (*p).成員名。如成員名。如:(*p).num p-成員名。如成員名。如:p-nu

14、m。 p-np-n p-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é)構(gòu)體成員的三種表示方法:結(jié)構(gòu)體成員的三種表示方法: 結(jié)構(gòu)體變量初始化的方式和數(shù)組類似,也是在定義后結(jié)構(gòu)體變量初始化的方式和數(shù)組類似,也是在定義后面用花括號括起來面用花括號括起來 struct Student int num; char name20; char sex; int age; float score; char addr30; student1=10001,Zhangin,

15、M,19,90.5,Shanghai;Student student2=10002,Wang Li“,F,20,98,Beijing; 也可以采取聲明類型與定義變量分開的形式,在定義變量時進行初始化5.1.4 結(jié)構(gòu)體變量的引用和初始化【例】結(jié)構(gòu)體變量的引用與初始化示例【例】結(jié)構(gòu)體變量的引用與初始化示例#includestruct student int num; char name10; char sex; float score; ;void main() student st1,st2=1001,Lin qiang,m,95.5,*p; p=&st1; /p指向結(jié)構(gòu)體變量指向結(jié)構(gòu)體

16、變量st1 st1=st2; coutst1.numendl; /輸出輸出st1中的中的num成員的值成員的值 coutnameendl; /輸出輸出p所指變量所指變量st1中的中的name成員的值成員的值 coutsexendl; /輸出輸出p所指變量所指變量st1中的中的sex成員的值成員的值 coutst1.scoreendl; /輸出輸出st1中的中的score成員的值成員的值運行結(jié)果如下:運行結(jié)果如下:1001Lin qiangm95.5 一個結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)一個結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如(如一個學生的學號、姓名、成績等數(shù)據(jù))。如果一個學生的學號、姓名、成績等數(shù)據(jù))

17、。如果有有10個學生的數(shù)據(jù)需要參加運算,顯然應該用個學生的數(shù)據(jù)需要參加運算,顯然應該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。數(shù)組,這就是結(jié)構(gòu)體數(shù)組。 結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組的結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組的不同之處在于:不同之處在于: 每個數(shù)組元素都是一個結(jié)構(gòu)體每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個成員項。類型的數(shù)據(jù),它們都分別包括各個成員項。5.1.5 5.1.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組struct student /聲明結(jié)構(gòu)體類型 int num;char name20;char sex;int age;float score;char addr30;student st

18、u3; /定義student類型的數(shù)組stu5.1.5 5.1.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組數(shù)組各元素在內(nèi)存中連續(xù)存放數(shù)組各元素在內(nèi)存中連續(xù)存放5.1.5 5.1.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組struct student int num; char name20; char sex; int age; float score; char addr30;stu3=10101,Li Lin,M,18,87.5,103 Beijing Road, 10102, Zhang Fun, M,19,99, 130 Shanghai Road, 10104, Wang Min,F,20,78.5, 1010,Zho

19、ngshan Road ;結(jié)構(gòu)體數(shù)組初始化的一般結(jié)構(gòu)體數(shù)組初始化的一般形式是在所定義的數(shù)組名形式是在所定義的數(shù)組名的后面加上的后面加上 =初值表列初值表列;5.1.5 5.1.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組設有設有3 3個候選人,最終只能有個候選人,最終只能有1 1人當選為領(lǐng)導。今有人當選為領(lǐng)導。今有1010個個人參加投票,從鍵盤先后輸入這人參加投票,從鍵盤先后輸入這1010個人所投的候選人的名個人所投的候選人的名字,要求最后輸出這字,要求最后輸出這3 3個候選人的得票結(jié)果。個候選人的得票結(jié)果。#include using namespace std;struct Person char name2

20、0; int count;5.1.5 5.1.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組void main( ) Person leader3=Li,0, Zhang,0, Sun,0; int i,j;char leader_name20; for(i=0;ileader_name; /先后輸入先后輸入10張票上所寫的姓名張票上所寫的姓名 for(j=0;j3;j+) /將票上姓名與將票上姓名與3個候選人的姓名比較個候選人的姓名比較 if(strcmp(leader_name,)=0) leaderj.count+; coutendl; for(i=0;i3;i+) /輸出輸出3個候選

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

22、。5.1.6 5.1.6 結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)#include #include struct student int num; char name8; float score3;void print(student stu);int main( ) student stu ; stu.num=12345; strcpy(,Li Fang ); stu.score0=67.5; stu.score1=89; stu.score2=78.5; print(stu); return 0;void print(student stu)coutstu.n

23、um stu.score0 stu.score1 stu.score2endl;【例5.3】有一個結(jié)構(gòu)體變量stu,包括學生學號、姓名和分數(shù)。要求在函數(shù)print中用傳值調(diào)用的方式將值輸出。#include struct student int num; char name20; float score3;stu=12345,Li Fung, 67.5,89,78.5; void print(Student *p);int main( ) student *pt=&stu; print(pt); /或或print(&stu); return 0;void pr

24、int(student *p) coutnum name score0 score1 score2 endl;【例5.3A】有一個結(jié)構(gòu)體變量stu,包括學生學號、姓名和分數(shù)。要求在函數(shù)print中用傳址調(diào)用的方式將值輸出。student *pt=&stu;print(pt); void print(student *p) #include #include struct student int num; char name20; float score3;stu=12345,Li Fung, 67.5,89,78.5; void print(student &stud);int

25、 main( ) student stu; print(stu); return 0;void print(student &stud) coutstud.num stud.score0 stud.score1 stud.score2endl;【例】有一個結(jié)構(gòu)體變量stu,包括學生學號、姓名和分數(shù)。要求在函數(shù)print中用引用調(diào)用的方式將值輸出。(1)用結(jié)構(gòu)體變量作實參和形參,程序直觀易懂,效率用結(jié)構(gòu)體變量作實參和形參,程序直觀易懂,效率不高;不高;(2)指針變量作為實參和形參,空間和時間的開銷都很指針變量作為實參和形參,空間和時間的開銷都很小,效率較高,但不如小,

26、效率較高,但不如(1)直觀。直觀。(3)實參是結(jié)構(gòu)體類型變量,而形參用結(jié)構(gòu)體類型的引實參是結(jié)構(gòu)體類型變量,而形參用結(jié)構(gòu)體類型的引用,虛實結(jié)合時傳遞的是地址,因而效率較高。它用,虛實結(jié)合時傳遞的是地址,因而效率較高。它兼有兼有(1)和和(2)的優(yōu)點。引用變量主要用作函數(shù)參數(shù),的優(yōu)點。引用變量主要用作函數(shù)參數(shù),它可以提高效率,而且保持程序良好的可讀性。它可以提高效率,而且保持程序良好的可讀性。 鏈表是最簡單也是最常用的一種動態(tài)數(shù)據(jù)結(jié)構(gòu)。它是對鏈表是最簡單也是最常用的一種動態(tài)數(shù)據(jù)結(jié)構(gòu)。它是對動態(tài)獲得的內(nèi)存進行組織的一種結(jié)構(gòu);不同于數(shù)組,數(shù)組存動態(tài)獲得的內(nèi)存進行組織的一種結(jié)構(gòu);不同于數(shù)組,數(shù)組存儲數(shù)據(jù)

27、時,必須事先定義固定的長度(即數(shù)組元素個數(shù))。儲數(shù)據(jù)時,必須事先定義固定的長度(即數(shù)組元素個數(shù))。5.1.7 鏈表 鏈表的結(jié)點是結(jié)構(gòu)體變量,它可包含若干成員,其中有鏈表的結(jié)點是結(jié)構(gòu)體變量,它可包含若干成員,其中有些成員可以是任何類型,如基本類型、數(shù)組類型、結(jié)構(gòu)體類些成員可以是任何類型,如基本類型、數(shù)組類型、結(jié)構(gòu)體類型等,一般用于存儲數(shù)據(jù)元素的信息,稱之為數(shù)據(jù)域;另一型等,一般用于存儲數(shù)據(jù)元素的信息,稱之為數(shù)據(jù)域;另一些成員是指針類型,是用來存儲與之相連的結(jié)點的地址,稱些成員是指針類型,是用來存儲與之相連的結(jié)點的地址,稱之為指針域之為指針域,單向鏈表的結(jié)點只包含一個這樣的指針成員。單向鏈表的結(jié)點

28、只包含一個這樣的指針成員。 一、鏈表的概念一、鏈表的概念下面是一個單向鏈表結(jié)點的類型說明:下面是一個單向鏈表結(jié)點的類型說明:struct node int data; struct node *next; /存放下一結(jié)點的地址;datanextdata成員用于存成員用于存儲一個整數(shù)儲一個整數(shù)next成員是指針類成員是指針類型的,它指向鏈表型的,它指向鏈表的下一個結(jié)點的下一個結(jié)點 每一個結(jié)點都屬于每一個結(jié)點都屬于node類型,在它的成員類型,在它的成員next中存放下一個結(jié)點的地址,程序設計者不中存放下一個結(jié)點的地址,程序設計者不必知道各結(jié)點的具體地址,必知道各結(jié)點的具體地址,只要保證能將下一只

29、要保證能將下一個結(jié)點的地址放到前一結(jié)點的成員個結(jié)點的地址放到前一結(jié)點的成員next中即可。中即可。鏈表有一個鏈表有一個“頭指針頭指針”變量,圖中以變量,圖中以head表示表示二、內(nèi)存動態(tài)管理運算符二、內(nèi)存動態(tài)管理運算符v 申請一個存儲指定數(shù)據(jù)類型的值的內(nèi)存空間申請一個存儲指定數(shù)據(jù)類型的值的內(nèi)存空間 = new ();v 為數(shù)組申請內(nèi)存:為數(shù)組申請內(nèi)存: = new ; 內(nèi)存空間申請內(nèi)存空間申請new 功能功能: : 根據(jù)指定數(shù)據(jù)類型的大小申請一塊適當?shù)膭討B(tài)存根據(jù)指定數(shù)據(jù)類型的大小申請一塊適當?shù)膭討B(tài)存儲區(qū),并返回指向該動態(tài)存儲空間的起始地址;若申請不儲區(qū),并返回指向該動態(tài)存儲空間的起始地址;若申

30、請不成功,則會返回成功,則會返回NULL值。值。 一般將一般將new操作的結(jié)果賦給具有相應數(shù)據(jù)類型的指針變量。操作的結(jié)果賦給具有相應數(shù)據(jù)類型的指針變量。 2. 內(nèi)存空間釋放內(nèi)存空間釋放delete使用使用newnew運算符動態(tài)分配給用戶的存儲空間,可以通過使用運算符動態(tài)分配給用戶的存儲空間,可以通過使用deletedelete運算符重新歸還給系統(tǒng),若沒有使用運算符重新歸還給系統(tǒng),若沒有使用deletedelete釋放該內(nèi)釋放該內(nèi)存區(qū)域,則只有等到整個程序運行結(jié)束才被系統(tǒng)重新自動回存區(qū)域,則只有等到整個程序運行結(jié)束才被系統(tǒng)重新自動回收。收。v 用于釋放先前申請到的內(nèi)存空間用于釋放先前申請到的內(nèi)存

31、空間:delete ;v 用于釋放先前為數(shù)組申請到的空間用于釋放先前為數(shù)組申請到的空間: delete ;二、內(nèi)存動態(tài)管理運算符二、內(nèi)存動態(tài)管理運算符例如:float *pf=new float(55.8);int *pa=new int20;int m;int *pi=&m;delete pf; /釋放pf所指的動態(tài)內(nèi)存空間delete pi; /錯誤,pi所指的內(nèi)存空間不是new分配的,不能用delete釋放delete pa; /釋放pa所指的動態(tài)數(shù)組內(nèi)存空間delete只能釋放用只能釋放用new申請的動態(tài)內(nèi)存空間。申請的動態(tài)內(nèi)存空間。二、內(nèi)存動態(tài)管理運算符二、內(nèi)存動態(tài)管理運算符

32、三、鏈表的基本操作三、鏈表的基本操作 鏈表的基本操作包括建立鏈表、鏈表的插入、鏈表的基本操作包括建立鏈表、鏈表的插入、刪除、輸出和查找等。刪除、輸出和查找等。 1. 1. 建立鏈表建立鏈表 所謂建立鏈表是指一個一個地輸入各結(jié)點數(shù)所謂建立鏈表是指一個一個地輸入各結(jié)點數(shù)據(jù),并建立起各結(jié)點前后相鏈的關(guān)系。據(jù),并建立起各結(jié)點前后相鏈的關(guān)系。 下面通過一個例子來說明如何建立一個鏈表。下面通過一個例子來說明如何建立一個鏈表。 兩種方式:插鏈表尾、插鏈表頭插鏈表尾:插鏈表尾:是指新插入的結(jié)點總是放在鏈表尾部。一般地,鏈表是在一個空鏈表的基礎上逐步插入新結(jié)點而成的,空鏈表是指沒有一個結(jié)點,此時鏈表的頭指針為空

33、。 用插表尾法建立鏈表的過程如下:用插表尾法建立鏈表的過程如下:1) 建立空鏈表,head = last =NULL; head為表頭,指向空,表示鏈表為空, last是表尾指針。2) 產(chǎn)生新結(jié)點p,對新結(jié)點的數(shù)據(jù)域和指針域賦值。由于新插入的結(jié)點總是表尾結(jié)點,則它的后繼結(jié)點為空。三、鏈表的基本操作三、鏈表的基本操作3) 將p結(jié)點插入鏈表,如果head 為NULL,則 head = p; 新結(jié)點作為表頭,這時鏈表只有一個結(jié)點,否則,last-next=p; 即插入鏈尾操作。4) last = p;表示表尾指針last指向新結(jié)點p。5) 循環(huán)執(zhí)行2)4),可繼續(xù)建立新結(jié)點直到結(jié)束為止 三、鏈表的基

34、本操作三、鏈表的基本操作struct node int data; struct node *next;void creat(node * &head, int n)/建立以head指針的具有n個結(jié)點的鏈表,head為引用參數(shù),/以使對應的實參為該鏈表的表頭指針 if(n0) coutn值無效endl; exit(1); if(n=0)head=NULL; return; /置表頭指針為空后返回 cout從鍵盤上輸入n個整數(shù)x; p-data=x; p-next=NULL; head=last=p;if(n=1) return; for(i=1;inext=p; cinx; p-dat

35、a=x; last=p; p-next=NULL; 2.鏈表的輸出鏈表的輸出要依次輸出鏈表中各結(jié)點的數(shù)據(jù)比較容易處理。首先要知道鏈表頭結(jié)點的地址,也就是head的值,然后設一個指針變量p,先指向第一個結(jié)點,輸出p所指結(jié)點的數(shù)據(jù)域的值,然后使p后移一個結(jié)點,再輸出其數(shù)據(jù)域的值;依鏈表順序而行,依次輸出相應結(jié)點數(shù)據(jù)域的值,直到鏈表的尾結(jié)點。void traverse (node *head) node *p; p=head; while(p) coutdatanext; /使p指針移動到下一個結(jié)點 coutnext; (移動指針p,繼續(xù)找)3) 如果找到了刪除結(jié)點p,如果 p= = head 刪除

36、的是頭結(jié)點,則 head = head-next ; /*刪除頭結(jié)點*/ else p1-next = p-next ; /*刪除p指向的結(jié)點*/4)delete p; 釋放刪除結(jié)點的內(nèi)存空間。void erase(node* &head,int no) node *p,*p1; p=p1=head; if (head=NULL) cout 鏈表為空,無結(jié)點可刪data=no) head=p-next; delete p; 刪除鏈表中一個結(jié)點的函數(shù)刪除鏈表中一個結(jié)點的函數(shù)erase如下:如下:else while(p-data!=no) p1=p; p=p-next; if(p=NUL

37、L) cout鏈表中沒有要刪除的結(jié)點next=p-next; delete p; cout刪除結(jié)點成功-”運算符來引用共用體變量的運算符來引用共用體變量的成員。成員。 引用共用體變量的引用共用體變量的i、ch、f成員,成員,通過變量通過變量a可以表示為:可以表示為: a.i, a.ch, a.f通過指針通過指針px可以表示為:可以表示為: px-i, px-ch, px-f(*px).i, (*px).ch, (*px).f注意注意: : 不能直接用不能直接用共用體變量名共用體變量名進行輸入輸出,而只能對共用進行輸入輸出,而只能對共用體變量的體變量的具體成員具體成員進行輸入輸出。進行輸入輸出。

38、 couta; 錯誤cout a.i; 正確 一個共用體變量在某一時刻只能存儲其中的一個成員值,一個共用體變量在某一時刻只能存儲其中的一個成員值,當對一個新的成員賦值后,原有成員的值就被覆蓋掉。共當對一個新的成員賦值后,原有成員的值就被覆蓋掉。共用體變量中存儲的值就是最后賦給它的成員的值。用體變量中存儲的值就是最后賦給它的成員的值。 a.i=278; a.ch=D; a.f=5.78;共用體變量中最后存儲的值是5.78 C+允許在兩個同類型的共用體變量之間賦值允許在兩個同類型的共用體變量之間賦值 如果a、b均是已定義為上面的union data類型的變量,則執(zhí)行b=a;后,b的內(nèi)容與a完全相同

39、【例】 寫出下列程序的執(zhí)行結(jié)果#includevoid main() union ex int a; char ch; ; ex m; m.a=48; /m中存儲一個整數(shù)48 cout”m.a=”m.aendl; m.a=65; /m中存儲一個整數(shù)65,原來存儲的數(shù)被覆蓋 cout”m.a=”m.a” ”m.ch=”m.chendl; 程序運行結(jié)果如下:m.a=48m.a=65 m.ch=A5.2.3 共用體與結(jié)構(gòu)體的聯(lián)合使用 共用體雖然可以有多個成員,但在某一時刻,只共用體雖然可以有多個成員,但在某一時刻,只能使用其中的一個成員。共用體一般不單獨使用,通能使用其中的一個成員。共用體一般不單獨

40、使用,通常作為結(jié)構(gòu)體的成員,這樣結(jié)構(gòu)體可根據(jù)不同情況存常作為結(jié)構(gòu)體的成員,這樣結(jié)構(gòu)體可根據(jù)不同情況存儲不同類型的數(shù)據(jù)。儲不同類型的數(shù)據(jù)。 【例【例5.6】 輸入輸入15個學生或教師的數(shù)據(jù),并輸出。學生個學生或教師的數(shù)據(jù),并輸出。學生和教師的數(shù)據(jù)相同的部分有:姓名、編號和身份;但也和教師的數(shù)據(jù)相同的部分有:姓名、編號和身份;但也有不同的部分:學生需要保存有不同的部分:學生需要保存3門課程的分數(shù),分數(shù)用門課程的分數(shù),分數(shù)用浮點數(shù)表示,教師則保存工作情況簡介,用字符串表示。浮點數(shù)表示,教師則保存工作情況簡介,用字符串表示。對于教師和學生的不同部分可以用共用體描述。對于教師和學生的不同部分可以用共用體

41、描述。union condition float score3; char situation80;struct person char name20; char num10; char kind; condition state;personnel15;結(jié)構(gòu)體的成員state為共用體,根據(jù)kind的值來決定state是存儲3門課程的分數(shù),還是存儲教師工作情況簡介。例如,教師的kind為字符t,學生的kind為字符s。 5.2.3 共用體與結(jié)構(gòu)體的聯(lián)合使用#include#includeunion condition float score3; char situation80;struct

42、people char name10; char num7; char kind; 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; 程序中向共用體輸入什么數(shù)據(jù)是根據(jù)kind成員的值來

43、確定的。kind的值為t則輸入字符串到personi.state.situation,否則輸入3個浮點數(shù)到personi.state.score j。 coutThe Result is:endl;for(i=0;i3;i+) personi.num personi.kind ; if(personi.kind=t) coutpersoni.state.situationendl; else for(j=0;j3;j+) coutpersoni.state.scorej ; coutendl; 5.3 5.3 枚舉類型枚舉類型所謂所謂“枚舉枚舉”是指將變量的值

44、一一列舉出來,是指將變量的值一一列舉出來,變量的值只能在列舉出來的值的范圍內(nèi)。變量的值只能在列舉出來的值的范圍內(nèi)。用戶通常利用枚舉類型定義程序中需要使用用戶通常利用枚舉類型定義程序中需要使用的一組相關(guān)的符號常量,比如一周是由星期一到的一組相關(guān)的符號常量,比如一周是由星期一到星期日星期日7個符號常量組成的集合。個符號常量組成的集合。 枚舉類型定義的一般形式:枚舉類型定義的一般形式: enum 枚舉名枚舉名 枚舉常量取值表枚舉常量取值表 ;例如:例如:enum color1 blue, green, red ;enum weekday Sun, Mon, Tue, Wed, Thu, Fri, S

45、at ;枚舉類型實際上是一個整型符號常量的集合,枚舉類型實際上是一個整型符號常量的集合,每一個枚舉符都對應著一個整數(shù)值每一個枚舉符都對應著一個整數(shù)值 5.3 5.3 枚舉類型枚舉類型枚舉符號常量的整型值:枚舉符號常量的整型值: l隱式定義:隱式定義: 按照類型定義時枚舉常量列舉的順序分別代表按照類型定義時枚舉常量列舉的順序分別代表0、1、2、等整型值,依次類推。等整型值,依次類推。 例如:例如: enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ;Sun,MonSat的整型值依次為:,的整型值依次為:,5.3 5.3 枚舉類型枚舉類型l顯式定義:顯式

46、定義:在定義類型的同時指定枚舉常量的值,其中如有未指定值在定義類型的同時指定枚舉常量的值,其中如有未指定值的枚舉常量,則根據(jù)前面的枚舉常量的值依次遞增的枚舉常量,則根據(jù)前面的枚舉常量的值依次遞增1。例如:例如: enum weekday Sun=, Mon=1, Tue, Wed, Thu, Fri, Sat ;Sun,MonSat的整型值依次為:的整型值依次為:7,5.3 5.3 枚舉類型枚舉類型枚舉符號常量的整型值:枚舉符號常量的整型值: 例如:例如: enum weekday Sun=, Mon=1, Tue, Wed, Thu, Fri, Sat ; enum weekday d1,d

47、2;枚舉類型變量定義的三種形式:枚舉類型變量定義的三種形式: enum 枚舉名枚舉名 枚舉變量名表枚舉變量名表; ; enum 枚舉名枚舉名 枚舉常量取值表枚舉常量取值表 枚舉變量表枚舉變量表; ; enum 枚舉常量取值表枚舉常量取值表 枚舉變量表枚舉變量表; ;將將d1,d2定義成枚舉類型定義成枚舉類型weekday的變量,每的變量,每一個變量都可取該枚舉表中列出的任一個值一個變量都可取該枚舉表中列出的任一個值 5.3 5.3 枚舉類型枚舉類型枚舉類型應用說明:枚舉類型應用說明:l整數(shù)值不能直接賦給枚舉變量,如需整數(shù)值不能直接賦給枚舉變量,如需要將整數(shù)賦值給枚舉變量,應進行強要將整數(shù)賦值給枚舉變量,應進行強制類型轉(zhuǎn)換。制類型轉(zhuǎn)換。l在直接輸出某個枚舉變量的值時,所顯示的是在直接輸出某個枚舉變量的值時,所顯示的是枚舉符的整型值而不是枚舉類型的枚舉符,若枚舉符的整型值而不是枚舉類型的枚舉符,若要輸出枚舉符則需要編程實現(xiàn)。要輸出枚舉符則需要編程實現(xiàn)。如: d1=(weekday)6;5.3 5.3 枚舉類型枚舉類型#includemain() enum colors Red,White,Black; colors c1, c2, c; c1=White; c2=(colors)2; coutc1 c2endl; for(c=Red;c=Black;c=(colors)(

溫馨提示

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

最新文檔

評論

0/150

提交評論