[計算機軟件及應(yīng)用]C++第七章習(xí)題解答_第1頁
[計算機軟件及應(yīng)用]C++第七章習(xí)題解答_第2頁
[計算機軟件及應(yīng)用]C++第七章習(xí)題解答_第3頁
[計算機軟件及應(yīng)用]C++第七章習(xí)題解答_第4頁
[計算機軟件及應(yīng)用]C++第七章習(xí)題解答_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.31第七章 動態(tài)內(nèi)存分配習(xí)題第七章 動態(tài)內(nèi)存分配習(xí)題一、基本概念與基礎(chǔ)知識自測題7.1 填空題7.1.1 C/C+定義了4個內(nèi)存區(qū)間: (1) 、 (2) 、 (3) 和 (4) 。答案:(1)代碼區(qū),存放程序代碼; (2)全局變量與靜態(tài)變量區(qū),存放全局變量或?qū)ο螅òo態(tài));(3)局部變量區(qū)即棧(stack)區(qū),存放局部變量;(4)自由存儲區(qū)(free store),即動態(tài)存儲區(qū)或堆(heap)區(qū)。7.1.2 靜態(tài)定義的變量和對象用標識符命名,稱為 (1) ;而動態(tài)建立的稱為 (2) ,動態(tài)建立對象的初始化是通過 (3) 實現(xiàn) (4) 。答案:(1)命名對象(2)無名對象(3)初始化式(i

2、nitializer) (4)顯式初始化7.1.3 在用new運算符建立一個三維數(shù)組15*30*10時,使用了 (1) 個下標運算符,對應(yīng)的用delete運算符注銷這個三維數(shù)組時使用了 (2) 個下標運算符。new返回的指針是指向 (3) 的指針。答案:(1)3個(2)1個(3)30行10列的2位數(shù)組7.1.4 當(dāng)動態(tài)分配失敗,系統(tǒng)采用 (1) 來表示發(fā)生了異常。如果new返回的指針丟失,則所分配的自由存儲區(qū)空間無法收回,稱為 (2) 。這部分空間必須在 (3) 才能找回,這是因為無名對象的生命期 (4) 。答案:(1)返回一個空指針(NULL)(2)內(nèi)存泄漏(3)重新啟動計算機后(4)并不依

3、賴于建立它的作用域7.1.5 按語義的默認復(fù)制構(gòu)造函數(shù)和默認復(fù)制賦值操作符實現(xiàn)的復(fù)制稱為 (1) ,假設(shè)類對象obj中有一個數(shù)據(jù)成員為指針,并為這個指針動態(tài)分配一個堆對象,如用obj1按成員語義拷貝了一個對象obj2,則obj2對應(yīng)指針指向 (2) 。答案:(1)淺拷貝(2)同一個堆對象7.1.6 單鏈表的結(jié)點包含兩個域: (1) 和 (2) 。使用鏈表的最大的優(yōu)點是 (3) ,即使是動態(tài)數(shù)組也做不到這一點。答案:(1)數(shù)據(jù)域(2)指針域(3)用多少空間,開多少空間7.1.7 進入單鏈表必須通過單鏈表的 (1) ,如果它丟失則 (2) ,內(nèi)存也 (3) ,在單鏈表中進行的查找只能是 (4) 。

4、答案:(1)頭指針(2)鏈表整個丟失(3)會發(fā)生泄漏(4)順序查找7.1.8 對鏈棧,鏈的生成必須是向 (1) 生成,最新壓棧的元素(結(jié)點),放在 (2) 位置,彈出時從 (3) 刪除結(jié)點。對鏈隊,采用向 (4) 生成,新入隊的結(jié)點放在鏈的 (5) ,出隊操作在 (6) 位置。答案:(1)向前(2)鏈表頭的位置(3)鏈表頭(4)向后(5)尾部(6)鏈表頭7.1.9 在計算機中進行表達式的計算,為解決優(yōu)先級和運算的結(jié)合性,必須使用 (1) 和 (2) 。在中綴表達式中,每個雙目運算符放在 (3) 。答案:(1)數(shù)棧(2)運算符棧(3)它的兩個運算符之間7.1.10 為了能重復(fù)利用一個隊空間,要求

5、把隊說明成一個邏輯上的 (1) 。答案:(1)循環(huán)隊列7.1.11 二叉樹的特點是: (1) 和 (2) 。答案:(1)每個結(jié)點最多有兩個孩子(2)子樹有左右之分7.1.12 二叉樹的遍歷是按 (1) 分類,所謂中序遍歷是 (2) 。答案:(1)訪問子樹根節(jié)點次序(2)先遍歷該子樹根結(jié)點的左子樹回來后,接著再訪問根結(jié)點,最后遍歷右子樹7.1.13 二叉排序樹又稱 (1) 或 (2) 。其左子樹上的所有結(jié)點均小于根結(jié)點的數(shù)據(jù)值,而右子樹上的所有結(jié)點均大于根結(jié)點的數(shù)據(jù)值時,采用 (3) 就可以得到一個 (4) 。答案:(1)二叉搜索樹(2)樹表(3)中序遍歷(4)升序序列7.2 簡答題7.2.1

6、new運算符為一個變量或?qū)ο蠓峙浯鎯臻g和為一個數(shù)組分配存儲空間,使用方法上有什么不同?對應(yīng)的delete運算符使用有什么不同?答:為一個變量或?qū)ο蠓峙浯鎯臻g其使用的格式如下:指針變量名=new 類型名(初始化式);對于數(shù)組進行動態(tài)分配和撤銷的格式為:指針變量名=new 類型名下標表達式;后者多一個下標表達式,同時不能進行初始化。對應(yīng)的delete運算符使用分別為:delete 指針名;delete 指向該數(shù)組的指針變量名;后者多一個方括號,如果delete語句中少了方括號,因編譯器認為該指針是指向數(shù)組第一個元素的指針,會產(chǎn)生回收不徹底的問題(只回收了第一個元素所占空間),加了方括號后就轉(zhuǎn)化

7、為指向數(shù)組的指針,回收整個數(shù)組。delete 的方括號中不需要填數(shù)組元素數(shù),系統(tǒng)自知。即使寫了,編譯器也忽略。7.2.2 用delete刪除p所指向的無名對象時,p指針也同時被刪除了,對不對?為什么?答:不對。注意這時釋放了p所指向的無名對象占用的內(nèi)存空間,也就是撤銷了該無名對象,稱動態(tài)內(nèi)存釋放(dynamic memory deallocation),但指針p本身并沒有撤銷,它仍然存在,該指針所占內(nèi)存空間并未釋放。7.2.3 為什么動態(tài)建立類對象數(shù)組時,類的定義一定要有缺省的構(gòu)造函數(shù)?答:new后面類(class)類型也可以有參數(shù)。這些參數(shù)即構(gòu)造函數(shù)的參數(shù)。但對創(chuàng)建數(shù)組,沒有參數(shù),只能調(diào)用缺

8、省的構(gòu)造函數(shù)。7.2.4 要實現(xiàn)深拷貝,自定義的拷貝構(gòu)造函數(shù)應(yīng)該怎樣設(shè)計?答:如果類中有一個數(shù)據(jù)成員為指針,該類的一個對象中的這個指針p,指向了動態(tài)分配的一個堆對象。深拷貝時要給新建立的對象獨立分配一個堆對象。這時拷貝的構(gòu)造函數(shù)應(yīng)該設(shè)計為:先拷貝對象主體,再為新建對象的指針分配一個堆對象,最后用原對象的堆對象拷貝新對象的堆對象。即分三步完成。7.2.5 在單鏈表模板中為什么要把List類說明成Node的友元類?答:為了直接訪問結(jié)點的私有成員數(shù)據(jù),以簡化程序。7.2.6 雙向鏈表與單向鏈表相比,操作上有什么優(yōu)點?答:雙向鏈表可以很方便地找到表結(jié)點的前驅(qū)和后繼。單鏈表只能找后繼。如要找前驅(qū),必須從

9、表頭開始搜索,并一般要用兩個工作指針。7.2.7 對比順序棧與鏈棧各自的長處和短處。答:順序棧可以隨機訪問其中的元素,而鏈棧只能順序訪問。順序棧必須先開一定大小內(nèi)存空間,執(zhí)行起來簡單,速度快,但可能溢出。鏈棧內(nèi)存空間隨用隨開,不會溢出,但執(zhí)行復(fù)雜(不斷地動態(tài)分配),速度慢。7.2.8 寫出二叉樹的定義。答:二叉樹是結(jié)點的一個有限集合,該集合或為空,或是由一個根結(jié)點及兩棵分別稱為左子樹和右子樹的(注意有左右之分)互不相交的二叉樹組成,其中左右子樹分別可以為空子樹或均為空樹。7.2.9 什么是二叉樹的遍歷?答:所謂二叉樹的遍歷(binary tree traversal),就是遵從某種次序,查巡二

10、叉樹的所有結(jié)點,每個結(jié)點都被訪問一次,而且僅訪問一次。所謂“訪問”指對結(jié)點施行某些操作,但不破壞它原來的數(shù)據(jù)結(jié)構(gòu)。二、編程與綜合練習(xí)題7.3 給單鏈表類模板增加兩個成員函數(shù):刪除鏈表中所有數(shù)據(jù)域為指定值的結(jié)點和取出鏈表中第K個元素(從1開始計數(shù))。解:這兩個成員函數(shù)添在單鏈表類模板中(ep7_3.h)本例數(shù)據(jù)域用了標準類string,也可以使用整數(shù)型。/ep7_3.h#include<iostream>using namespace std;/首先看結(jié)點組織,采用結(jié)點類,凡與結(jié)點數(shù)據(jù)和指針操作有關(guān)函數(shù)作為成員函數(shù)template<typename T>class Lis

11、t;template<typename T>class NodeT info; /數(shù)據(jù)域Node<T> *link; /指針域public:Node(); /生成頭結(jié)點的構(gòu)造函數(shù)Node(const T & data);/生成一般結(jié)點的構(gòu)造函數(shù)void InsertAfter(Node<T>* P); /在當(dāng)前結(jié)點后插入一個結(jié)點Node<T>* RemoveAfter(); /刪除當(dāng)前結(jié)點的后繼結(jié)點,返回該結(jié)點備用T & Getinfo();/增加取數(shù)據(jù)域函數(shù)friend class List<T>/以List為友元類

12、,List可直接訪問Node的私有函數(shù),與結(jié)構(gòu)一樣方便,但更安全;template <typename T> Node<T>:Node()link=NULL;template <typename T> Node<T>:Node(const T & data)info=data;link=NULL;template<typename T>void Node<T>:InsertAfter(Node<T>* p)p->link=link;link=p;template<typename T>

13、Node<T>* Node<T>:RemoveAfter()Node<T>* tempP=link;if(link=NULL) tempP=NULL; /已在鏈尾,后面無結(jié)點else link=tempP->link;return tempP;template<typename T> T & Node<T>:Getinfo()return info;/增加取數(shù)據(jù)域函數(shù)/再定義鏈表類,選擇常用操作:包括建立有序鏈表、搜索遍歷、插入、刪除、取數(shù)據(jù)等template<typename T>class ListNod

14、e<T> *head,*tail;/鏈表頭指針和尾指針public:List(); /構(gòu)造函數(shù),生成頭結(jié)點(空鏈表)List(); /析構(gòu)函數(shù)void MakeEmpty(); /清空一個鏈表,只余表頭結(jié)點Node<T>* Find(T data); /搜索數(shù)據(jù)域與data相同的結(jié)點,返回該結(jié)點的地址int Length(); /計算單鏈表長度void PrintList(); /打印鏈表的數(shù)據(jù)域 void InsertFront(Node<T>* p); /可用來向前生成鏈表,在表頭插入一個結(jié)點void InsertRear(Node<T>*

15、p); /可用來向后生成鏈表,在表尾添加一個結(jié)點void InsertOrder(Node<T> *p); /按升序生成鏈表Node<T>*CreatNode(T data); /創(chuàng)建一個結(jié)點(孤立結(jié)點)Node<T>*DeleteNode(Node<T>* p); /刪除指定結(jié)點Node<T>*RemoveAll(T &); /刪除鏈表中所有數(shù)據(jù)域為指定值的結(jié)點Node<T>*GetNode(int); /取出鏈表中第K個元素(從1開始計數(shù));template<typename T>List<T

16、>:List()head=tail=new Node<T>();template<typename T>List<T>:List()MakeEmpty();delete head;template<typename T>void List<T>:MakeEmpty()Node<T> *tempP;while(head->link!=NULL)tempP=head->link;head->link=tempP->link; /把頭結(jié)點后的第一個節(jié)點從鏈中脫離delete tempP; /刪除(釋

17、放)脫離下來的結(jié)點tail=head; /表頭指針與表尾指針均指向表頭結(jié)點,表示空鏈template<typename T> Node<T>* List<T>:Find(T data)Node<T> *tempP=head->link;while(tempP!=NULL&&tempP->info!=data) tempP=tempP->link;return tempP; /搜索成功返回該結(jié)點地址,不成功返回NULLtemplate<typename T>int List<T>:Lengt

18、h()Node<T>* tempP=head->link;int count=0;while(tempP!=NULL)tempP=tempP->link;count+;return count;template<typename T>void List<T>:PrintList()Node<T>* tempP=head->link;while(tempP!=NULL)cout<<tempP->info<<'t'tempP=tempP->link;cout<<endl

19、;template<typename T>void List<T>:InsertFront(Node<T> *p)p->link=head->link;head->link=p;if(tail=head) tail=p;template<typename T>void List<T>:InsertRear(Node<T> *p)p->link=tail->link;tail->link=p;tail=p;template<typename T>void List<T&g

20、t;:InsertOrder(Node<T> *p)Node<T> *tempP=head->link,*tempQ=head; /tempQ指向tempP前面的一個節(jié)點while(tempP!=NULL)if(p->info<tempP->info)break; /找第一個比插入結(jié)點大的結(jié)點,由tempP指向tempQ=tempP;tempP=tempP->link;tempQ->InsertAfter(p); /插在tempP指向結(jié)點之前,tempQ之后if(tail=tempQ) tail=tempQ->link;temp

21、late<typename T>Node<T>* List<T>:CreatNode(T data)/建立新節(jié)點Node<T>*tempP=new Node<T>(data);return tempP;template<typename T>Node<T>* List<T>:DeleteNode(Node<T>* p)Node<T>* tempP=head;while(tempP->link!=NULL&&tempP->link!=p) tempP

22、=tempP->link;if(tempP->link=tail) tail=tempP;return tempP->RemoveAfter(); /本函數(shù)所用方法可省一個工作指針template<typename T> Node<T>* List<T>:RemoveAll(T &p)/利用已有的DeleteNode()Node<T>*TempP=head->link,*TempR=NULL;while(TempP!=NULL) /也可以利用尾指針if(TempP->info=p)delete TempR;

23、/釋放上次找到的結(jié)點,第1次時因TempR為NULL不會出錯TempR=DeleteNode(TempP);TempP=TempP->link;return TempR; /僅返回最后一次找到的結(jié)點template<typename T> Node<T>* List<T>:GetNode(int i)/取出鏈表中第K個元素(從1計數(shù))Node<T>*TempP=head->link;int j=1;if(i<0) return NULL;if(i=0) return head;while(TempP!=NULL&&

24、;j<i)TempP=TempP->link;j+;return TempP;/ep7_3.cpp#include"ep7_3.h"#include<string>using namespace std;int main()const int h=9;int i;List<string> list1;Node<string> *n1,*P1;string m("東南大學(xué)"),sph="南京大學(xué)","東南大學(xué)","交通大學(xué)","清華大學(xué)&q

25、uot;,"天津大學(xué)","東南大學(xué)","復(fù)旦大學(xué)","浙江大學(xué)","同濟大學(xué)"cout<<"按原始數(shù)據(jù)次序輸出:"<<endl;for(i=0;i<h;i+) cout<<spi<<'t'cout<<endl;for(i=0;i<h;i+)P1=list1.CreatNode(spi);list1.InsertFront(P1); /向前生成list1cout<<"輸

26、出向前生成的鏈表:"<<endl;list1.PrintList();n1=list1.RemoveAll(m);if(n1)cout<<"刪除所有含“"<<n1->Getinfo()<<"”的結(jié)點。"<<endl;delete n1;else cout<<"無要刪除的結(jié)點!"<<endl;cout<<"輸出刪除所有指定結(jié)點后的鏈表:"<<endl;list1.PrintList();cout

27、<<"要求尋找第幾個節(jié)點?"<<endl;cin>>i;n1=list1.GetNode(i);if(n1!=NULL)cout<<n1->Getinfo()<<endl;elsecout<<"鏈表出界!"<<endl;return 0;7.4 為單鏈表類模板增加一個拷貝構(gòu)造函數(shù)和拷貝賦值運算符(=)。解:為簡單數(shù)據(jù)域使用整數(shù)型。注意:從7.3開始逐題完善單鏈表類模板,即前一題增加的成員函數(shù)在本題中全部保留。拷貝構(gòu)造函數(shù)先建立一個頭結(jié)點,再以原鏈表的各結(jié)點的數(shù)據(jù)域來

28、構(gòu)造新鏈表的各對應(yīng)結(jié)點。如果看不懂拷貝構(gòu)造函數(shù)請畫一個空鏈表,逐步跟蹤拷貝過程,只要跟蹤幾個結(jié)點就可以理解。/ep7_4.h#include<iostream>using namespace std;/首先看結(jié)點組織,采用結(jié)點類,凡與結(jié)點數(shù)據(jù)和指針操作有關(guān)函數(shù)作為成員函數(shù)template<typename T>class List;/template<typename T>class Node略/再定義鏈表類,選擇常用操作:包括建立有序鏈表、搜索遍歷、插入、刪除、取數(shù)據(jù)等template<typename T>class ListNode<

29、T> *head,*tail;/鏈表頭指針和尾指針public:List(); /構(gòu)造函數(shù),生成頭結(jié)點(空鏈表)List(List<T> &); /拷貝構(gòu)造函數(shù)List(); /析構(gòu)函數(shù)List& operator=(List<T>&);void MakeEmpty(); /清空一個鏈表,只余表頭結(jié)點Node<T>* Find(T data); /搜索數(shù)據(jù)域與data相同的結(jié)點,返回該結(jié)點的地址int Length(); /計算單鏈表長度void PrintList(); /打印鏈表的數(shù)據(jù)域 void InsertFront(N

30、ode<T>* p); /可用來向前生成鏈表,在表頭插入一個結(jié)點void InsertRear(Node<T>* p); /可用來向后生成鏈表,在表尾添加一個結(jié)點void InsertOrder(Node<T> *p); /按升序生成鏈表Node<T>*CreatNode(T data); /創(chuàng)建一個結(jié)點(孤立結(jié)點)Node<T>*DeleteNode(Node<T>* p); /刪除指定結(jié)點Node<T>*RemoveAll(T &);/刪除鏈表中所有數(shù)據(jù)域為指定值的結(jié)點/Node<T>*

31、GetNode(int);/取出鏈表中第K個元素(從1開始計數(shù));template<typename T>List<T>:List(List<T> & ls) /拷貝構(gòu)造函數(shù)Node<T>* TempP=ls.head->link,*P1;head=tail=new Node<T>();while(TempP!=NULL)P1=new Node<T>(TempP->info);P1->link=tail->link;/向后生成list1tail->link=P1;tail=P1;Tem

32、pP=TempP->link;template<typename T>List<T>& List<T>:operator=(List<T>& ls)Node<T>* TempP=ls.head->link,*P1;MakeEmpty();while(TempP!=NULL)P1=new Node<T>(TempP->info);P1->link=tail->link;/向后生成list1tail->link=P1;tail=P1;TempP=TempP->link;

33、return *this;/其它成員函數(shù)略/ep7_4.cpp#include "ep7_4.h"int main()Node<int> * P1;List<int> list1;int a16,i;cout<<"請輸入16個整數(shù)"<<endl;for(i=0;i<16;i+)cin>>ai; /隨機輸入16個整數(shù)for(i=0;i<16;i+)P1=list1.CreatNode(ai);list1.InsertRear(P1); /向前生成list1cout<<&qu

34、ot;輸出list1:"<<endl;list1.PrintList();List<int> list2(list1),list3;list3=list1;list1.MakeEmpty(); /清空原鏈表,看是否深拷貝cout<<"如無輸出list1已清空:"<<endl;list1.PrintList();cout<<"輸出list2:"<<endl;list2.PrintList();cout<<"輸出list3:"<<en

35、dl;list3.PrintList();return 0;7.5 試為單鏈表類模板設(shè)計一個將鏈表逆轉(zhuǎn)的成員函數(shù)。要求不刪除原結(jié)點,也不另建一個鏈表來取代,而是通過改變指針域的鏈接方向來逆轉(zhuǎn)鏈表。解:逆轉(zhuǎn)鏈表函數(shù)在ep7_5.h的最后。逆轉(zhuǎn)鏈表的成員函數(shù)對空鏈表和單結(jié)點鏈表不處理。對多結(jié)點鏈表,用尾指針指向第一個結(jié)點,找到該尾鏈表最后一個結(jié)點重新鏈到原頭結(jié)點后面;再找到該尾鏈表最后一個結(jié)點,并如此向后生成鏈表,就可以逆轉(zhuǎn)鏈表。也可以用尾鏈表第一個結(jié)點重新鏈到原頭結(jié)點后面,并如此向前生成鏈表,同樣可以逆轉(zhuǎn)鏈表。解1:/ep7_5.h#include<iostream>using na

36、mespace std; /首先看結(jié)點組織,采用結(jié)點類,請參看習(xí)題7.3template<typename T>class List;template<typename T>class Node;/再定義鏈表類,凡是習(xí)題7.34中已給出的成員函數(shù)不再重復(fù) template<typename T>class ListNode<T> *head,*tail;/鏈表頭指針和尾指針public:List(); /構(gòu)造函數(shù),生成頭結(jié)點(空鏈表)void Reverse();/翻轉(zhuǎn)鏈表;template<typename T> void List

37、<T>:Reverse()/鏈表翻轉(zhuǎn)函數(shù)Node<T>*p1,*tempP,*tempQ;if(head=tail|head->link=tail) return;/空鏈表和單結(jié)點鏈表不必處理p1=new Node<T>();p1->link=head->link;/p1形成一個過渡帶頭結(jié)點的鏈表tail=head;head->link=NULL;while(p1->link!=NULL)/鏈表有頭結(jié)點可以保證算法無特殊結(jié)點tempP=p1;while(tempP->link!=NULL)tempQ=tempP;tempP

38、=tempP->link;/找到p1鏈的鏈尾tempP;tempQ->link=NULL;/p1結(jié)點后的第一個節(jié)點從鏈中脫離InsertRear(tempP);/脫離下來的結(jié)點重新向前生成翻轉(zhuǎn)后的新鏈表/ep7_5.cpp#include "ep7_5.h"int main()Node<int> * P1;List<int> list1;int a16,i;cout<<"請輸入16個整數(shù)"<<endl;for(i=0;i<16;i+) cin>>ai; /隨機輸入16個整數(shù),有

39、重復(fù)的for(i=0;i<16;i+)P1=list1.CreatNode(ai);list1.InsertRear(P1); /向前生成list1cout<<"輸出list1:"<<endl;list1.PrintList();list1.Reverse();cout<<"輸出逆轉(zhuǎn)后的list1:"<<endl;list1.PrintList();return 0;解2:采用向前生成鏈表,此程序更簡單。template<typename T> void List<T>:Rev

40、erse()/鏈表翻轉(zhuǎn)函數(shù)Node<T>*p1,*tempP;if(head=tail|head->link=tail) return;/空鏈表和單結(jié)點鏈表不必處理p1=head->link;/p1指針指向第一個元素,形成一個無頭結(jié)點的過渡鏈表tail=head;head->link=NULL;while(p1!=NULL)tempP=p1;p1=tempP->link;/p1結(jié)點后的第一個節(jié)點從鏈中脫離InsertFront(tempP);/脫離下來的結(jié)點重新向前生成翻轉(zhuǎn)后的新鏈表7.6 為單鏈表重載“+”運算符,實現(xiàn)兩個單鏈表對象的連接,但要去除數(shù)據(jù)域相

41、同的結(jié)點。可用友元函數(shù)。解:為了實現(xiàn)ls3=ls1+ls2,需重載=和+兩個運算符。=運算符先清空左邊的鏈表,再模仿拷貝構(gòu)造函數(shù)的編法編程。+運算符先建立一個局部鏈表,拷入被加鏈表,再以加鏈表的數(shù)據(jù)域生成局部鏈表后面的結(jié)點,最后去除數(shù)據(jù)域相同的結(jié)點。注意:當(dāng)采用友元函數(shù)重載+運算符時,盡管重載函數(shù)是List的友元,而List是Node的友類,但因為友元關(guān)系是不能傳遞的,還是不能訪問Node的私有成員,必須通過Node的接口函數(shù)去間接訪問。/ep7_6.h#include<iostream>using namespace std; template<typename T>

42、class List;template<typename T>class Nodepublic:Node<T>*Getlink()return link;/取指針域;template<typename T>class ListNode<T> *head,*tail;/鏈表頭指針和尾指針public:List(); /構(gòu)造函數(shù),生成頭結(jié)點(空鏈表)List<T> & operator=(List<T> &); /重載=運算符friend List<T> operator+(List<T>

43、; & ,List<T> & ); /重載+運算符;template<typename T>List<T> & List<T>:operator=(List<T> & ls)/重載=運算符Node<T>* TempP=ls.head->link,*P1;MakeEmpty(); /清空后tail= head while(TempP!=NULL)P1=new Node<T>(TempP->info);P1->link=tail->link; /向后生成lis

44、t1tail->link=P1;tail=P1;TempP=TempP->link;return *this;template<typename T>List<T> operator+(List<T> & ls1,List<T> & ls2)/重載+運算符List<T> ls(ls1); /新鏈表,生命期僅在本函數(shù)域中Node<T>* P1=ls2.head->Getlink(),*P2,*P3,*P4;/雖然本函數(shù)是List的友元,而List是Node的友類,但還是不能訪問Node的私有

45、成員while(P1!=NULL)P2=ls.CreatNode(P1->Getinfo();ls.InsertRear(P2); /向后生成list1P1=P1->Getlink();P1=ls.head->Getlink();/刪去重復(fù)的結(jié)點。while(P1!=NULL)P2=P1->Getlink();while(P2!=NULL)/與后面結(jié)點逐個比較if(P1->Getinfo()=P2->Getinfo()/有重復(fù)的就刪去;P3=P2->Getlink();/刪去后P2空懸P4=ls.DeleteNode(P2);delete P4;P2=

46、P3;/已后移一個結(jié)點else P2=P2->Getlink();/到后面一個結(jié)點P1=P1->Getlink();/再用第二個./先用第一個結(jié)點,與后面結(jié)點逐個比較,有重復(fù)的就刪去;再用第二個.return ls;/為保證返回時用拷貝構(gòu)造函數(shù)復(fù)制一個鏈表返回,返回類型不能是引用,/ep7_6.cpp#include "ep7_6.h"int main()Node<int> * P1;List<int> list1,list2,list;int a16=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,i;fo

47、r(i=0;i<16;i+)P1=list1.CreatNode(ai);list1.InsertRear(P1);/向后生成list1cout<<"輸出list1:"<<endl;list1.PrintList();for(i=0;i<16;i+)P1=list2.CreatNode(ai+10);list2.InsertRear(P1);/向后生成list1cout<<"輸出list2:"<<endl;list2.PrintList();list=list1+list2;cout<&l

48、t;"輸出合并成的list:"<<endl;list.PrintList();return 0;7.7 將兩個有序的雙向鏈表合并為一個有序的雙向鏈表,刪去相同結(jié)點。解:算法類似6.6的歸并。函數(shù)為:void Merge(DblList<T> & ,DblList<T> &); #include<iostream>using namespace std;template<typename T> class DblList;template<typename T> class DblNode

49、 /結(jié)點類T info; /數(shù)據(jù)域DblNode<T> *llink,*rlink; /前驅(qū)(左鏈)、后繼(右鏈)指針public:DblNode(T data);DblNode();T Getinfo()return info;friend class DblList<T>template<typename T> DblNode<T>:DblNode()llink=rlink=NULL;template<typename T> DblNode<T>:DblNode(T data)info=data;llink=NULL;

50、rlink=NULL;template<typename T>class DblList /雙鏈表類DblNode<T> *head,*current;public:DblList();DblList();void Insert(const T & data);DblNode<T>* Remove(DblNode<T>* p);void Print();int Length(); /計算鏈表長度DblNode<T> *Find(T data); /搜索數(shù)據(jù)與定值相同的結(jié)點void MakeEmpty(); /清空鏈表void

51、Merge(DblList<T> & ,DblList<T> &); /歸并/其它操作;template<typename T> DblList<T>:DblList() /建立表頭結(jié)點head=new DblNode<T>();head->rlink=head->llink=head;current=NULL;template<typename T> DblList<T>:DblList()MakeEmpty(); /清空鏈表delete head;template<type

52、name T> void DblList<T>:MakeEmpty()DblNode<T> *tempP;while(head->rlink!=head)tempP=head->rlink;head->rlink=tempP->rlink; /把頭結(jié)點后的第一個節(jié)點從鏈中脫離tempP->rlink->llink=head; /處理左指針delete tempP; /刪除(釋放)脫離下來的結(jié)點current=NULL; /current指針恢復(fù)template<typename T> void DblList<

53、T>:Insert(const T & data) /新節(jié)點在鏈尾current=new DblNode<T>current->info=data;current->rlink=head; /注意次序current->llink=head->llink;head->llink->rlink=current;head->llink=current; /最后做template<typename T> DblNode<T>* DblList<T>:Remove(DblNode<T>*

54、p)current=head->rlink;while(current!=head&&current!=p) current=current->rlink;if(current=head) current=NULL;else /結(jié)點摘下p->llink->rlink=p->rlink;p->rlink->llink=p->llink;p->rlink=p->llink=NULL;return current;template<typename T> DblNode<T>* DblList<

55、T>:Find(T data)current=head->rlink;while(current!=head&&current->info!=data) current=current->rlink;if(current=head) current=NULL;return current;template<typename T> void DblList<T>:Print()current=head->rlink;while(current!=head)cout<<current->info<<

56、't'current=current->rlink;cout<<endl;template<typename T> int DblList<T>:Length()int count=0;current=head->rlink;while(current!=head)count+;current=current->rlink;return count;template<typename T>void DblList<T>:Merge(DblList<T> & dbl1,DblList

57、<T> & dbl2)/歸并DblNode<int> *tdp1=dbl1.head->rlink,*tdp2=dbl2.head->rlink;while(tdp1!=dbl1.head&&tdp2!=dbl2.head)if(tdp1->info<tdp2->info)Insert(tdp1->info);tdp1=tdp1->rlink;elseInsert(tdp2->info);tdp2=tdp2->rlink;if(tdp1!=dbl2.head) while(tdp1!=dbl1.head)Insert(tdp1->i

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論