《資料結構與演算法》第六次 圖及圖的遍歷(上)
阿新 • • 發佈:2018-11-05
《資料結構與演算法那》第六次課實驗內容
圖及圖的遍歷(上)
實驗目的:
- 熟悉圖的兩種儲存結構:鄰接矩陣和鄰接連結串列。
- 掌握在圖的鄰接表儲存結構上的遍歷演算法的實現。
實驗內容:
- 開發c++類adjacencyGraph,用鄰接矩陣描述一個無向圖,要求可以手動輸入圖;可刪除一條邊;輸出鄰接矩陣等成員函式,並編寫測試函式。
- 開發c++類linkedGraph,用鄰接連結串列描述一個無向圖,要求可以手動輸入圖;可刪除一條邊;輸出鄰接連結串列等成員函式,並編寫測試函式。
- 兩個儲存方式任選其一完成。
參考提示:
可以參考和中相關成員的實現方法,完成本次實驗內容。
以上圖中的無向圖為例,建立鄰接矩陣並輸出矩陣,然後刪除一條邊再輸出矩陣,程式執行結果如下圖。
實驗程式碼:
江米條想說的:
看圖,上面是 無向圖 的鄰接連結串列,鄰接矩陣
下面是 有向圖 的鄰接連結串列,鄰接矩陣
前面已經用過連結串列的插入,產出等等的啦,今天咱們用矩陣操作一下。
圖和矩陣的關係看這個:(圖摘自《演算法:C語言實現》)
標頭檔案:
#pragma once #include<iostream> using namespace std; class adjacencyGraph { public: adjacencyGraph(int n, int e);//建構函式 void setElement(int n, int value);//設定元素 int getElement(int value);//取到元素 void insertEdge(int vertex1, int vertex2);//插入邊,引數是邊的兩個點 void eraseEdge(int vertex1, int vertex2);//擦出邊 void outputGraph();//輸出 private: int **matrix;//圖得用到二維矩陣 int *element; int numberOfVertices;//頂點數量 int numberOfEdges;//邊數量 }; adjacencyGraph::adjacencyGraph(int n, int e) { numberOfVertices = n; numberOfEdges = e; matrix = new int *[numberOfVertices]; for (int i = 0; i < numberOfVertices; i++)//兩個for迴圈是把二維矩陣置零 matrix[i] = new int[numberOfVertices]; for (int i = 0; i < numberOfVertices; i++) for (int j = 0; j < numberOfVertices; j++) matrix[i][j] = 0; element = new int[numberOfVertices]; } void adjacencyGraph::setElement(int n, int value)// { element[n - 1] = value;//存入頂點的內容,element[0]是第1個頂點的資料,那裡用到n-1了,看清楚! } int adjacencyGraph::getElement(int value)//輸入值,查它是第幾個頂點,這裡因為後面用到插入陣列,所以輸出的第幾個頂點沒+1,如果加了就越界,具體的看下面的主函式的插入時候的兩個引數,你就明白了 { for (int i = 0; i < numberOfVertices; i++) if (element[i] == value) return i; } void adjacencyGraph::insertEdge(int vertex1, int vertex2) { matrix[vertex1][vertex2] = 1; matrix[vertex2][vertex1] = 1;//二維矩陣,插入一個邊的話得在矩陣裡面置兩個1 } void adjacencyGraph::eraseEdge(int vertex1, int vertex2) { matrix[vertex1][vertex2] = 0; matrix[vertex2][vertex1] = 0;//二維矩陣,刪除一個邊的話得在矩陣裡面置兩個0 } void adjacencyGraph::outputGraph() { for (int i = 0; i < numberOfVertices; i++) { for (int j = 0; j < numberOfVertices; j++) cout << matrix[i][j] << " "; cout << endl; } }
主函式:
#include<iostream>
#include"adjacencyGraph.h"
using namespace std;
int main()
{
adjacencyGraph *temp;
temp = new adjacencyGraph(0, 0);
while (1)
{
cout << "1.用鄰接矩陣描述一個無向圖" << endl;
cout << "2.刪除無向圖的一條邊" << endl;
cout << "0.退出" << endl;
int option;
cin >> option;
switch (option)
{
case 1:
{
int n, e;
cout << "請輸入頂點的數目:";
cin >> n;
cout << "請輸入邊的數目:";
cin >> e;
temp = new adjacencyGraph(n, e);
for (int i = 1; i <= n; i++)
{
int value;
cout << "請輸入第" << i << "個頂點";
cin >> value;
temp->setElement(i, value);
}
for (int i = 1; i <= n; i++)
{
int value1, value2;
cout << "請輸入第" << i << "條邊的第1個頂點:";
cin >> value1;
cout << "請輸入第" << i << "條邊的第2個頂點:";
cin >> value2;
temp->insertEdge(temp->getElement(value1), temp->getElement(value2));
}
temp->outputGraph();
}
break;
case 2:
{
int value1, value2;
cout << "請輸入要刪除邊的第一個頂點:";
cin >> value1;
cout << "請輸入要刪除邊的第二個頂點:";
cin >> value2;
temp->eraseEdge(temp->getElement(value1), temp->getElement(value2));
temp->outputGraph();
}
break;
case 0:
return 0;
break;
}
}
}
因為很簡單,就不上程式碼連結啦!一共就這兩個,上面的是.h標頭檔案,下面的是主函式。
完全ODK!
今天無限火力最後一天,明天再更新別的!
共勉!