数据结构 — 图之邻接表存储创建和深度优先遍历

原创 2015年11月20日 16:14:40


【描述】:  该graph采用邻接表存储,首先创建图,然后对其进行深度优先遍历。


【输入】:

8
1 2 -1
0 3 4 -1
0 5 6 -1
1 7 -1
1 7 -1
2 7 -1
2 7 -1
3 4 5 6 -1


【输出】:


0 1 3 7 4 5 2 6 


/*
 * 无向图的邻接表创建
8
1 2 -1
0 3 4 -1
0 5 6 -1
1 7 -1
1 7 -1
2 7 -1
2 7 -1
3 4 5 6 -1
*/

#include<iostream>
#include<memory.h>
using namespace std;

#define MAX_VERTICES 50	/* 顶点最大数 */
#define ElementType int	/* 元素的数据类型 */
bool visited[MAX_VERTICES];	/* 记录顶点是否被访问 */

typedef struct node {	/* 表节点结构体 */
	ElementType vertex;
	struct node *next;
}NodeType,*NodePointer;

NodePointer graph[MAX_VERTICES];	/* 头节点数组 */

int vertices;	/* 顶点数量 */

void CreateGraph(){
	ElementType ch;
	NodePointer pnew,qnode;
	pnew = qnode = NULL;

	for(int i = 0; i < vertices; i++){
		cin>>ch;
		if(ch == -1) continue; /*当ch 为-1是结束该vertex的创建*/
		//链表的头节点
		pnew = new NodeType;
		pnew->vertex = ch;
		pnew->next = NULL;
		//将头节点存入 头节点数组
		graph[i] = pnew;
		//尾插法创建链表
		cin>>ch;
		while(ch != -1){
			//申请内存、处理数据域、处理指针域
			qnode = new NodeType;
			qnode->vertex = ch;
			qnode->next =NULL;
			//插入
			pnew->next = qnode;
			//更新尾指针
			pnew = qnode;
			cin>>ch;
		}
	}
}

void dfs(int v){
	NodePointer np;
	//访问该vertex
	visited[v] = true;
	cout<<v<<" ";
	/*
	 * 图深度优先遍历
	 * 1、访问该节点并且记录
	 * 2、当该节点的next节点没被visited,dfs(next节点)
	 * 3、当该节点的next节点都被visited,结束for,退到上一个visited的节点执行2步骤
	 * 4、都被访问了,函数自然结束
	 */
	for(np = graph[v]; np!=NULL; np = np->next){
		if(!visited[np->vertex])
			dfs(np->vertex);
	}

}

int main(){

	memset(visited,false,sizeof(visited));

	cout<<"输入顶点数"<<endl;
	cin>>vertices;

	CreateGraph();
	cout<<"深度优先遍历"<<endl;
	dfs(0);
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

关于邻接表和其深度优先遍历、广度优先遍历的问题

如果有一个邻接表存储的图,以

图---邻接表(建立,深度遍历,广度遍历)

图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。以下代码...
  • akof1314
  • akof1314
  • 2009年07月28日 21:50
  • 36882

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

图的深度优先遍历--邻接表实现

这里用邻接表实现图的深度优先遍历,采用递归实现。 #include using namespace std; #define VERTEXNUM 5//结点数 struct edgenode {...

无向图邻接表的深度优先遍历

#include #include #define Max 50 int visited[Max]; //边表节点 typedef struct EdgeNode { ...

邻接表深度优先遍历和广度遍历

循环 队列头文件:Queue.h #ifndef QUEUE_H #define QUEUE_H #define MAXSIZE 20 typedef struct Node{ int d...

无向图的构建及深度优先遍历---邻接表实现

无向图的构建及深度遍历---临接表实现

图算法:1、邻接表实现图的深度优先遍历,广度优先遍历

原文网址:http://blog.csdn.net/codeforme/article/details/6036864# ALGraph.h [cpp] view plaincopy ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

图的深度优先搜索(邻接表)

图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。 深度优先搜索(Depth First Search)         深度优...
  • furney
  • furney
  • 2012年02月11日 11:29
  • 3629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构 — 图之邻接表存储创建和深度优先遍历
举报原因:
原因补充:

(最多只允许输入30个字)