我是參照《嚴蔚敏數據結構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;
}
隨便畫的一個圖,遍歷如下 無向圖
遍歷結果: