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

原创 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输出错误!请重新输入!");
		} 
	}
}

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

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

数据结构图的建立和遍历(邻接表、邻接矩阵)

首先是图的存储结构:一、邻接矩阵存储方式实现邻接矩阵存储的结构体中,包括一个存储边的结构体,存储每条边的信息(权值) 将这个边的结构体的二维数组作为图的基本存储结构,放到单个图的结构体中 每个图又...
  • kuronekonano
  • kuronekonano
  • 2017年11月28日 17:49
  • 375

图的存储与遍历

一、图的主要存储方式主要有两种: 1.邻接表表示; 2.数组表示; 其中邻接表适用于稀疏图,数组表示法适用于稠密图。由邻接表表示延伸开的还有十字链表法等。本文利用邻接表表示图,实现图的存储与遍历...
  • u010056149
  • u010056149
  • 2015年01月25日 14:46
  • 933

图的存储结构及遍历算法

一、图的存储结构 1.1 邻接矩阵     图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。     设图G有n个顶点,...
  • dageda1111
  • dageda1111
  • 2014年03月09日 16:59
  • 1419

图存储与遍历的一些技巧

图的存储有多重方式,即使都是邻接表也会有不同的形式。同时图的遍历采用一些小技巧可以加速图的遍历效率,从而提高程序的执行效率。...
  • woniu317
  • woniu317
  • 2015年02月27日 14:33
  • 961

数据结构之 图的存储结构和遍历方式

// 图.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "malloc.h" #define maxSize 100 typedef...
  • zhujunxxxxx
  • zhujunxxxxx
  • 2013年10月03日 00:01
  • 3922

数据结构(16)--图的存储及实现

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社         图状结构是一种比树形结构更复杂的非线性结构。在树状结构中,结点间具有分支层次关系,每一层上的结点只能和上一层中的至多一个结...
  • u010366748
  • u010366748
  • 2016年03月03日 18:28
  • 5027

数据结构图的存储于遍历

原文地址:http://blog.chinaunix.net/uid-26548237-id-3483650.html 一、图的存储结构 1.1 邻接矩阵     图的邻接矩阵存储方...
  • wangqing_12345
  • wangqing_12345
  • 2017年06月14日 16:16
  • 269

图的存储和遍历C++实现

最近在做一些OJ题目时,感觉自己图的应用还不够熟练。所以又翻书看别人的博客复习了一下,现把图的常用内容总结如下: 图的常用存储方法有:邻接矩阵和邻接表 遍历方法有:按深度遍历(DFS),按广度遍历(B...
  • a375849201893857
  • a375849201893857
  • 2015年06月18日 16:33
  • 2024

数据结构之图:图的存储结构和遍历

文章出处:http://blog.chinaunix.net/uid-26548237-id-3483650.html 一、图的存储结构 1.1 邻接矩阵     图的邻接矩阵存储方式是用两个...
  • STRAVELER
  • STRAVELER
  • 2015年06月26日 16:38
  • 466
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据结构】图的存储和遍历
举报原因:
原因补充:

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