我是参照《严蔚敏数据结构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;
}
随便画的一个图,遍历如下 无向图
遍历结果: