版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C++面對對象程序設(shè)計授課老師:C++面對對象程序設(shè)計授課老師:1第8章復(fù)雜數(shù)據(jù)類型
本章要點8.1枚舉類型的定義及應(yīng)用8.2結(jié)構(gòu)體的定義及應(yīng)用8.3共用體的定義及應(yīng)用8.4鏈表8.5類型定義第8章復(fù)雜數(shù)據(jù)類型
本章要點2
本章要點枚舉類型的定義及應(yīng)用結(jié)構(gòu)體的定義及應(yīng)用共用體的定義及應(yīng)用用typedef定義類型名本章要點38.1枚舉類型在程序設(shè)計中,有時會用到由若干個有限數(shù)據(jù)元素組成的集合,如一周內(nèi)的星期一到星期日7個數(shù)據(jù)元素組成的集合,程序中某個變量取值僅限于集合中的元素。此時,可將這些數(shù)據(jù)集合定義為枚舉類型。因此,枚舉類型是某類數(shù)據(jù)可能取值的集合,如一周內(nèi)星期可能取值的集合為:{Sun,Mon,Tue,Wed,Thu,F(xiàn)ri,Sat}該集合可定義為描述星期的枚舉類型,該枚舉類型共有7個元素,因而用枚舉類型定義的枚舉變量只能取集合中的某一元素值。由于枚舉類型是導(dǎo)出數(shù)據(jù)類型,因此,必須先定義枚舉類型,然后再用枚舉類型定義枚舉型變量。8.1枚舉類型在程序設(shè)計中,有時會用到由若干個有限數(shù)據(jù)元素組48.1.1枚舉類型的定義
枚舉類型的一般定義格式為:enum<枚舉類型名>{<枚舉元素表>};其中:關(guān)鍵字enum表示定義的是枚舉類型,枚舉類型名由標(biāo)識符組成。枚舉元素為常量時定義形式如下:enum<枚舉類型名>{<枚舉常量1,枚舉常量2,…,枚舉常量n};例如:enumseasons{spring,summer,autumn,winter};//定義枚舉類型enumseasons又如:enumcolors{red,blue,green,yellow,white,black};//定義枚舉類型enumcolors8.1.1枚舉類型的定義
枚舉類型的一般定義格式為:5說明:
(1)enum是定義枚舉類型的關(guān)鍵字,枚舉類型名應(yīng)符合標(biāo)識符定義的規(guī)則,enum和枚舉類型名構(gòu)成枚舉類型的類型名。(2)花括號{}中的值是該枚舉類型所有可能的枚舉常量列表,定義中枚舉常量不能同名。在系統(tǒng)默認的情況下,枚舉常量值順序為0,l,2,…,即第一個枚舉常量的值為0,其后枚舉常量的值是前一個枚舉常量的值加1。例如示例中,spring,summer,autumn,winter的值分別為0,1,2,3,而red,blue,green,yellow,white,black的值分別為0,1,2,3,4,5。(3)也可以在定義時,由用戶自行設(shè)定每一個枚舉常量的值。例如:enumseasons{spring=4,summer=1,autumn,winter};spring的值為4,summer的值為1,其后枚舉常量的值為前一個枚舉常量的值加1,順序為2,3。(4)不能給已經(jīng)定義過的枚舉常量賦值。例如:spring=1;是錯誤的,因為枚舉常量是常量而不是變量。說明:
(1)enum是定義枚舉類型的關(guān)鍵字,枚舉類型名應(yīng)符68.1.2枚舉類型變量的定義定義枚舉類型變量有三種方法;即:先定義類型后定義變量,定義類型的同時定義變量,直接定義變量,現(xiàn)介紹如下:1.先定義類型后定義變量格式:enum<枚舉類型名><變量1>〔,<變量2>,…,<變量n>〕2.定義類型的同時定義變量格式:enum<枚舉類型名>{<枚舉元素表>}<變量1>〔,<變量2>,…,<變量n>〕;3.直接定義枚舉變量格式:enum{<枚舉元素表>}<變量1>〔,<變量2>,…,<變量n>〕;8.1.2枚舉類型變量的定義定義枚舉類型變量有三種方法;即:78.1.3枚舉類型變量的引用
(1)枚舉變量的取值范圍只能是其枚舉類型定義時所枚舉的各個枚舉常量,所以枚舉常量可賦值給枚舉變量如“c1=white;c2[3]=green;”等。(2)枚舉類型變量不能直接被賦予一個整數(shù)數(shù)值。如“c1=4;”是錯誤的,因為c1是枚舉類型變量,4是整型常量,兩者的類型不同。經(jīng)過強制類型轉(zhuǎn)換后,是可以賦值的,如“c1=(enumcolors)4;”。(3)同類型的枚舉變量間、枚舉常量間、枚舉變量與枚舉常量間可以進行算術(shù)運算和關(guān)系運算等。例如:if(c1>red)…。(4)枚舉變量也有作用域范圍,其含義與一般變量相同。(5)枚舉變量和枚舉常量可以作函數(shù)參數(shù),函數(shù)的返回值也可以是枚舉類型。8.1.3枚舉類型變量的引用
(1)枚舉變量的取值范圍只能是8先定義描述6種顏色的枚舉類型colors,然后再用該枚舉類型定義枚舉數(shù)組,任意輸入6個顏色號,轉(zhuǎn)換成對應(yīng)的顏色枚舉量后輸入到枚舉數(shù)組中,最后輸出枚舉數(shù)組中對應(yīng)的顏色#include"stdafx.h"#include"stdio.h"#include"iostream.h"#include"stdlib.h"http://使用exit(0)函數(shù)時必須包含stdlib.h頭文件enumcolors{red,blue,green,black,white,yellow};//定義有六種顏色元素的枚舉類型colorsvoidmain(){ colorscolor[6];//定義枚舉類型數(shù)組color[6] intj,n; cout<<"0:red,1:blue,2:green,3:black,4:white,5:yellow"<<endl; cout<<"請輸入六個顏色號:"<<endl;先定義描述6種顏色的枚舉類型colors,然后再用該枚舉類型9for(j=0;j<6;j++){ cin>>n; if(n<0||n>5) { cout<<"輸入顏色值出錯,請重新輸入!"<<endl; exit(0); } else switch(n)//將顏色號轉(zhuǎn)換成顏色元素存入數(shù)組 { case0: color[j]=red; break; case1: color[j]=blue; break;for(j=0;j<6;j++)10case2: color[j]=green; break; case3: color[j]=black; break; case4: color[j]=white; break; case5: color[j]=yellow; break; } }case11for(j=0;j<6;j++)//循環(huán)六次輸出數(shù)組元素對應(yīng)的顏色 { switch(color[j]) { casered: cout<<"red"; break; caseblue: cout<<"blue"; break; casegreen: cout<<"green"; break; caseblack: cout<<"black"; break;for(j=0;j<6;j++)12casewhite: cout<<"white"; break; caseyellow: cout<<"yellow"; break; } cout<<'\t'; } cout<<endl; getchar();}casewhite:13程序執(zhí)行時,屏幕提示:0:red,1:blue,2:green,3:black,4:white,5:yellow請輸入6個顏色號:012345<Enter>屏幕輸出:redbluegreenblackwhiteyellow程序執(zhí)行時,屏幕提示:0:red,1:blue,2:gree148.2結(jié)構(gòu)體類型到目前為止,所見到的數(shù)據(jù)類型都只包含一種類型信息,即使是多個元素的數(shù)組。但是,信息的邏輯關(guān)系,要求各個數(shù)據(jù)類型組合在一起考慮會更加方便。結(jié)構(gòu)就能表達這種數(shù)據(jù)聚集。另外,結(jié)構(gòu)是實現(xiàn)鏈表結(jié)構(gòu)的理想表現(xiàn)手段。
8.2結(jié)構(gòu)體類型到目前為止,所見到的數(shù)據(jù)類型都只包含一種類型158.2.1結(jié)構(gòu)體類型的定義
對于復(fù)雜的數(shù)據(jù),即包含有一個或多個數(shù)據(jù)項,各數(shù)據(jù)項可以具有相同或不同的類型,并且每個數(shù)據(jù)項的含義不同,這就無法由預(yù)定義類型進行整體描述,必須由用戶定義的類型來描述。如要描述一個人的記錄數(shù)據(jù),假定它包含姓名、性別、年齡和工資這四個數(shù)據(jù)項,則可以使用一種結(jié)構(gòu)體類型來描述。
設(shè)該結(jié)構(gòu)體類型的名字用標(biāo)識符Person表示,其中的姓名數(shù)據(jù)項用標(biāo)識符name表示,對應(yīng)類型為字符串型;性別數(shù)據(jù)項用標(biāo)識符sex表示,對應(yīng)類型為布爾(邏輯)型,假定分別用布爾常量true和false表示男和女;年齡數(shù)據(jù)項用標(biāo)識符age表示,對應(yīng)類型為整型;工資數(shù)據(jù)項用標(biāo)識符pay表示,對應(yīng)類型為浮點型。
8.2.1結(jié)構(gòu)體類型的定義
對于復(fù)雜的數(shù)據(jù),即包含有一個或多16結(jié)構(gòu)體類型可定義為:structPerson{charname[10];//姓名boolsex;//性別intage;//年齡floatpay;//工資};結(jié)構(gòu)體類型可定義為:178.2.2結(jié)構(gòu)體變量的定義1.結(jié)構(gòu)體變量的定義(1)先定義類型后定義變量。格式:〔存儲類型〕<結(jié)構(gòu)體類型名><變量名1>〔,<變量名2>,…,<變量名n>〕;(2)定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。格式:struct<結(jié)構(gòu)體類型名>{<成員列表>}<變量名1>〔,<變量名2>,…〕;(3)直接定義結(jié)構(gòu)體變量。格式:struct{<成員列表>}<變量名1>〔,<變量名2>,…〕;
8.2.2結(jié)構(gòu)體變量的定義1.結(jié)構(gòu)體變量的定義182.結(jié)構(gòu)體變量的初始化
與數(shù)組類似,在定義結(jié)構(gòu)體變量時可進行初始化。例如:studentstu1={1001,"Zhang",90,95,80};studentstu2[3]={{1001,"Zhang",90,95,80},{1002,"Li",95,80,85},{1003,"Wang",95,85,90}};2.結(jié)構(gòu)體變量的初始化
與數(shù)組類似,在定義結(jié)構(gòu)體變量時可進行198.2.3結(jié)構(gòu)體變量的引用
對結(jié)構(gòu)體變量的引用,一般情況下是通過對其成員的引用來實現(xiàn)的。1.引用結(jié)構(gòu)體變量中的一個成員引用結(jié)構(gòu)體變量成員的一般形式是:<結(jié)構(gòu)體變量名>.<成員名>其中圓點“.”稱為成員運算符,用于引用一個結(jié)構(gòu)體變量中的某個成員說明:(1)如果成員本身又是一個結(jié)構(gòu)體類型,則必須使用多個成員運算符,采取逐級引用的方式,直到引用最低一級的成員(2)結(jié)構(gòu)體變量的成員可以像同類型的簡單變量一樣進行其數(shù)據(jù)類型允許的各種運算2.引用結(jié)構(gòu)體變量在某些情況下允許對結(jié)構(gòu)體變量進行整體操作3.結(jié)構(gòu)體變量的輸入和輸出C++不允許把一個結(jié)構(gòu)體變量作為一個整體進行輸入和輸出8.2.3結(jié)構(gòu)體變量的引用
對結(jié)構(gòu)體變量的引用,一般情況下是208.2.4結(jié)構(gòu)體數(shù)組
同定義結(jié)構(gòu)體變量相似,定義結(jié)構(gòu)體數(shù)組的方法有以下三種:(1)間接定義。即先定義結(jié)構(gòu)體類型,再用它定義結(jié)構(gòu)體數(shù)組.(2)直接定義。即在定義結(jié)構(gòu)體類型的同時,定義結(jié)構(gòu)體數(shù)組。8.2.4結(jié)構(gòu)體數(shù)組
同定義結(jié)構(gòu)體變量相似,定義結(jié)構(gòu)體數(shù)組的218.3共用體類型
共用體類型,是指幾個不同(或相同)數(shù)據(jù)類型的數(shù)據(jù)項共同使用同一段內(nèi)存單元的數(shù)據(jù)結(jié)構(gòu)8.3.1共用體類型的定義共用體類型定義的一般形式是:union<共用體名>{<成員類型名1><成員名1>;<成員類型名2><成員名2>;┇┇<成員類型名n><成員名n>;};注意:同結(jié)構(gòu)體類型定義的方法相似,只是將關(guān)鍵字由struct換成了union8.3共用體類型
共用體類型,是指幾個不同(或相同)數(shù)據(jù)類228.3.2共用體變量的定義
同結(jié)構(gòu)體變量定義的方法相似,共用體變量的定義有直接定義、間接定義和無名定義三種形式。(1)直接定義。(2)間接定義(3)無名定義
8.3.2共用體變量的定義
同結(jié)構(gòu)體變量定義的方法相似,共用238.3.3共用體變量的引用
一般情況下不直接引用共用體變量,而是引用共用體變量的某個成員。與結(jié)構(gòu)體變量成員的引用一樣,共用體變量成員的引用(假定已經(jīng)執(zhí)行“uniondata1*p=&u;”語句)也有以下三種方式:(1)共用體變量名.成員名,如u.ch或u.i或u.d;(2)(*指針變量名).成員名,如(*p).ch或(*p).i或(*p).d;(3)指針變量名->成員名,如p->ch或p->i或p->d。8.3.3共用體變量的引用
一般情況下不直接引用共用體變量,24說明:(1)共用體變量中,可以包含若干個成員及若干種類型,但共用體成員不能同時使用。在每一時刻,只有一個成員及一種類型起作用,所以不能同時引用多個成員及多種類型。(2)共用體變量中起作用的成員值是最后一次存放的成員值,即共用體變量所有成員共用同一段內(nèi)存單元,后來存放的值將原先存放的值覆蓋,故只能使用最后一次給定的成員值。(3)共用體變量的地址和它的各個成員的地址相同.(4)不能企圖引用共用體變量名來得到某成員的值(5)共用體類型和結(jié)構(gòu)體類型可以相互嵌套,即結(jié)構(gòu)體可以出現(xiàn)在共用體類型中,共用體類型也可以出現(xiàn)在結(jié)構(gòu)體類型的定義中(6)C++允許在兩個同類型的共用體變量之間賦值。(7)共用體變量不能作函數(shù)參數(shù),函數(shù)的返回值也不能是共用體類型。說明:(1)共用體變量中,可以包含若干個成員及若干種類型,但258.3.4共用體類型的特點
共用體類型的特點就是多個相同數(shù)據(jù)類型或不同數(shù)據(jù)類型的數(shù)據(jù)項共同使用同一段內(nèi)存單元。在內(nèi)存中占用的字節(jié)數(shù)可能不同,但都是從同一地址開始存放,并且在同一時刻只能存放一個數(shù)據(jù)項。8.3.4共用體類型的特點
共用體類型的特點就是多個相同數(shù)據(jù)268.4鏈表
8.4.1鏈表的基本概念
1.鏈表的概念鏈表是由若干同類型結(jié)點用指針鏈接而成的數(shù)據(jù)結(jié)構(gòu)。鏈表由表頭、結(jié)點與鏈尾三部組成。(1)表頭head是指向鏈表的頭指針;(2)結(jié)點是用含有指針的結(jié)構(gòu)體類型node定義的結(jié)構(gòu)體變量。(3)鏈尾是鏈表中指針值為0的結(jié)點,用于表示鏈表的結(jié)束。類似于字符串以0作為結(jié)束標(biāo)志。8.4鏈表
8.4.1鏈表的基本概念27鏈表的概念實例說明將學(xué)生的成績存放在不連續(xù)的內(nèi)存空間中,如學(xué)號為“1001”、“1002”、“1003”的學(xué)生成績依次的存放在首地址為1000、1040、1080的三個不連續(xù)內(nèi)存空間(每段空間稱為一個結(jié)點),如圖8-3所示。各學(xué)生結(jié)點用指針鏈接。首結(jié)點地址存放在頭指針head中。當(dāng)要刪除學(xué)生記錄結(jié)點時,如刪除學(xué)號為“1002”學(xué)生結(jié)點時,只要將其前一個結(jié)點(即學(xué)號為“1001”)的指針改為1080即可,所有數(shù)據(jù)不要作任何移動。而當(dāng)要插入一個新的學(xué)生成績時,只要將新結(jié)點的地址賦給前一個結(jié)點的指針,將其后一個結(jié)點的地址賦給新結(jié)點指針即可。所有數(shù)據(jù)不要作任何移動。所以用鏈表可解決記錄增刪困難的問題。使記錄的增刪變得較為容易。鏈表的概念實例說明將學(xué)生的成績存放在不連續(xù)的內(nèi)存空間中,如學(xué)28鏈表圖鏈表圖298.4.2鏈表的基本操作
由于學(xué)生成績管理系統(tǒng)的主要操作是數(shù)據(jù)的輸入、輸出、查詢、插入、刪除等,所以鏈表的主要操作有鏈表的建立、查詢、輸出、刪除等。為方便后面的討論,將結(jié)點內(nèi)數(shù)據(jù)成員簡化為學(xué)號、成績與指針三項,簡化后的結(jié)點類型node定義如下:structnode{intno;//學(xué)生學(xué)號intscore;//學(xué)生成績node*next;//指針變量};8.4.2鏈表的基本操作
由于學(xué)生成績管理系統(tǒng)的主要操作是數(shù)30為了用鏈表對學(xué)生成績進行錄入、查詢、輸出、插入、刪除等操作,應(yīng)學(xué)會建立鏈表、輸出鏈表、刪除鏈表、查詢指定結(jié)點、刪除指定結(jié)點、插入結(jié)點、建立有序鏈表等鏈表的基本操作。而這些基本操作可以用以下函數(shù)來實現(xiàn)。(1)建立鏈表函數(shù):node*Create(void)(2)輸出鏈表函數(shù):voidPrint(node*head)(3)刪除鏈表函數(shù):voidDelchain(node*head)(4)刪除指定結(jié)點函數(shù):node*Delete(node*head,intno)(5)插入結(jié)點函數(shù):node*Insert(node*head,node*pn)(6)建立有序鏈表函數(shù):node*create_order()。為了用鏈表對學(xué)生成績進行錄入、查詢、輸出、插入、刪除等操作,311.建立無序鏈表函數(shù)Create()建立無序鏈表應(yīng)用函數(shù)node*Create(void)實現(xiàn),建立無序鏈表的步驟如下。(1)定義三個node類型的指針變量:node*head,*pn,*pt;head為頭指針變量,用于存放鏈表首結(jié)點的地址,初值為0,表示鏈表初始時為空。pn為新結(jié)點指針變量,用于存放用new運算符動態(tài)建立的新結(jié)點地址。pt為尾結(jié)點的指針變量,用于存放鏈表尾結(jié)點地址。(2)新建結(jié)點、輸入學(xué)號與學(xué)生成績。用new運算符動態(tài)分配新結(jié)點空間,將pn指向該新結(jié)點,給新結(jié)點輸入學(xué)號與成績。pn=newnode;cin>>pn->no>>pn->score;1.建立無序鏈表函數(shù)Create()建立無序鏈表應(yīng)用函數(shù)no321.建立無序鏈表函數(shù)Create()(3)將新結(jié)點加入到鏈尾。新結(jié)點加入到鏈尾有鏈表為空與非空兩種情況:①鏈表為空(head為0)。當(dāng)鏈表第一次加入結(jié)點時鏈表為空,此時鏈表頭指針head為0,如圖8-4(a)所示。應(yīng)將新結(jié)點的地址1000由pn賦給頭指針head與尾指針pt。即執(zhí)行:head=pn;pt=pn;兩條語句即可將新結(jié)點加入鏈表第一個結(jié)點處,如圖所示1.建立無序鏈表函數(shù)Create()(3)將新結(jié)點加入到鏈尾331.建立無序鏈表函數(shù)Create()②鏈表非空。當(dāng)鏈表非空時,應(yīng)將新結(jié)點追加到鏈尾處。只要將新結(jié)點地址1040由pn賦給鏈尾結(jié)點的指針變量pt->next,就可使新結(jié)點連接到鏈尾。再將pn賦給pt,使pt指向新的鏈尾結(jié)點。此項操作只需執(zhí)行:pt->next=pn;pt=pn;兩條語句即可完成,如圖
1.建立無序鏈表函數(shù)Create()②鏈表非空。當(dāng)鏈表非空時341.建立無序鏈表函數(shù)Create()鏈表空與非空的兩種情況可用雙選if語句實現(xiàn)如下:if(head==0)//若鏈表為空{(diào)head=pn;pt=pn;)else//否則鏈表非空{(diào)pt->next=pn;pt=pn;}(4)重復(fù)(2)、(3)兩步,通過循環(huán)不斷向鏈表添加新結(jié)點直到學(xué)號為“-1”為止。(5)將鏈尾結(jié)點指針賦0。(6)返回鏈表頭指針head。1.建立無序鏈表函數(shù)Create()鏈表空與非空的兩種情況可35先寫出上述步驟中的關(guān)鍵語句,然后用循環(huán)結(jié)構(gòu)連接這些關(guān)鍵語句,即可寫出建立無序鏈表函數(shù)如下:node*Create(void){intno;//定義輸入學(xué)生學(xué)號臨時變量nonode*head,*pn,*pt;//定義鏈表頭指針、新結(jié)點指針、尾指針head、pn、pthead=0;//鏈表頭指針賦0,表示鏈表為空cout<<"產(chǎn)生無序鏈表,請輸入學(xué)生學(xué)號與成績,以-1為結(jié)束:"<<endl;cin>>no;//輸入學(xué)號while(no!=-1)//學(xué)號為-1時結(jié)束輸入{pn=newnode;//動態(tài)分配新結(jié)點內(nèi)存空間,并將結(jié)點地址賦給pnpn->no=no;//輸入學(xué)號cin>>pn->score;//輸入成績先寫出上述步驟中的關(guān)鍵語句,然后用循環(huán)結(jié)構(gòu)連接這些關(guān)鍵語句,36程序接上頁if(head==0)//若鏈表為空{(diào)head=pn;//則將新結(jié)點地址由pn賦給頭指針head與尾指針ptpt=pn;//使新結(jié)點加入到鏈?zhǔn)讅else//否則鏈表非空{(diào)pt->next=pn;//將新結(jié)點地址由pn賦給鏈尾的next指針與尾指針ptpt=pn;//使新結(jié)點加入到鏈尾}cin>>no;//輸入學(xué)號}pt->next=0;//鏈尾指針變量賦0returnhead;//返回鏈表的頭指針}程序接上頁if(head==0)//若鏈表372.輸出鏈表函數(shù)Print()輸出鏈表中各結(jié)點成績應(yīng)用函數(shù)voidPrint(void)實現(xiàn)。保留輸出鏈表函數(shù)的步驟如下:(1)函數(shù)必須用形參node*head接收來自主函數(shù)的鏈表頭指針head。(2)定義指針變量node*p=head;將p指向鏈表首結(jié)點。(3)用循環(huán)語句依次輸出每個結(jié)點的學(xué)號與成績,直到鏈尾(p=0)為止。實現(xiàn)的語句為:while(p!=0){cout<<p->no<<'\t'<<p->score<<'\n';p=p->next;}2.輸出鏈表函數(shù)Print()輸出鏈表中各結(jié)點成績應(yīng)用函數(shù)38由步驟中的關(guān)鍵語句可編寫輸出鏈表函數(shù)如下:
voidPrint(node*head){node*p=head;cout<<"輸出鏈表中各結(jié)點值:"<<endl;while(p!=0){cout<<p->no<<'\t'<<p->score<<endl;p=p->next;}}由步驟中的關(guān)鍵語句可編寫輸出鏈表函數(shù)如下:
voidPrin39輸出鏈表各結(jié)點數(shù)據(jù)表輸出鏈表各結(jié)點數(shù)據(jù)表403.刪除鏈表函數(shù)Delchain()
刪除鏈表是指刪除鏈表全部結(jié)點,并回收結(jié)點所占用的全部內(nèi)存空間。刪除鏈表用函數(shù)Delchain(node*head)實現(xiàn),主要操作步驟如下:(1)用形參node*head接受來自主函數(shù)的鏈表頭指針:(2)定義指針變量node*p=head:并使指針變量p指向鏈?zhǔn)?,如圖所示:3.刪除鏈表函數(shù)Delchain()
刪除鏈表是指刪除鏈表全41(3)用循環(huán)語句依次刪除鏈表的各結(jié)點刪除鏈表的函數(shù)如下:voidDelchain(node*head){node*p;p=head;//鏈表頭指針賦給pwhile(head)//當(dāng)鏈表非空時刪除結(jié)點{head=p->next;//將鏈表下一個結(jié)點指針賦給headdeletep;//刪除鏈表第一個結(jié)點p=head;//再將頭指針賦給p}}(3)用循環(huán)語句依次刪除鏈表的各結(jié)點刪除鏈表的函數(shù)如下:424.刪除鏈表上指定結(jié)點函數(shù)Delete()刪除鏈表上指定值結(jié)點用函數(shù)Delete(node*head,intno)實現(xiàn)。函數(shù)形參應(yīng)有兩個:第一個為鏈表頭指針head,第二個為要刪除結(jié)點的學(xué)生學(xué)號no。要刪除鏈表上指定學(xué)號的結(jié)點,首先要找到要刪除的結(jié)點,然后才能刪除該結(jié)點。刪除結(jié)點可能會遇到三種情況:(1)若鏈表為空,即head為0,則返回空指針。(2)若要刪除的結(jié)點為鏈表首結(jié)點,則將該結(jié)點的指針值賦給鏈表頭指針head,然后刪除該結(jié)點即可(3)要刪除的結(jié)點不是鏈表首結(jié)點。4.刪除鏈表上指定結(jié)點函數(shù)Delete()刪除鏈表上指定值結(jié)435.插入結(jié)點函數(shù)Insert()假設(shè)鏈表各結(jié)點按成績score降序排列,插入結(jié)點后,仍要求按成績score降序排列。在插入函數(shù)Insert(node*head,node*pn)的形參中head為頭指針,pn為指向插入結(jié)點的指針。在插入函數(shù)體中:pc為指向插入點前一個結(jié)點的指針,pa為指向插入點后一個結(jié)點的指針,插入結(jié)點有兩種情況:(1)鏈表為空。(2)鏈表非空。5.插入結(jié)點函數(shù)Insert()假設(shè)鏈表各結(jié)點按成績scor446.建立有序鏈表函數(shù)Creat_Order()向一個空鏈表中不斷地插入新建立的結(jié)點,并使新結(jié)點按序排列,就產(chǎn)生一條有序鏈表。建立一條有序鏈表的過程可分為兩步:首先建立一個新結(jié)點,其次將新結(jié)點插入到鏈表中。函數(shù)如下:node*Create_Order(void){node*pn,*head=0;//定義指向新結(jié)點的指針變量pn及鏈表頭指針headintno;//定義輸入學(xué)生學(xué)號的臨時變量n。cout<<"產(chǎn)生一條有序鏈表,請輸入學(xué)生學(xué)號與成績,以-1結(jié)束!\n";cin>>no;while(no!=-1)//學(xué)號不等于-1則循環(huán){pn=newnode;//動態(tài)分配node類型結(jié)點空間,并將其地址賦給pnpn->no=no;//給新結(jié)點輸入學(xué)號與成績cin>>pn->score;head=Insert(head,pn);//調(diào)用結(jié)點插入函數(shù),將新結(jié)點按成績降序插入鏈表cin>>no;//輸入學(xué)號}returnhead;//返回鏈表頭指針}6.建立有序鏈表函數(shù)Creat_Order()向一個空鏈表中457.完成鏈表處理的主程序#include"stdafx.h"#include"stdio.h"#include"iostream.h"#include"string.h"structnode{ intno; intscore; node*next;};7.完成鏈表處理的主程序#include"stdafx.h46程序接上頁node*Create()//建立無序鏈表的函數(shù){ intno; node*head,*pn,*pt; head=0; cout<<"產(chǎn)生無序鏈表,請輸入學(xué)生學(xué)號與成績,以-1為結(jié)束:"<<endl; cin>>no; while(no!=-1) { pn=newnode;
pn->no=no; cin>>pn->score; if(head==0)程序接上頁node*Create()47程序接上頁{ head=pn; pt=pn; } else { pt->next=pn; pt=pn; } cin>>no; } pt->next=0; returnhead;}程序接上頁{48程序接上頁voidPrint(node*head){ node*p=head; cout<<"輸出鏈表中各結(jié)點值:"<<endl; while(p!=0) { cout<<p->no<<'\t'<<p->score<<endl; p=p->next; }}程序接上頁voidPrint(node*head)49程序接上頁voidDelchain(node*head){ node*p; p=head; while(head) { head=p->next; deletep; p=head; }}node*Delete(node*head,intno){ node*pc,*pa; pc=pa=head; if(head==NULL) { cout<<"鏈表為空,無結(jié)點可刪!"<<endl; returnNULL; }程序接上頁voidDelchain(node*head)50程序接上頁elseif(pc->no==no) { head=pc->next; deletepc; cout<<"刪除了一個結(jié)點!"<<endl; } else { while(pc->no!=no) { pa=pc; pc=pc->next; }程序接上頁elseif(pc->no==no)51程序接上頁if(pc==NULL) cout<<"鏈表中沒有要刪除的結(jié)點!"<<endl; else { pa->next=pc->next; deletepc; cout<<"刪除了一個結(jié)點!"<<endl; } } returnhead;}程序接上頁if(pc==NULL)52程序接上頁node*Insert(node*head,node*pn){ node*pc,*pa; pc=pa=head; if(head==0) { head=pn; pn->next=0; returnhead; } if(pn->score>=head->score) { pn->next=head; head=pn; returnhead; }程序接上頁node*Insert(node*head,n53程序接上頁while(pc->next!=0&&pn->score<=pc->score) { pa=pc; pc=pc->next; } if(pn->score<=pc->score) { pc->next=pn; pn->next=0; } else { pn->next=pc; pa->next=pn; } returnhead;}程序接上頁while(pc->next!=0&&p54程序接上頁node*Create_Order(){ node*pn,*head=0; intno; cout<<"產(chǎn)生一條有序鏈表,請輸入學(xué)生學(xué)號與成績,以-1結(jié)束!"<<endl; cin>>no; while(no!=-1) { pn=newnode;
pn->no=no; cin>>pn->score; head=Insert(head,pn); cin>>no; } returnhead;}程序接上頁node*Create_Order()55程序接上頁voidmain(){ node*head; intno; head=Create(); Print(head); cout<<"輸入要刪除結(jié)點上學(xué)生學(xué)號:"<<endl; cin>>no; head=Delete(head,no); Print(head); Delchain(head); head=Create_Order(); Print(head); Delchain(head); getchar();}程序接上頁voidmain()56程序執(zhí)行后顯示:產(chǎn)生無序鏈表,請輸入學(xué)生學(xué)號與成績,以-l為結(jié)束:100190100280100370-1輸出鏈表中各結(jié)點值:100190100280100370輸入要刪除結(jié)點上學(xué)生學(xué)號:1002刪除了一個結(jié)點!程序執(zhí)行后顯示:產(chǎn)生無序鏈表,請輸入學(xué)生學(xué)號與成績,以-l為57程序執(zhí)行后顯示:輸出鏈表中各結(jié)點值:100190100370產(chǎn)生一條有序鏈表,請輸入學(xué)生學(xué)號與成績,以-1結(jié)束!100190100380100285-1輸出鏈表中各結(jié)點值:100190100285100380程序執(zhí)行后顯示:輸出鏈表中各結(jié)點值:588.5類型定義
用typedef定義類型名是由用戶自行對已經(jīng)存在的類型取新名字,而不是定義新類型,而且原有類型名依然有效。其目的主要是為了減少書寫工作量,增加程序可讀性,提高程序的可移植性。1.用typedef定義基本類型定義基本類型的新類型名的一般形式是:typedef基本類型名新類型名;2.定義數(shù)組類型定義數(shù)組類型的新類型名的一般形式為:typedef基本類型名新類型名;3.定義指針類型定義指針類型的新類型名的一般形式為:typedef基本類型名*新類型名;4.定義一個新類型名代表一個結(jié)構(gòu)體類型5.定義一個類型名代表一個共用體類型8.5類型定義
用typedef定義類型名是由用戶自行對已經(jīng)59用typedef定義一個新類型名的方法如下:
(1)先按定義變量的方法寫出定義體,例如:char*P;(2)將變量名換成新類型名,例如:char*POINTER;(3)在最前面加上typedef,例如:typedefchar*POINTER;(4)最后用新類型名去定義變量,例如:POINTERp1,p2;用typedef定義一個新類型名的方法如下:
(1)先按定義60本章小結(jié)本章介紹了枚舉型、結(jié)構(gòu)體和共用體三種導(dǎo)出數(shù)據(jù)類型的概念、定義格式與使用方法,還介紹了鏈表的建立、刪除、插入、輸出等基本操作。1.枚舉型枚舉型是某種數(shù)據(jù)可能取值的集合,其定義格式為:enum<枚舉類型名>{<枚舉元素表>};枚單元素表中,的各元素為數(shù)據(jù)可能取值的集合,每元素均有一個序號值與之對應(yīng),該序號值可以在定義枚舉類型時賦給元素,也可取其默認序號,默認序號從0開始依次加1。用枚舉類型可定義枚舉變量或枚舉數(shù)組,枚舉變量可進行賦值運算與比較運算。枚舉變量不能用cin輸入枚舉元素值或序號值,只能用賦值運算符將枚舉元素值賦給枚舉變量。而用cout可以輸出枚舉變量,但輸出的是其序號而不是元素值。枚舉變量之間的比較運算是對其序號進行的。本章小結(jié)本章介紹了枚舉型、結(jié)構(gòu)體和共用體三種導(dǎo)出數(shù)據(jù)類型的概612.結(jié)構(gòu)體結(jié)構(gòu)體是由若干數(shù)據(jù)成員組成的導(dǎo)出數(shù)據(jù)類型,其定義格式為:struct<結(jié)構(gòu)體類型名>{<類型>成員1;…<類型>成員n;};結(jié)構(gòu)體中成員的數(shù)據(jù)類型可以是基本類型,也可以是導(dǎo)出類型。2.結(jié)構(gòu)體結(jié)構(gòu)體是由若干數(shù)據(jù)成員組成的導(dǎo)出數(shù)據(jù)類型,其定義格622.結(jié)構(gòu)體用結(jié)構(gòu)體數(shù)據(jù)類型可定義結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)組,定義結(jié)構(gòu)體變量有三種方法:先定義結(jié)構(gòu)體后定義結(jié)構(gòu)體變量,定義結(jié)構(gòu)體類型同時定義結(jié)構(gòu)體變量,直接定義結(jié)構(gòu)體變量。每個結(jié)構(gòu)體變量有若干數(shù)據(jù)成員,數(shù)據(jù)成員的引用格式為:結(jié)構(gòu)體變量名.成員名。不能對結(jié)構(gòu)體變量直接進行輸入、輸出,只能對結(jié)構(gòu)體變量的數(shù)據(jù)成員進行輸入、輸出。結(jié)構(gòu)體數(shù)組與數(shù)據(jù)庫中的二維表類似,數(shù)組中的每一個元素相當(dāng)于表中的一個記錄,元素中的每個成員相當(dāng)于表中一個數(shù)據(jù)項。因此,用結(jié)構(gòu)體數(shù)組可以實現(xiàn)數(shù)據(jù)庫中二維表的統(tǒng)計、排序、查詢等功能。2.結(jié)構(gòu)體用結(jié)構(gòu)體數(shù)據(jù)類型可定義結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)組,定義63共用體和鏈表的基本操作
3.共用體共用體類型是指幾個不同數(shù)據(jù)類型的數(shù)據(jù)項共同使用同一段內(nèi)存單元的數(shù)據(jù)結(jié)構(gòu)。共用體變量所占用的內(nèi)存大小(字節(jié)數(shù))與成員中占用內(nèi)存最大(即具有最多字節(jié)數(shù))的成員的占用大小相同,而結(jié)構(gòu)體變量所占用的內(nèi)存大小是各個成員所占內(nèi)存長度之和。4.鏈表的基本操作鏈表由若干個結(jié)構(gòu)體類型的結(jié)點用指針鏈接而成,每個結(jié)點由數(shù)據(jù)與指針兩部分組成,其中指針用于鏈接下一個結(jié)點。鏈表的首結(jié)點地址存放在頭指針中,尾結(jié)點指針必須為0。鏈表的主要操作有鏈表的建立、插入、刪除、輸出等。共用體和鏈表的基本操作
3.共用體64鏈表的基本操作(1)建立無序鏈表的主要操作。先用new動態(tài)分配一個結(jié)點空間,并用指針變量pn指向新結(jié)點,輸入數(shù)據(jù)到結(jié)點內(nèi),然后將新結(jié)點加入到鏈尾,依次循環(huán)直到輸入結(jié)束標(biāo)志為止。若用pt指向鏈尾結(jié)點,則將新結(jié)點加到鏈尾的主要操作是:pt->next=pn;//新結(jié)點加入到鏈尾pt=pn//使pt指向新的鏈尾(2)刪除整個鏈表的主要操作。先用指針變量p指向鏈表首結(jié)點(p=head),再將首結(jié)點從鏈表分離出來(head=p->next),最后刪除首結(jié)點(deletep),依次循環(huán)直到刪完(head==0)為止。鏈表的基本操作(1)建立無序鏈表的主要操作。先用new動態(tài)分65鏈表的基本操作(3)刪除指定結(jié)點的主要操作。先用循環(huán)語句找到要刪除的結(jié)點,如:while(pc->no!=no){pa=pc;pc=pc->next;}用pc指向要刪除的結(jié)點,pa指向刪除結(jié)點的后一個結(jié)點,只要執(zhí)行下面兩條語句:pa->next=pc->next;//要刪除結(jié)點前一個結(jié)點的地址賦給其后一個結(jié)點的指針deletepc;//動態(tài)回收結(jié)點占用空間則指定結(jié)點被刪除。當(dāng)然,實際編程時還必須考慮其他許多情況,如鏈表為空,刪除首結(jié)點等特殊情況。鏈表的基本操作(3)刪除指定結(jié)點的主要操作。先用循環(huán)語句找到66鏈表的基本操作(4)插入結(jié)點的主要操作。先用循環(huán)語句找到插入點的位置,用pc指向插入點前一個結(jié)點,pa指向插入點后一個結(jié)點,用pn指向新結(jié)點,只要執(zhí)行下面兩條語句:pn->next=pc;//將插入點前一個結(jié)點的地址賦給新結(jié)點的指針pa->next=pn;//將新結(jié)點的地址賦給插入點后一個結(jié)點的指針則新結(jié)點被插入到指定位置。鏈表的基本操作(4)插入結(jié)點的主要操作。先用循環(huán)語句找到插入67C++面對對象程序設(shè)計授課老師:C++面對對象程序設(shè)計授課老師:68第8章復(fù)雜數(shù)據(jù)類型
本章要點8.1枚舉類型的定義及應(yīng)用8.2結(jié)構(gòu)體的定義及應(yīng)用8.3共用體的定義及應(yīng)用8.4鏈表8.5類型定義第8章復(fù)雜數(shù)據(jù)類型
本章要點69
本章要點枚舉類型的定義及應(yīng)用結(jié)構(gòu)體的定義及應(yīng)用共用體的定義及應(yīng)用用typedef定義類型名本章要點708.1枚舉類型在程序設(shè)計中,有時會用到由若干個有限數(shù)據(jù)元素組成的集合,如一周內(nèi)的星期一到星期日7個數(shù)據(jù)元素組成的集合,程序中某個變量取值僅限于集合中的元素。此時,可將這些數(shù)據(jù)集合定義為枚舉類型。因此,枚舉類型是某類數(shù)據(jù)可能取值的集合,如一周內(nèi)星期可能取值的集合為:{Sun,Mon,Tue,Wed,Thu,F(xiàn)ri,Sat}該集合可定義為描述星期的枚舉類型,該枚舉類型共有7個元素,因而用枚舉類型定義的枚舉變量只能取集合中的某一元素值。由于枚舉類型是導(dǎo)出數(shù)據(jù)類型,因此,必須先定義枚舉類型,然后再用枚舉類型定義枚舉型變量。8.1枚舉類型在程序設(shè)計中,有時會用到由若干個有限數(shù)據(jù)元素組718.1.1枚舉類型的定義
枚舉類型的一般定義格式為:enum<枚舉類型名>{<枚舉元素表>};其中:關(guān)鍵字enum表示定義的是枚舉類型,枚舉類型名由標(biāo)識符組成。枚舉元素為常量時定義形式如下:enum<枚舉類型名>{<枚舉常量1,枚舉常量2,…,枚舉常量n};例如:enumseasons{spring,summer,autumn,winter};//定義枚舉類型enumseasons又如:enumcolors{red,blue,green,yellow,white,black};//定義枚舉類型enumcolors8.1.1枚舉類型的定義
枚舉類型的一般定義格式為:72說明:
(1)enum是定義枚舉類型的關(guān)鍵字,枚舉類型名應(yīng)符合標(biāo)識符定義的規(guī)則,enum和枚舉類型名構(gòu)成枚舉類型的類型名。(2)花括號{}中的值是該枚舉類型所有可能的枚舉常量列表,定義中枚舉常量不能同名。在系統(tǒng)默認的情況下,枚舉常量值順序為0,l,2,…,即第一個枚舉常量的值為0,其后枚舉常量的值是前一個枚舉常量的值加1。例如示例中,spring,summer,autumn,winter的值分別為0,1,2,3,而red,blue,green,yellow,white,black的值分別為0,1,2,3,4,5。(3)也可以在定義時,由用戶自行設(shè)定每一個枚舉常量的值。例如:enumseasons{spring=4,summer=1,autumn,winter};spring的值為4,summer的值為1,其后枚舉常量的值為前一個枚舉常量的值加1,順序為2,3。(4)不能給已經(jīng)定義過的枚舉常量賦值。例如:spring=1;是錯誤的,因為枚舉常量是常量而不是變量。說明:
(1)enum是定義枚舉類型的關(guān)鍵字,枚舉類型名應(yīng)符738.1.2枚舉類型變量的定義定義枚舉類型變量有三種方法;即:先定義類型后定義變量,定義類型的同時定義變量,直接定義變量,現(xiàn)介紹如下:1.先定義類型后定義變量格式:enum<枚舉類型名><變量1>〔,<變量2>,…,<變量n>〕2.定義類型的同時定義變量格式:enum<枚舉類型名>{<枚舉元素表>}<變量1>〔,<變量2>,…,<變量n>〕;3.直接定義枚舉變量格式:enum{<枚舉元素表>}<變量1>〔,<變量2>,…,<變量n>〕;8.1.2枚舉類型變量的定義定義枚舉類型變量有三種方法;即:748.1.3枚舉類型變量的引用
(1)枚舉變量的取值范圍只能是其枚舉類型定義時所枚舉的各個枚舉常量,所以枚舉常量可賦值給枚舉變量如“c1=white;c2[3]=green;”等。(2)枚舉類型變量不能直接被賦予一個整數(shù)數(shù)值。如“c1=4;”是錯誤的,因為c1是枚舉類型變量,4是整型常量,兩者的類型不同。經(jīng)過強制類型轉(zhuǎn)換后,是可以賦值的,如“c1=(enumcolors)4;”。(3)同類型的枚舉變量間、枚舉常量間、枚舉變量與枚舉常量間可以進行算術(shù)運算和關(guān)系運算等。例如:if(c1>red)…。(4)枚舉變量也有作用域范圍,其含義與一般變量相同。(5)枚舉變量和枚舉常量可以作函數(shù)參數(shù),函數(shù)的返回值也可以是枚舉類型。8.1.3枚舉類型變量的引用
(1)枚舉變量的取值范圍只能是75先定義描述6種顏色的枚舉類型colors,然后再用該枚舉類型定義枚舉數(shù)組,任意輸入6個顏色號,轉(zhuǎn)換成對應(yīng)的顏色枚舉量后輸入到枚舉數(shù)組中,最后輸出枚舉數(shù)組中對應(yīng)的顏色#include"stdafx.h"#include"stdio.h"#include"iostream.h"#include"stdlib.h"http://使用exit(0)函數(shù)時必須包含stdlib.h頭文件enumcolors{red,blue,green,black,white,yellow};//定義有六種顏色元素的枚舉類型colorsvoidmain(){ colorscolor[6];//定義枚舉類型數(shù)組color[6] intj,n; cout<<"0:red,1:blue,2:green,3:black,4:white,5:yellow"<<endl; cout<<"請輸入六個顏色號:"<<endl;先定義描述6種顏色的枚舉類型colors,然后再用該枚舉類型76for(j=0;j<6;j++){ cin>>n; if(n<0||n>5) { cout<<"輸入顏色值出錯,請重新輸入!"<<endl; exit(0); } else switch(n)//將顏色號轉(zhuǎn)換成顏色元素存入數(shù)組 { case0: color[j]=red; break; case1: color[j]=blue; break;for(j=0;j<6;j++)77case2: color[j]=green; break; case3: color[j]=black; break; case4: color[j]=white; break; case5: color[j]=yellow; break; } }case78for(j=0;j<6;j++)//循環(huán)六次輸出數(shù)組元素對應(yīng)的顏色 { switch(color[j]) { casered: cout<<"red"; break; caseblue: cout<<"blue"; break; casegreen: cout<<"green"; break; caseblack: cout<<"black"; break;for(j=0;j<6;j++)79casewhite: cout<<"white"; break; caseyellow: cout<<"yellow"; break; } cout<<'\t'; } cout<<endl; getchar();}casewhite:80程序執(zhí)行時,屏幕提示:0:red,1:blue,2:green,3:black,4:white,5:yellow請輸入6個顏色號:012345<Enter>屏幕輸出:redbluegreenblackwhiteyellow程序執(zhí)行時,屏幕提示:0:red,1:blue,2:gree818.2結(jié)構(gòu)體類型到目前為止,所見到的數(shù)據(jù)類型都只包含一種類型信息,即使是多個元素的數(shù)組。但是,信息的邏輯關(guān)系,要求各個數(shù)據(jù)類型組合在一起考慮會更加方便。結(jié)構(gòu)就能表達這種數(shù)據(jù)聚集。另外,結(jié)構(gòu)是實現(xiàn)鏈表結(jié)構(gòu)的理想表現(xiàn)手段。
8.2結(jié)構(gòu)體類型到目前為止,所見到的數(shù)據(jù)類型都只包含一種類型828.2.1結(jié)構(gòu)體類型的定義
對于復(fù)雜的數(shù)據(jù),即包含有一個或多個數(shù)據(jù)項,各數(shù)據(jù)項可以具有相同或不同的類型,并且每個數(shù)據(jù)項的含義不同,這就無法由預(yù)定義類型進行整體描述,必須由用戶定義的類型來描述。如要描述一個人的記錄數(shù)據(jù),假定它包含姓名、性別、年齡和工資這四個數(shù)據(jù)項,則可以使用一種結(jié)構(gòu)體類型來描述。
設(shè)該結(jié)構(gòu)體類型的名字用標(biāo)識符Person表示,其中的姓名數(shù)據(jù)項用標(biāo)識符name表示,對應(yīng)類型為字符串型;性別數(shù)據(jù)項用標(biāo)識符sex表示,對應(yīng)類型為布爾(邏輯)型,假定分別用布爾常量true和false表示男和女;年齡數(shù)據(jù)項用標(biāo)識符age表示,對應(yīng)類型為整型;工資數(shù)據(jù)項用標(biāo)識符pay表示,對應(yīng)類型為浮點型。
8.2.1結(jié)構(gòu)體類型的定義
對于復(fù)雜的數(shù)據(jù),即包含有一個或多83結(jié)構(gòu)體類型可定義為:structPerson{charname[10];//姓名boolsex;//性別intage;//年齡floatpay;//工資};結(jié)構(gòu)體類型可定義為:848.2.2結(jié)構(gòu)體變量的定義1.結(jié)構(gòu)體變量的定義(1)先定義類型后定義變量。格式:〔存儲類型〕<結(jié)構(gòu)體類型名><變量名1>〔,<變量名2>,…,<變量名n>〕;(2)定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。格式:struct<結(jié)構(gòu)體類型名>{<成員列表>}<變量名1>〔,<變量名2>,…〕;(3)直接定義結(jié)構(gòu)體變量。格式:struct{<成員列表>}<變量名1>〔,<變量名2>,…〕;
8.2.2結(jié)構(gòu)體變量的定義1.結(jié)構(gòu)體變量的定義852.結(jié)構(gòu)體變量的初始化
與數(shù)組類似,在定義結(jié)構(gòu)體變量時可進行初始化。例如:studentstu1={1001,"Zhang",90,95,80};studentstu2[3]={{1001,"Zhang",90,95,80},{1002,"Li",95,80,85},{1003,"Wang",95,85,90}};2.結(jié)構(gòu)體變量的初始化
與數(shù)組類似,在定義結(jié)構(gòu)體變量時可進行868.2.3結(jié)構(gòu)體變量的引用
對結(jié)構(gòu)體變量的引用,一般情況下是通過對其成員的引用來實現(xiàn)的。1.引用結(jié)構(gòu)體變量中的一個成員引用結(jié)構(gòu)體變量成員的一般形式是:<結(jié)構(gòu)體變量名>.<成員名>其中圓點“.”稱為成員運算符,用于引用一個結(jié)構(gòu)體變量中的某個成員說明:(1)如果成員本身又是一個結(jié)構(gòu)體類型,則必須使用多個成員運算符,采取逐級引用的方式,直到引用最低一級的成員(2)結(jié)構(gòu)體變量的成員可以像同類型的簡單變量一樣進行其數(shù)據(jù)類型允許的各種運算2.引用結(jié)構(gòu)體變量在某些情況下允許對結(jié)構(gòu)體變量進行整體操作3.結(jié)構(gòu)體變量的輸入和輸出C++不允許把一個結(jié)構(gòu)體變量作為一個整體進行輸入和輸出8.2.3結(jié)構(gòu)體變量的引用
對結(jié)構(gòu)體變量的引用,一般情況下是878.2.4結(jié)構(gòu)體數(shù)組
同定義結(jié)構(gòu)體變量相似,定義結(jié)構(gòu)體數(shù)組的方法有以下三種:(1)間接定義。即先定義結(jié)構(gòu)體類型,再用它定義結(jié)構(gòu)體數(shù)組.(2)直接定義。即在定義結(jié)構(gòu)體類型的同時,定義結(jié)構(gòu)體數(shù)組。8.2.4結(jié)構(gòu)體數(shù)組
同定義結(jié)構(gòu)體變量相似,定義結(jié)構(gòu)體數(shù)組的888.3共用體類型
共用體類型,是指幾個不同(或相同)數(shù)據(jù)類型的數(shù)據(jù)項共同使用同一段內(nèi)存單元的數(shù)據(jù)結(jié)構(gòu)8.3.1共用體類型的定義共用體類型定義的一般形式是:union<共用體名>{<成員類型名1><成員名1>;<成員類型名2><成員名2>;┇┇<成員類型名n><成員名n>;};注意:同結(jié)構(gòu)體類型定義的方法相似,只是將關(guān)鍵字由struct換成了union8.3共用體類型
共用體類型,是指幾個不同(或相同)數(shù)據(jù)類898.3.2共用體變量的定義
同結(jié)構(gòu)體變量定義的方法相似,共用體變量的定義有直接定義、間接定義和無名定義三種形式。(1)直接定義。(2)間接定義(3)無名定義
8.3.2共用體變量的定義
同結(jié)構(gòu)體變量定義的方法相似,共用908.3.3共用體變量的引用
一般情況下不直接引用共用體變量,而是引用共用體變量的某個成員。與結(jié)構(gòu)體變量成員的引用一樣,共用體變量成員的引用(假定已經(jīng)執(zhí)行“uniondata1*p=&u;”語句)也有以下三種方式:(1)共用體變量名.成員名,如u.ch或u.i或u.d;(2)(*指針變量名).成員名,如(*p).ch或(*p).i或(*p).d;(3)指針變量名->成員名,如p->ch或p->i或p->d。8.3.3共用體變量的引用
一般情況下不直接引用共用體變量,91說明:(1)共用體變量中,可以包含若干個成員及若干種類型,但共用體成員不能同時使用。在每一時刻,只有一個成員及一種類型起作用,所以不能同時引用多個成員及多種類型。(2)共用體變量中起作用的成員值是最后一次存放的成員值,即共用體變量所有成員共用同一段內(nèi)存單元,后來存放的值將原先存放的值覆蓋,故只能使用最后一次給定的成員值。(3)共用體變量的地址和它的各個成員的地址相同.(4)不能企圖引用共用體變量名來得到某成員的值(5)共用體類型和結(jié)構(gòu)體類型可以相互嵌套,即結(jié)構(gòu)體可以出現(xiàn)在共用體類型中,共用體類型也可以出現(xiàn)在結(jié)構(gòu)體類型的定義中(6)C++允許在兩個同類型的共用體變量之間賦值。(7)共用體變量不能作函數(shù)參數(shù),函數(shù)的返回值也不能是共用體類型。說明:(1)共用體變量中,可以包含若干個成員及若干種類型,但928.3.4共用體類型的特點
共用體類型的特點就是多個相同數(shù)據(jù)類型或不同數(shù)據(jù)類型的數(shù)據(jù)項共同使用同一段內(nèi)存單元。在內(nèi)存中占用的字節(jié)數(shù)可能不同,但都是從同一地址開始存放,并且在同一時刻只能存放一個數(shù)據(jù)項。8.3.4共用體類型的特點
共用體類型的特點就是多個相同數(shù)據(jù)938.4鏈表
8.4.1鏈表的基本概念
1.鏈表的概念鏈表是由若干同類型結(jié)點用指針鏈接而成的數(shù)據(jù)結(jié)構(gòu)。鏈表由表頭、結(jié)點與鏈尾三部組成。(1)表頭head是指向鏈表的頭指針;(2)結(jié)點是用含有指針的結(jié)構(gòu)體類型node定義的結(jié)構(gòu)體變量。(3)鏈尾是鏈表中指針值為0的結(jié)點,用于表示鏈表的結(jié)束。類似于字符串以0作為結(jié)束標(biāo)志。8.4鏈表
8.4.1鏈表的基本概念94鏈表的概念實例說明將學(xué)生的成績存放在不連續(xù)的內(nèi)存空間中,如學(xué)號為“1001”、“1002”、“1003”的學(xué)生成績依次的存放在首地址為1000、1040、1080的三個不連續(xù)內(nèi)存空間(每段空間稱為一個結(jié)點),如圖8-3所示。各學(xué)生結(jié)點用指針鏈接。首結(jié)點地址存放在頭指針head中。當(dāng)要刪除學(xué)生記錄結(jié)點時,如刪除學(xué)號為“1002”學(xué)生結(jié)點時,只要將其前一個結(jié)點(即學(xué)號為“1001”)的指針改為1080即可,所有數(shù)據(jù)不要作任何移動。而當(dāng)要插入一個新的學(xué)生成績時,只要將新結(jié)點的地址賦給前一個結(jié)點的指針,將其后一個結(jié)點的地址賦給新結(jié)點指針即可。所有數(shù)據(jù)不要作任何移動。所以用鏈表可解決記錄增刪困難的問題。使記錄的增刪變得較為容易。鏈表的概念實例說明將學(xué)生的成績存放在不連續(xù)的內(nèi)存空間中,如學(xué)95鏈表圖鏈表圖968.4.2鏈表的基本操作
由于學(xué)生成績管理系統(tǒng)的主要操作是數(shù)據(jù)的輸入、輸出、查詢、插入、刪除等,所以鏈表的主要操作有鏈表的建立、查詢、輸出、刪除等。為方便后面的討論,將結(jié)點內(nèi)數(shù)據(jù)成員簡化為學(xué)號、成績與指針三項,簡化后的結(jié)點類型node定義如下:structnode{intno;//學(xué)生學(xué)號intscore;//學(xué)生成績node*next;//指針變量};8.4.2鏈表的基本操作
由于學(xué)生成績管理系統(tǒng)的主要操作是數(shù)97為了用鏈表對學(xué)生成績進行錄入、查詢、輸出、插入、刪除等操作,應(yīng)學(xué)會建立鏈表、輸出鏈表、刪除鏈表、查詢指定結(jié)點、刪除指定結(jié)點、插入結(jié)點、建立有序鏈表等鏈表的基本操作。而這些基本操作可以用以下函數(shù)來實現(xiàn)。(1)建立鏈表函數(shù):node*Create(void)(2)輸出鏈表函數(shù):voidPrint(node*head)(3)刪除鏈表函數(shù):voidDelchain(node*head)(4)刪除指定結(jié)點函數(shù):node*Delete(node*head,intno)(5)插入結(jié)點函數(shù):node*Insert(node*head,node*pn)(6)建立有序鏈表函數(shù):node*create_order()。為了用鏈表對學(xué)生成績進行錄入、查詢、輸出、插入、刪除等操作,981.建立無序鏈表函數(shù)Create()建立無序鏈表應(yīng)用函數(shù)node*Create(void)實現(xiàn),建立無序鏈表的步驟如下。(1)定義三個node類型的指針變量:node*head,*pn,*pt;head為頭指針變量,用于存放鏈表首結(jié)點的地址,初值為0,表示鏈表初始時為空。pn為新結(jié)點指針變量,用于存放用new運算符動態(tài)建立的新結(jié)點地址。pt為尾結(jié)點的指針變量,用于存放鏈表尾結(jié)點地址。(2)新建結(jié)點、輸入學(xué)號與學(xué)生成績。用new運算符動態(tài)分配新結(jié)點空間,將pn指向該新結(jié)點,給新結(jié)點輸入學(xué)號與成績。pn=newnode;cin>>pn->no>>pn->score;1.建立無序鏈表函數(shù)Create()建立無序鏈表應(yīng)用函數(shù)no991.建立無序鏈表函數(shù)Create()(3)將新結(jié)點加入到鏈尾。新結(jié)點加入到鏈尾有鏈表為空與非空兩種情況:①鏈表為空(head為0)。當(dāng)鏈表第一次加入結(jié)點時鏈表為空,此時鏈表頭指針head為0,如圖8-4(a)所示。應(yīng)將新結(jié)點的地址1000由pn賦給頭指針head與尾指針pt。即執(zhí)行:head=pn;pt=pn;兩條語句即可將新結(jié)點加入鏈表第一個結(jié)點處,如圖所示1.建立無序鏈表函數(shù)Create()(3)將新結(jié)點加入到鏈尾1001.建立無序鏈表函數(shù)Create()②鏈表非空。當(dāng)鏈表非空時,應(yīng)將新結(jié)點追加到鏈尾處。只要將新結(jié)點地址1040由pn賦給鏈尾結(jié)點的指針變量pt->next,就可使新結(jié)點連接到鏈尾。再將pn賦給pt,使pt指向新的鏈尾結(jié)點。此項操作只需執(zhí)行:pt->next=pn;pt=pn;兩條語句即可完成,如圖
1.建立無序鏈表函數(shù)Create()②鏈表非空。當(dāng)鏈表非空時1011.建立無序鏈表函數(shù)Create()鏈表空與非空的兩種情況可用雙選if語句實現(xiàn)如下:if(head==0)//若鏈表為空{(diào)head=pn;pt=pn;)else//否則鏈表非空{(diào)pt->next=pn;pt=pn;}(4)重復(fù)(2)、(3)兩步,通過循環(huán)不斷向鏈表添加新結(jié)點直到學(xué)號為“-1”為止。(5)將鏈尾結(jié)點指針賦0。(6)返回鏈表頭指針head。1.建立無序鏈表函數(shù)Create()鏈表空與非空的兩種情況可102先寫出上述步驟中的關(guān)鍵語句,然后用循環(huán)結(jié)構(gòu)連接這些關(guān)鍵語句,即可寫出建立無序鏈表函數(shù)如下:node*Create(void){intno;//定義輸入學(xué)生學(xué)號臨時變量nonode*head,*pn,*pt;//定義鏈表頭指針、新結(jié)點指針、尾指針head、pn、pthead=0;//鏈表頭指針賦0,表示鏈表為空cout<<"產(chǎn)生無序鏈表,請輸入學(xué)生學(xué)號與成績,以-1為結(jié)束:"<<endl;cin>>no;//輸入學(xué)號while(no!=-1)//學(xué)號為-1時結(jié)束輸入{pn=newnode;//動態(tài)分配新結(jié)點內(nèi)存空間,并將結(jié)點地址賦給pnpn->no=no;//輸入學(xué)號cin>>pn->score;//輸入成績先寫出上述步驟中的關(guān)鍵語句,然后用循環(huán)結(jié)構(gòu)連接這些關(guān)鍵語句,103程序接上頁if(head==0)//若鏈表為空{(diào)head=pn;//則將新結(jié)點地址由pn賦給頭指針head與尾指針ptpt=pn;//使新結(jié)點加入到鏈?zhǔn)讅else//否則鏈表非空{(diào)pt->next=pn;//將新結(jié)點地址由pn賦給鏈尾的next指針與尾指針ptpt=pn;//使新結(jié)點加入到鏈尾}cin>>no;//輸入學(xué)號}pt->next=0;//鏈尾指針變量賦0returnhead;//返回鏈表的頭指針}程序接上頁if(head==0)//若鏈表1042.輸出鏈表函數(shù)Print()輸出鏈表中各結(jié)點成績應(yīng)用函數(shù)voidPrint(void)實現(xiàn)。保留輸出鏈表函數(shù)的步驟如下:(1)函數(shù)必須用形參node*head接收來自主函數(shù)的鏈表頭指針head。(2)定義指針變量node*p=head;將p指向鏈表首結(jié)點。(3)用循環(huán)語句依次輸出每個結(jié)點的學(xué)號與成績,直到鏈尾(p=0)為止。實現(xiàn)的語句為:while(p!=0){cout<<p->no<<'\t'<<p->score<<'\n';p=p->next;}2.輸出鏈表函數(shù)Print()輸出鏈表中各結(jié)點成績應(yīng)用函數(shù)105由步驟中的關(guān)鍵語句可編寫輸出鏈表函數(shù)如下:
voidPrint(node*head){node*p=head;cout<<"輸出鏈表中各結(jié)點值:"<<endl;while(p!=0){cout<<p->no<<'\t'<<p->score<<endl;p=p->next;}}由步驟中的關(guān)鍵語句可編寫輸出鏈表函數(shù)如下:
voidPrin106輸出鏈表各結(jié)點數(shù)據(jù)表輸出鏈表各結(jié)點數(shù)據(jù)表1073.刪除鏈表函數(shù)Delchain()
刪除鏈表是指刪除鏈表全部結(jié)點,并回收結(jié)點所占用的全部內(nèi)存空間。刪除鏈表用函數(shù)Delchain(node*head)實現(xiàn),主要操作步驟如下:(1)用形參node*head接受來自主函數(shù)的鏈表頭指針:(2)定義指針變量node*p=head:并使指針變量p指向鏈?zhǔn)?,如圖所示:3.刪除鏈表函數(shù)Delchain()
刪除鏈表是指刪除鏈表全108(3)用循環(huán)語句依次刪除鏈表的各結(jié)點刪除鏈表的函數(shù)如下:voidDelchain(node*head){node*p;p=head;//鏈表頭指針賦給pwhile(head)//當(dāng)鏈表非空時刪除結(jié)點{head=p->next;//將鏈表下一個結(jié)點指針賦給headdeletep;//刪除鏈表第一個結(jié)點p=head;//再將頭指針賦給p}}(3)用循環(huán)語句依次刪除鏈表的各結(jié)點刪除鏈表的函數(shù)如下:1094.刪除鏈表上指定結(jié)點函數(shù)Delete()刪除鏈表上指定值結(jié)點用函數(shù)Delete(node*head,intno)實現(xiàn)。函數(shù)形參應(yīng)有兩個:第一個為鏈表頭指針head,第二個為要刪除結(jié)點的學(xué)生學(xué)號no。要刪除鏈表上指定學(xué)號的結(jié)點,首先要找到要刪除的結(jié)點,然后才能刪除該結(jié)點。刪除結(jié)點可能會遇到三種情況:(1)若鏈表為空,即head為0,則返回空指針。(2)若要刪除的結(jié)點為鏈表首結(jié)點,則將該結(jié)點的指針值賦給鏈表頭指針head,然后刪除該結(jié)點即可(3)要刪除的結(jié)點不是鏈表首結(jié)點。4.刪除鏈表上指定結(jié)點函數(shù)Delete()刪除鏈表上指定值結(jié)1105.插入結(jié)點函數(shù)Insert()假設(shè)鏈表各結(jié)點按成績score降序排列,插入結(jié)點后,仍要求按成績score降序排列。在插入函數(shù)Insert(node*head,node*pn)的形參中head為頭指針,pn為指向插入結(jié)點的指針。在插入函數(shù)體中:pc為指向插入點前一個結(jié)點的指針,pa為指向插入點后一個結(jié)點的指針,插入結(jié)點有兩種情況:(1)鏈表為空。(2)鏈表非空。5.插入結(jié)點函數(shù)Insert()假設(shè)鏈表各結(jié)點按成績scor1116.建立有序鏈表函數(shù)Creat_Order()向一個空鏈表中不斷地插入新建立的結(jié)點,并使新結(jié)點按序排列,就產(chǎn)生一條有序鏈表。建立一條有序鏈表的過程可分為兩步:首先建立一個新結(jié)點,其次將新結(jié)點插入到鏈表中。函數(shù)如下:node*Create_Order(void){node*pn,*head=0;//定義指向新結(jié)點的指針變量pn及鏈表頭指針headintno;//定義輸入學(xué)生學(xué)號的臨時變量n。cout<<"產(chǎn)生一條有序鏈表,請輸入學(xué)生學(xué)號與成績,以-1結(jié)束!\n";cin>>no;while(no!=-1)//學(xué)號不等于-1則循環(huán){pn=newnode;//動態(tài)分配node類型結(jié)點空間,并將其地址賦給pnpn->no=no;//給新結(jié)點輸入學(xué)號與成績cin>>pn->score;head=Insert(head,pn);//調(diào)用結(jié)點插入函數(shù),將新結(jié)點按成績降序插入鏈表cin>>no;//輸入學(xué)號}returnhead;//返回鏈表頭指針}6.建立有序鏈表函數(shù)Creat_Order()向一個空鏈表中1127.完成鏈表處理的主程序#inclu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報參考:進一步全面深化改革推進中國式現(xiàn)代化的學(xué)理性研究
- 課題申報參考:建設(shè)用地減量化的空間優(yōu)化效應(yīng)、機制與政策優(yōu)化研究
- 2025年erp沙盤模擬學(xué)習(xí)心得(3篇)
- 2025版投資協(xié)議補充協(xié)議:產(chǎn)業(yè)鏈整合投資合作補充協(xié)議3篇
- 2025年度個性化定制汽車租賃合同書4篇
- 二零二五版漫畫連載網(wǎng)絡(luò)平臺版權(quán)合作協(xié)議4篇
- 2025年汕尾貨車從業(yè)資格證考什么
- 2025年食堂承包經(jīng)營食品安全風(fēng)險評估與防控合同3篇
- 二零二五年度城市公交車輛掛靠經(jīng)營許可合同4篇
- 二零二五年度廠房污水處理及排放合同匯編3篇
- 2025年溫州市城發(fā)集團招聘筆試參考題庫含答案解析
- 2025年中小學(xué)春節(jié)安全教育主題班會課件
- 2025版高考物理復(fù)習(xí)知識清單
- 除數(shù)是兩位數(shù)的除法練習(xí)題(84道)
- 2025年度安全檢查計劃
- 2024年度工作總結(jié)與計劃標(biāo)準(zhǔn)版本(2篇)
- 全球半導(dǎo)體測試探針行業(yè)市場研究報告2024
- 反走私課件完整版本
- 2024年注冊計量師-一級注冊計量師考試近5年真題附答案
- 【可行性報告】2023年電動自行車行業(yè)項目可行性分析報告
- 臨床見習(xí)教案COPD地診療教案
評論
0/150
提交評論