1. 程式人生 > >《資料結構與演算法》第六次 圖及圖的遍歷(上)

《資料結構與演算法》第六次 圖及圖的遍歷(上)

《資料結構與演算法那》第六次課實驗內容

圖及圖的遍歷(上)

實驗目的:

  1. 熟悉圖的兩種儲存結構:鄰接矩陣和鄰接連結串列。
  2. 掌握在圖的鄰接表儲存結構上的遍歷演算法的實現。

實驗內容:

  1. 開發c++類adjacencyGraph,用鄰接矩陣描述一個無向圖,要求可以手動輸入圖;可刪除一條邊;輸出鄰接矩陣等成員函式,並編寫測試函式。
  2. 開發c++類linkedGraph,用鄰接連結串列描述一個無向圖,要求可以手動輸入圖;可刪除一條邊;輸出鄰接連結串列等成員函式,並編寫測試函式。
  3. 兩個儲存方式任選其一完成。

參考提示:

可以參考中相關成員的實現方法,完成本次實驗內容。

以上圖中的無向圖為例,建立鄰接矩陣並輸出矩陣,然後刪除一條邊再輸出矩陣,程式執行結果如下圖。

實驗程式碼:

江米條想說的:

看圖,上面是   無向圖    的鄰接連結串列,鄰接矩陣

           下面是   有向圖    的鄰接連結串列,鄰接矩陣

 

前面已經用過連結串列的插入,產出等等的啦,今天咱們用矩陣操作一下。

圖和矩陣的關係看這個:(圖摘自《演算法: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!

今天無限火力最後一天,明天再更新別的!

共勉!