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;
}


随便画的一个图,遍历如下 无向图




遍历结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值