版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、?數(shù)據(jù)結(jié)構(gòu)與測(cè)繪軟件開發(fā)?實(shí)驗(yàn)指導(dǎo)書中國(guó)礦業(yè)大學(xué)測(cè)繪與國(guó)土信息中心2021-05-20實(shí)驗(yàn)一 線性表類的設(shè)計(jì)與實(shí)現(xiàn)4學(xué)時(shí)一、實(shí)驗(yàn)要求利用C+語言編程分別實(shí)現(xiàn)線性表的順序存儲(chǔ)與鏈?zhǔn)酱鎯?chǔ)。二、實(shí)驗(yàn)根本操作1、新建工程1執(zhí)行菜單:文件新建工程,選擇“Win32控制臺(tái)應(yīng)用程序;2更改工程存儲(chǔ)路徑;3更改工程名稱;4點(diǎn)擊“確定。2、添加頭文件與類的聲明1頭文件在#include “stdafx.h之后參加如下語句:#include <iostream>using namespace std;2順序表在main函數(shù)前參加如下類的聲明:class SeqListpublic:/ 構(gòu)造、析構(gòu)函數(shù)
2、SeqList(); explicit SeqList(int maxSize); / 僅包含一個(gè)參數(shù)的構(gòu)造函數(shù) SeqList( );public:/ 復(fù)制構(gòu)造函數(shù)、賦值運(yùn)算SeqList(const SeqList& sl);SeqList& operator=(const SeqList& sl);public:/ 成員函數(shù) int Length( ) const; int Find(int& x) const; / 查找int Locate(int i) const; / 定位 int Insert(int& x, int i ); / 插入 i
3、nt Remove(int& x ); / 刪除 int Next(int& x ) ; / 后繼 int Prior(int& x ) ; / 前驅(qū) int IsEmpty( ); int IsFull ( ); int Get (int i) / 提取private:/ 成員變量 int * _data; int _curSize; int _maxSize;3鏈表Typedef struct LNode int data; / 數(shù)據(jù)域 struct Lnode *prior; / 指針域 struct Lnode *next; / 指針域 LNode; class
4、 LinkedListpublic:/ 構(gòu)造、析構(gòu)函數(shù) LinkedList(int MaxSize = 0); LinkedList( );public:/ 復(fù)制構(gòu)造函數(shù)、賦值運(yùn)算 LinkedList (const LinkedList& sl); LinkedList& operator=(const LinkedList& sl)public:/ 成員函數(shù) int length( ) const; int search(int& x) const; / 查找 int insert(int& x, int i ); / 插入 int remove(
5、int& x ); / 刪除 void sort( );/ 排序 int isEmpty( ); void setNull( );/ 置空 int get (int i) / 提取private:/ 成員變量 LNode *head; int _size;3、添加類的實(shí)現(xiàn)代碼順序表在各自類的聲明之后,添加如下代碼:1順序表的函數(shù)/ 構(gòu)造函數(shù)SeqLis:SeqList(): _data(NULL), _maxSize(0), _curSize(0)SeqList:SeqList(int maxSize): _maxSize(maxSize), _curSize(0)_data = ne
6、w int_maxSize;/ 開辟用于存儲(chǔ)線性表的空間連續(xù)空間/ 析構(gòu)函數(shù)SeqList:SeqList()if (NULL != _data)delete _data;/ 取得線性表的長(zhǎng)度int SeqList:Length() constreturn _curSize;/ 在線性表中定位x所在位置int SeqList:Find(Type& x) constfor (int i = 0; i < _curSize; +i)if (x = _datai)return i;return -1;/ 插入元素xint SeqList:Insert(Type& x, int
7、i)/ 判斷下標(biāo)是否越界if (i < 0 | i >= _maxSize)return -1;/ 判斷線性表是否已滿if (_curSize = _maxSize)return -1;/ 判斷插入的位置是否位于_curSize之后if (i < _maxSize - 1) && i >= _curSize)_data_curSize = x;_curSize+;/ 線性表的長(zhǎng)度加1return 1;/ 首先將位于位置i之后的所有元素后移一個(gè)位置for (int j = _curSize; j > i; j-)_dataj = _dataj - 1
8、;_datai = x;/ 將待插入元素插入i位置_curSize+;/ 線性表的長(zhǎng)度加1return 1;/ 刪除元素xint SeqList:Remove(Type& x)for (int i = 0; i < _curSize; i+)if (_datai = x)/ 將i位置之后的元素前移一個(gè)位置for (int j = i; j < _curSize - 1; j+)_dataj = _dataj+1;_curSize-;return 1;return 0;/ 取得x所在位置的下一個(gè)位置int SeqList:Next(Type& x)for (int i
9、 = 0; i < _curSize; i+)if (_datai = x)return i + 1;/ 調(diào)用此函數(shù)的過程需要檢查返回的值是否越界/ 取得x所在位置的前一個(gè)位置int SeqList:Prior(Type& x)for (int i = 0; i < _curSize; i+)if (_datai = x)return i - 1;/ 調(diào)用此函數(shù)的過程需要檢查返回的值是否越界/ 判斷線性表是否為空int SeqList:IsEmpty()if (_curSize <= 0)return 1;else return 0;/ 判斷線性表是否已經(jīng)存儲(chǔ)滿int
10、 SeqList:IsFull()if (_curSize = _maxSize)return 1;elsereturn 0;/ 取得i位置的元素Type SeqList:Get(int i)return _datai;2順序表的兩個(gè)重要應(yīng)用/-/ 集合的交與并/-void Join(SeqList<int>& A, SeqList<int>& B, SeqList<int>& R)/ 首先遍歷Afor (int i = 0; i < A.getCurSize(); +i)int x = A.Get(i);/ 取得i位置的元素i
11、f (B.Find(x) != -1)/ 在B中尋找同樣的元素,假設(shè)不成功,那么返回-1R.Insert(x, R.getCurSize();void Merge(SeqList<int>& A, SeqList<int>& B)for (int i = 0; i < B.getCurSize(); +i)int x = B.Get(i);if (A.Find(x) = -1)A.Insert(x, A.getCurSize();3main函數(shù)的實(shí)現(xiàn)int main(int argc, char* argv)/ 實(shí)例化兩個(gè)線性表SeqList A(
12、20);SeqList B(20);/ 線性表A的數(shù)據(jù)初始化for (int i = 0; i < 10; i+)A.Insert(i, i);/ 線性表B的數(shù)據(jù)初始化for (int i = 5; i < 15; i+)B.Insert(i, i - 5);/ 輸出Acout << "A:" << endl;for (int i = 0; i < A.getCurSize(); i+)cout << A.Get(i) << " "cout << endl;/ 輸出Bcout
13、<< "B:" << endl;for (int i = 0; i < B.getCurSize(); i+)cout << B.Get(i) << " "cout << endl;/ 交運(yùn)算SeqList<int> R(20);Join(A, B, R);/ 交運(yùn)算結(jié)果輸出cout << "線性表A與B取交的結(jié)果:" << endl;for (int i = 0; i < R.getCurSize(); i+)cout <
14、;< R.Get(i) << " "cout << endl;/ 并運(yùn)算cout << "線性表A與B取并的結(jié)果:" << endl;Merge(A, B);/ 并運(yùn)算結(jié)果輸出for (int i = 0; i < A.getCurSize(); i+)cout << A.Get(i) << " "cout << endl;/ 友元函數(shù)調(diào)用cout << "模板輸出結(jié)果:n"cout << A &
15、lt;< endl;cout << B << endl;cout << R << endl;return 0;4、添加類的實(shí)現(xiàn)代碼鏈表1鏈表的實(shí)現(xiàn)函數(shù)/ 構(gòu)造函數(shù)LinkedList:LinkedList(): size(0), head(NULL)LinkedList:LinkedList(int MaxSize): _size(MaxSize), _head(NULL)int LinkedList:Length() constreturn size;/ 返回元素x所在的位置,第一個(gè)節(jié)點(diǎn)序號(hào)為1int LinkedList:Search(
16、Type& x) constif (NULL = head)return -1;int result = 1;ListNode *cur;cur = head;while (cur != NULL)if (cur->data = x)return result;elsecur = cur->next;result+;return -1;int LinkedList:Insert(Type& x, int i)if (i <= 0)/ 越界return -1;if (size = 0)/ 插入結(jié)點(diǎn)操作ListNode *temLN = new ListNode(
17、);temLN->data = x;temLN->link = NULL;head = temLN;size+;return 1;else if (i > size)/ 在鏈表尾部插入ListNode *cur = head;while (cur->link != NULL)cur = cur->link;/ 插入結(jié)點(diǎn)操作ListNode *temLN = new ListNode ();temLN->data = x;temLN->link = NULL;cur->link = temLN;size+;return 1;ListNode *cu
18、r = head;for (int k = 1; k < i - 1; k+)cur = cur->link;/ 插入結(jié)點(diǎn)操作ListNode *temLN = new ListNode ();temLN->data = x;temLN->link = cur->link;cur->link = temLN;size+;return 1;int LinkedList :Remove(Type& x)ListNode * cur = head;if (cur->data = x)/ 刪除表頭第一個(gè)元素head = cur->link;ret
19、urn 1;/ 刪除除表頭之外的其他位置元素while (cur->link != NULL)if (cur->link->data = x)/ 執(zhí)行刪除操作cur->link = cur->link->link;return 1;cur = cur->link;return 1;int LinkedList :IsEmpty()if (size = 0 | head = NULL)return 1;return 0;void LinkedList :SetNull()size = 0;head = NULL;Type LinkedList :Get(
20、int i)if (i <= 0 | i > size)cout << "下表越界!" << endl;return;ListNode* cur = head;for (int k = 1; k <i; k+)cur = cur->link;return cur->data;void LinkedList :Output()ListNode * cur;cur = head;while (cur != NULL)cout << cur->data << " "cur =
21、cur->link;cout << endl;2main函數(shù)的實(shí)現(xiàn)int main(int argc, char* argv)/ 建立一個(gè)包含10個(gè)結(jié)點(diǎn)的鏈表LinkedList myList;for (int i = 1; i <= 10; +i)myList.Insert(i, i);/ 遍歷myList.Output();/ 刪除第5個(gè)元素int x = 5;myList.Remove(x);/ 遍歷myList.Output();/ 在第5個(gè)元素位置處插入一個(gè)50x = 50;myList.Insert(x, 5);/ 遍歷myList.Output();ret
22、urn 0;實(shí)驗(yàn)二 二叉樹的構(gòu)建與遍歷一、實(shí)驗(yàn)要求利用C+語言編程實(shí)現(xiàn)二叉樹的構(gòu)建及其先序、中序、后序遍歷算法.二、實(shí)驗(yàn)根本操作1、新建工程1執(zhí)行菜單:文件新建工程,選擇“Win32控制臺(tái)應(yīng)用程序;2更改工程存儲(chǔ)路徑;3更改工程名稱;4點(diǎn)擊“確定。2、添加頭文件與類的聲明1頭文件在#include “stdafx.h之后參加如下語句:#include <iostream>#include <vector>using namespace std;2類的聲明在main函數(shù)前參加如下類的聲明:typedef struct BTNodeint data;BTNode *lChi
23、ld;BTNode *rChild; SBTNode;class CBinTreepublic:/ 構(gòu)造、析構(gòu)函數(shù)CBinTree();CBinTree();/ 構(gòu)造二叉排序樹void createBSTree(vector<int>& xArray);void insertNode(SBTNode*& temNode, BTNode*& root);/ 樹的遍歷void InOrder(BTNode*& root);/ 中序遍歷 void PreOrder(BTNode*& root);/ 先序遍歷 void PostOrder(BTNod
24、e*& root);/ 后序遍歷 public:BTNode* root;vector<int> xArray;3、添加類的實(shí)現(xiàn)代碼1二叉樹的實(shí)現(xiàn)函數(shù)/ 構(gòu)造函數(shù)CBinTree:CBinTree(): root(NULL)/ 析構(gòu)函數(shù)CBinTree:CBinTree()xArray.clear();/ 構(gòu)造一顆二叉排序樹void CBinTree:createBSTree(vector<int>& xArray)for (vector<int>:iterator iter = xArray.begin();iter != xArray.e
25、nd(); +iter)BTNode *temNode = new BTNode;temNode->data = *iter;temNode->lChild = NULL;temNode->rChild = NULL;insertNode(temNode, root);/ 構(gòu)造二叉排序樹的插入節(jié)點(diǎn)子過程void CBinTree:insertNode(SBTNode*& temNode, BTNode*& root)if (root = NULL)root = temNode;elseif (temNode->data > root->dat
26、a)insertNode(temNode, root->rChild);elseinsertNode(temNode, root->lChild);/ 二叉樹的中序遍歷void CBinTree:InOrder(BTNode*& root)if (root = NULL)return;InOrder(root->lChild);cout << root->data << " "InOrder(root->rChild);/ 二叉樹的先序遍歷void CBinTree:PreOrder(BTNode*& r
27、oot)if (root = NULL)return;cout << root->data << " "PreOrder(root->lChild);PreOrder(root->rChild);/ 二叉樹的后續(xù)遍歷void CBinTree:PostOrder(BTNode*& root)if (root = NULL)return;PostOrder(root->lChild);PostOrder(root->rChild);cout << root->data << "
28、; "2main函數(shù)的實(shí)現(xiàn)int main(int argc, char* argv)/ 構(gòu)造一棵二叉排序樹vector<int> xArray;xArray.push_back(10);xArray.push_back(18);xArray.push_back(3);xArray.push_back(8);xArray.push_back(12);xArray.push_back(2);xArray.push_back(7);xArray.push_back(4);CBinTree BT;BT.createBSTree(xArray);/ 樹的遍歷/ 中序遍歷BT.In
29、Order(BT.root);cout << endl;/ 先序遍歷BT.PreOrder(BT.root);cout << endl;/ 后序遍歷BT.PostOrder(BT.root);cout << endl;return 0;實(shí)驗(yàn)三 圖的創(chuàng)立、遍歷及其MST的構(gòu)建一、實(shí)驗(yàn)要求利用C+語言編程實(shí)現(xiàn)二叉樹的構(gòu)建及其先序、中序、后序遍歷算法.二、實(shí)驗(yàn)內(nèi)容1圖的創(chuàng)立2基于深度優(yōu)先的圖的遍歷算法的設(shè)計(jì)與實(shí)現(xiàn)3基于廣度優(yōu)先的圖的遍歷算法的設(shè)計(jì)與實(shí)現(xiàn)4基于Prim算法的最小生成樹的構(gòu)建5基于Kruskal算法的最小生成樹的構(gòu)建三、實(shí)驗(yàn)根本操作1、新建工程1執(zhí)行菜
30、單:文件新建工程,選擇“Win32控制臺(tái)應(yīng)用程序;2更改工程存儲(chǔ)路徑;3更改工程名稱;4點(diǎn)擊“確定。2、添加頭文件與類的聲明1頭文件在#include “stdafx.h之后參加如下語句:#include <vector>#include <map>#include <deque>#include <iostream>using namespace std;2類的聲明在main函數(shù)前參加如下類的聲明:/ 用于存儲(chǔ)圖的節(jié)點(diǎn)及其相鄰節(jié)點(diǎn)的結(jié)構(gòu)體變量類型struct SGNode int key; / 結(jié)點(diǎn)自身標(biāo)識(shí) map<int, float&
31、gt; neighNodes; / 與當(dāng)前結(jié)點(diǎn)相鄰的結(jié)點(diǎn)集合,及其與相鄰結(jié)點(diǎn)之間路徑的權(quán)值 ;/ 用于存儲(chǔ)邊的結(jié)構(gòu)體變量類型struct SGEdge int start;int end;/ 用于存儲(chǔ)邊及其權(quán)重的map容器注意:會(huì)按照權(quán)重自小而大自動(dòng)排序typedef map<float, SGEdge> EdgeSet;class CMyGraphpublic:CMyGraph(void);CMyGraph(void);public: / 其他函數(shù),供實(shí)例調(diào)用 void DFS(); void DFS(int i, vector<int>& mystack,
32、bool* visited); void BFS(); void BFS(int i, deque<int>& mydeque, bool* visited); void Prim(); void Kruskal(); protected: / 屬性變量 /* 自行設(shè)計(jì)完成 */ private: / 成員變量 vector<SGNode> NodeSet;3、添加類的實(shí)現(xiàn)代碼CMyGraph:CMyGraph(void)float g88 = 0, 12,1,0,0,0,0, 4,12,0, 0, 11, 0, 10, 0, 0,1, 0, 0, 9, 2,
33、0, 0, 0,0, 11, 9, 0, 0, 0, 8, 0,0, 0, 2, 0, 0, 0, 5, 3,0, 10, 0, 0, 0, 0, 7, 6,0, 0, 0, 8, 5, 7, 0, 0,4, 0, 0, 0, 3, 6, 0, 0;for (int i = 0; i < 8; i+)SGNode sg;sg.key = i;NodeSet.push_back(sg);for (int i = 0; i < 8; i+)for (int j = 0; j < 8; j+)if (gij != 0)NodeSeti.neighNodes.insert(map&l
34、t;int, float>:value_type(j, gij);vector<SGNode>:iterator iter;for (iter = NodeSet.begin(); iter != NodeSet.end(); iter+)cout << (*iter).key;map<int, float>:iterator iter2;for (iter2 = (*iter).neighNodes.begin(); iter2 != (*iter).neighNodes.end(); iter2+)cout << ", (&q
35、uot; << (*iter2).first << ", " << (*iter2).second << ")"cout << endl;CMyGraph:CMyGraph(void)void CMyGraph:DFS()bool *visited;visited = new bool8;for (int i = 0; i < 8; i+)visitedi = false;vector<int> mystack;DFS(0, mystack, visited);void CMy
36、Graph:DFS(int i, vector<int>& mystack, bool * visited)if (i >= 0 && i < NodeSet.size()if (!visitedi)cout << i << "n"mystack.push_back(i);visitedi = true;map<int, float>:iterator iter;for (iter = NodeSeti.neighNodes.begin(); iter != NodeSeti.neighNo
37、des.end(); iter+)if (!visited(*iter).first)DFS(*iter).first, mystack, visited);if (iter = NodeSeti.neighNodes.end()if (mystack.size() > 0)mystack.pop_back();if (mystack.size() > 0)DFS(mystack.at(mystack.size() - 1), mystack, visited);void CMyGraph:BFS()bool *visited;visited = new bool8;for (in
38、t i = 0; i < 8; i+)visitedi = false;deque<int> mydeque;BFS(0, mydeque, visited);void CMyGraph:BFS(int i, deque<int>& mydeque, bool* visited)if (!visitedi)cout << i << "n"for (map<int, float>:iterator iter = NodeSeti.neighNodes.begin();iter != NodeSeti.n
39、eighNodes.end(); iter+)if (!visited(*iter).first)mydeque.push_back(*iter).first);visitedi = true;while (mydeque.size() > 0)int i = mydeque.at(0);mydeque.pop_front();BFS(i, mydeque, visited);void CMyGraph:Prim()/ 選擇圖中的任一頂點(diǎn)作為起點(diǎn)int start = 0;int s1;set<int> mtSet;mtSet.insert(start);/ 選擇初始節(jié)點(diǎn)fl
40、oat weight;while (1)weight = 100000.0f;/ 人為設(shè)定較大值start = -1;s1 = -1;for (set<int>:iterator iter = mtSet.begin(); iter != mtSet.end(); iter+)map<int, float>:iterator curIter = NodeSet(*iter).neighNodes.begin();while (curIter != NodeSet(*iter).neighNodes.end()/ 當(dāng)前節(jié)點(diǎn)已經(jīng)在集合中if ( mtSet.end() !=
41、 ( mtSet.find( (*curIter).first ) ) )curIter+;continue;/ 當(dāng)前節(jié)點(diǎn)不在集合中,記錄該節(jié)點(diǎn)并作為備選節(jié)點(diǎn)if (*curIter).second < weight) / 選擇權(quán)重最小的邊所邊接的節(jié)點(diǎn)s1 = (*iter);start = (*curIter).first;weight = (*curIter).second;curIter+;if (-1 != start)/ 從備選邊與節(jié)點(diǎn)參加到最小生成樹中mtSet.insert(start);cout << "(" << s1 << ", " << start << ") " << endl;if (mtSet.size() = NodeSet.size()break;void CMyGraph:Kruskal()/ 對(duì)所有邊進(jìn)行排序EdgeSet es;for (int i = 0; i < NodeSet.size(); i+)for (map<int, float>:iterator it
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度木飾面復(fù)合材料研發(fā)與應(yīng)用合同4篇
- 2025年高端餐廳頭灶廚師聘用與管理綜合服務(wù)協(xié)議3篇
- 2025年度產(chǎn)業(yè)園入駐企業(yè)產(chǎn)業(yè)金融服務(wù)合作協(xié)議4篇
- 2025年度瓦屋面施工與屋頂智能控制系統(tǒng)合同
- 2025版安全標(biāo)識(shí)制作安裝及售后服務(wù)合同3篇
- 2025版外資企業(yè)外債借款合同訂立指南3篇
- 2025年中國(guó)果品加工行業(yè)發(fā)展?jié)摿︻A(yù)測(cè)及投資戰(zhàn)略研究報(bào)告
- 2025年中國(guó)斜紋厚薄橡根行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年度住宅小區(qū)新能源汽車充電車位租賃及能源管理協(xié)議4篇
- 2025年磚壞制作項(xiàng)目投資可行性研究分析報(bào)告
- 物業(yè)民法典知識(shí)培訓(xùn)課件
- 2023年初中畢業(yè)生信息技術(shù)中考知識(shí)點(diǎn)詳解
- 2024-2025學(xué)年八年級(jí)數(shù)學(xué)人教版上冊(cè)寒假作業(yè)(綜合復(fù)習(xí)能力提升篇)(含答案)
- 《萬方數(shù)據(jù)資源介紹》課件
- 第一章-地震工程學(xué)概論
- 《中國(guó)糖尿病防治指南(2024版)》更新要點(diǎn)解讀
- 浙江省金華市金東區(qū)2022-2024年中考二模英語試題匯編:任務(wù)型閱讀
- 青島版(五四制)四年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)課件
- 大健康行業(yè)研究課件
- 租賃汽車可行性報(bào)告
- 計(jì)算機(jī)輔助設(shè)計(jì)AutoCAD繪圖-課程教案
評(píng)論
0/150
提交評(píng)論