【数据结构】图的存储和遍历

原创 2012年03月26日 23:05:00
////2012.03.26  by zhengshihao

#include<stdio.h>
#define GRAPHMAX 10
#define FALSE 0
#define TRUE 1
#define Error printf
#define QueueSize 30

typedef struct
{
	char vexs[GRAPHMAX];
	int edges[GRAPHMAX][GRAPHMAX];
	int n,e;
}Mgraph;
int visited[10];
typedef struct
{
	int front,rear,count;
	int data[QueueSize];
}CirQueue;

void InitQueue(CirQueue* q)
{
	q->front=q->rear=0;
	q->count=0;
}

int QueueEmpty(CirQueue* q)
{
	return q->count==0;   
}

int QueueFull(CirQueue* q)
{
	return q->count==QueueSize; 
}

void EnQueue(CirQueue* q,int x)
{
	if(QueueFull(q))
	  Error("Queue overflow");
    else{
    	q->count++;
    	q->data[q->rear]=x;
    	q->rear=(q->rear+1)%QueueSize;
    }
}

int DeQueue(CirQueue* q)
{
	int temp;
	if(QueueEmpty(q)){
		Error("Queue underflow");
		return NULL;
	}
	else{
		temp=q->data[q->front];
		q->count--;
		q->front=(q->front+1)%QueueSize;
		return temp;
	}
}

void CreateMGraph(Mgraph* g)
{
	int i,j,k;
	char ch1,ch2;
	printf("\n\t\t请输入定点数,边数并按回车(格式如:3,4):");
	scanf("%d,%d",&(g->n),&(g->e));
	for(i=0;i<g->n;i++)
	{
		getchar();
		printf("\n\t\t请输入第%d个定点并回车:",i+1);
		scanf("%c",&(g->vexs[i])); 
	}
	for(i=0;i<g->n;i++)
	  for(j=0;j<g->n;j++)
	    g->edges[i][j]=0;
    for(k=0;k<g->e;k++)
    {
    	getchar();
    	printf("\n\t\t请输入第%d条边的顶点序号(格式如:i,j):",k+1);
    	scanf("%c,%c",&ch1,&ch2);
    	for(i=0;ch1!=g->vexs[i];i++);
  	    for(j=0;ch2!=g->vexs[j];j++);
  	    g->edges[i][j]=1;
    }
}

void DFSM(Mgraph* g,int i)
{
	int j;
	printf("\n\t\t深度优先遍历序列:%c\n",g->vexs[i]);
	visited[i]=TRUE;
	for(j=0;j<g->n;j++)
	  if(g->edges[i][j]==1&&!visited[j])DFSM(g,j);
}

void BFSM(Mgraph *g,int k)
{
	int i,j;
	CirQueue q;
	InitQueue(&q);
	printf("\n\t\t广度优先遍历序列:%c\n",g->vexs[k]);
	visited[k]=TRUE;
	EnQueue(&q,k);
	while(!QueueEmpty(&q))
	{
		i=DeQueue(&q);
		for(j=0;j<g->n;j++)
		if(g->edges[i][j]==1&&!visited[j])
		{
			visited[j]=TRUE;
			printf("\n\t\t广度优先遍历序列:%c\n",g->vexs[j]);
			EnQueue(&q,j);
		}
	}
}

void DFSTraverseM(Mgraph* g)  //深度优先遍历 
{
	int i;
	for(i=0;i<g->n;i++)
	visited[i]=FALSE;
	for(i=0;i<g->n;i++)
	if(!visited[i])DFSM(g,i);
}

void BFSTraverseM(Mgraph* g)  //广度优先遍历 
{
	int i;
	for(i=0;i<g->n;i++)
	visited[i]=FALSE;
	for(i=0;i<g->n;i++)
	if(!visited[i])BFSM(g,i);
}
 
int main()
{
	Mgraph *g,a;
	char ch1;
	int i,j,ch2;
	g=&a;
	printf("\n\t\t建立一个有向图的邻接矩阵表示\n");
	CreateMGraph(g);
	printf("已建立一个有向图的邻接矩阵存储\n");
	for(i=0;i<g->n;i++)
	{
		printf("\n\t\t");
		for(j=0;j<g->n;j++)
		printf("%5d",g->edges[i][j]);
	}
	getchar();
	ch1='y';
	while(ch1=='y'||ch1=='Y')
	{
		printf("\n");
		printf("\n\t\t       图的存储和遍历        ");
		printf("\n\t\t*****************************");
		printf("\n\t\t    1----更新邻接矩阵        ");
		printf("\n\t\t    2----深度优先遍历        ");
		printf("\n\t\t    3----广度优先遍历        ");
		printf("\n\t\t    0----退        出        ");
		printf("\n\t\t*****************************");
		printf("\n\t\t  请选择菜单号(0--3):");
		scanf("%d",&ch2);
		getchar();
		switch(ch2)
		{
			case 1:CreateMGraph(g);
			       printf("\n\t\t图的邻接矩阵建立完成\n");break;
            case 2:DFSTraverseM(g);break;
            case 3:BFSTraverseM(g);break;
            case 0:ch1='n';break;
            default:printf("\n\t\t输出错误!请重新输入!");
		} 
	}
}

相关文章推荐

数据结构报告 图的存储与遍历

  • 2013年12月09日 11:27
  • 115KB
  • 下载

图的存储与遍历(数据结构)

  • 2008年12月10日 18:44
  • 124KB
  • 下载

关于图的邻接表存储建立方式及深度遍历的个人理解以及数据结构7.22的算法

 采用codeblock编译器 1.头文件:paint.h #ifndef PAINT        ///必须要有才能被其他文件所识别 #define PAINT ...

数据结构之图(邻接表存储,DFS和BFS遍历)

以下代码创建的图是无向,无权图,并且使用邻接表表示图。部分代码参考严蔚敏的数据结构。 一:main部分 #include #include using namespace std; struct...
  • LaoJiu_
  • LaoJiu_
  • 2015年12月23日 21:28
  • 5876

数据结构——图的遍历和存储

可能本人比较懒,图的邻接表用到了C++STL里面的vector,不过思路是一样的 代码: #include #define N 1009 using namespace std; typedef ...

数据结构:图的存储、图的遍历、最小生成树、最短路径、拓扑排序

一、基本术语图:由有穷、非空点集和边集合组成,简写成G(V,E); Vertex:图中的顶点; 无向图:图中每条边都没有方向; 有向图:图中每条边都有方向; 无向边:边是没有方向的,写为(a,b) 有...

数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径

数据结构存储integerini算法string import java.util.ArrayList;      import java.util.List;             // 模...

数据结构-图-as3实现-有向图 图存储(邻接矩阵),广度深度遍历

图类代码: package { public class AdjMatrixGraph { private var vertexlist:SeqList;  // 顺序表存储图的顶点集合  ...

数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径

import java.util.ArrayList;      import java.util.List;             // 模块E      public class...

数据结构——图(概念,存储,遍历)

1、图的概念         图由点集合和边集合组成,记做G=(V,E),其中点集合不能为空且应该有穷,边集合可以为空。有关图的部分概念如下:    1)、有向图:边有方向,用表示;无向图:边没...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据结构】图的存储和遍历
举报原因:
原因补充:

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