C數據結構學習歷程(6) 圖之鄰接表表示法

我是參照《嚴蔚敏數據結構ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《大話數據結構》來寫的,因爲ppt上有些錯,而視頻上的代碼不全,自己另寫了。ppt上錯哪,我就不指出了,大家可以對照着看,就能發現不同之處。


struct 有3個,層層套用 ,學習struct的靈活運用。

#include<iostream>
using namespace std;



typedef char VertexType; //頂點類型
typedef int EdgeType; //邊上的權值類型
#define MAXVEX 100

typedef struct EdgeNode  //邊表結點
{
	int adjvex;     //鄰接點域,存儲該頂點的下標。怎麼做到呢?是因爲包含關係,被包含VertexNode裏面
	EdgeType weight; //權值
	struct EdgeNode *next;  //鏈域,指向下一個鄰接點


}EdgeNode;

typedef struct VertexNode  //頂點表結點
{
	VertexType data;    //這是頂點的名稱(字母表示),這個和AdjList[MAXVEX] 中下標相對應
	EdgeNode *firstedge;  
}VertexNode,AdjList[MAXVEX];

typedef struct
{
	AdjList adjList;
	int numVertexes,numEdges;  
}GraphAdjList;

//建立圖的鄰接表結構
void CreateALGraph(GraphAdjList *G)
{
	int i,j,k;
	EdgeNode *e;
	cout<<"輸入頂點數和邊數"<<endl;
	cin>>G->numVertexes >>G->numEdges ;
	for(i=0;i<G->numVertexes ;i++)
	{
		cout<<"輸入頂點變量:"<<endl;
		cin>>G->adjList[i].data ;       //建立頂點表
		G->adjList [i].firstedge =NULL; //初始化,還沒有內存,在下面出現
	}
	for(k=0;k<G->numEdges ;k++)    //建立邊表
	{
		cout<<"輸入邊(vi,vj)上的頂點序號:"<<endl;//對於這裏的編號應該與上面的一致,不然的話就用一個函數去求Location()
		cin>>i>>j;
		//向內存申請空間,指針初始化
		e=(EdgeNode *)malloc(sizeof(EdgeNode));
		e->adjvex =j;   //鄰接序號爲j;
		e->next =G->adjList [i].firstedge ;
		G->adjList [i].firstedge=e;      //相當於頭結點一直在動,鏈表裏的頭插法

		//因爲是無向圖,所以需要下面的
		e=(EdgeNode *)malloc(sizeof(EdgeNode));
		e->adjvex =i;   //鄰接序號爲j;
		e->next =G->adjList [j].firstedge ;
		G->adjList [j].firstedge=e;  
	}
}

//鄰接表深度優先

typedef int Boolean;
Boolean visited[MAXVEX];
void DFS(GraphAdjList GL,int i)
{
	EdgeNode *p;
	visited[i]=true;
	cout<<GL.adjList [i].data <<endl;
	p=GL.adjList [i].firstedge ;
	while(p)               //爲空就結束了
	{
		if(!visited[p->adjvex ])
		{
			DFS(GL,p->adjvex);
		}
		p=p->next;
	}

}
void DFSTraverse(GraphAdjList GL)
{
	for(int i=0;i<MAXVEX;i++)
	{
		visited[i]=false;
	}
	for(int i=0;i<GL.numVertexes ;i++)
	{
		if(!visited[i])
		{
			DFS(GL,i);
		}
	}


}


int main()
{

	 GraphAdjList p;
	 CreateALGraph(&p);
	 DFSTraverse(p);

	return 0;
}


隨便畫的一個圖,遍歷如下 無向圖




遍歷結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章