图的基本操作

原创 2007年09月29日 12:58:00
#define M 20
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/*定义图*/
typedef struct{
 int V
;
 int R
;
 int vexnum;
}Graph;
/*定义队列*/
typedef struct{
 int V
;
 int front;
 int rear;
}Queue;
/*全局变量:访问标志数组*/
int visited
;
/*创建图*/
void creatgraph(Graph *g,int n);
/* 打印图的邻接矩阵 */
void printgraph(Graph *g);
/* 访问顶点 */
void visitvex(Graph *g,int vex);
/* 获取第一个未被访问的邻接节点 */
int firstadjvex(Graph *g,int vex);
/* 获取下一个未被访问的邻接节点(深度遍历) */
int nextadjvex(Graph *g,int vex,int w);
/* 深度递归遍历 */
void dfs(Graph *g,int vex);
void dfstraverse(Graph *g);
/* 初始化队列 */
initqueue(Queue *q);
/* 判断队列是否为空 */
int quempty(Queue *q);
/* 入队操作 */
enqueue(Queue *q,int e);
/* 出队操作 */
dequeue(Queue *q);
/* 广度遍历 */
void BESTraverse(Graph *g);
/* 主程序 */
main()
{
 int n;
 Graph *g=(Graph *)malloc(sizeof(Graph));
 char menu;
 printf("请输入图的顶点个数:/n");
 scanf("%d",&n);
 creatgraph(g,n);
 printf("图的邻接矩阵如下:/n");
 printgraph(g);
input:
 printf("请输入您的选择(b-广度优先遍历,d-深度优先遍历,q-退出): /n");
 while((menu=getchar())=='/n');
 if(menu=='b')
 {
  printf("广度优先遍历结果如下:/n");
  BESTraverse(g);
  printf("/n");
  goto input;
 }
 else if(menu=='d')
 {
  printf("深度优先遍历结果如下:/n");
  dfstraverse(g);
  printf("/n");
  goto input;
 }
 else if(menu=='q')
 {
  exit(0);
 }
 else
 {
  printf("您的输入有误!/n");
 }
}

/*创建图*/
void creatgraph(Graph *g,int n)
{
 int i,j,r1,r2,weight;
 g->vexnum=n;
 /*顶点用i表示*/
 for(i=1;i<=n;i++)
 {
  g->V[i]=i;
 }
 /*初始化R*/
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
   g->R[i][j]=0;
  }
  /*输入R*/
  printf("请输入有关系的两个边及其权重,格式如(0,0,0 代表结束):/n");
  scanf("%d,%d,%d",&r1,&r2,&weight);
  while(r1!=0&&r2!=0&&weight!=0)
  {
   g->R[r1][r2]=weight;
   g->R[r2][r1]=weight;
   scanf("%d,%d,%d",&r1,&r2,&weight);
  }
}
/*打印图的邻接矩阵*/
void printgraph(Graph *g)
{
 int i,j;
 for(i=1;i<=g->vexnum;i++)
 {
  for(j=1;j<=g->vexnum;j++)
  {
   printf("%2d ",g->R[i][j]);
  }
  printf("/n");
 }
}
/*访问顶点*/
void visitvex(Graph *g,int vex)
{
 printf("%d ",g->V[vex]);
}
/*获取第一个未被访问的邻接节点*/
int firstadjvex(Graph *g,int vex)
{
 int w,i;
 for(i=1;i<=g->vexnum;i++)
 {
  if(g->R[vex][i]==1&&visited[i]==0)
  {
   w=i;
   break;
  }
  else
  {
   w=0;
  }
 }
 return w;
}
/*获取下一个未被访问的邻接节点(深度遍历)*/
int nextadjvex(Graph *g,int vex,int w)
{
 int t;
 t=firstadjvex(g,w);
 return t;
}
/*深度递归遍历*/
void dfs(Graph *g,int vex)
{
 int w;
 visited[vex]=1;
 visitvex(g,vex);
 for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))
  if(!visited[w])
  {
   dfs(g,w);
  }
}
void dfstraverse(Graph *g)
{
 int i;
 for(i=1;i<=g->vexnum;i++)
  visited[i]=0;
 for(i=1;i<=g->vexnum;i++)
  if(!visited[i])
  {dfs(g,i);}
}
/*初始化队列*/
initqueue(Queue *q)
{
 q->fr;
 q->rear=0;
}
/*判断队列是否为空*/
int quempty(Queue *q)
{
 if(q->front==q->rear)
 {
  return 0;
 }
 else
 {
  return 1;
 }
}
/*入队操作*/
enqueue(Queue *q,int e)
{
 if((q->rear+1)%M==q->front)
 {
  printf("The queue is overflow!/n");
  return 0;
 }
 else
 {
  q->V[q->rear]=e;
  q->rear=(q->rear+1)%M;
  return 1;
 }
}
/*出队操作*/
dequeue(Queue *q)
{
 int t;
 if(q->front==q->rear)
 {
  printf("The queue is empty!/n");
  return 0;
 }
 else
 {
  t=q->V[q->front];
  q->front=(q->front+1)%M;
  return t;
 }
}
/*广度遍历*/
void BESTraverse(Graph *g)
{
 int i;
 Queue *q=(Queue *)malloc(sizeof(Queue));
 for(i=1;i<=g->vexnum;i++)
 {
  visited[i]=0;
 }
 initqueue(q);
 for(i=1;i<=g->vexnum;i++)
 {
  if(!visited[i])
  {
   visited[i]=1;
   visitvex(g,g->V[i]);
   enqueue(q,g->V[i]);
   while(!quempty(q))
   {
    int u,w;
    u=dequeue(q);
    for(w=firstadjvex(g,u);w>0;w=nextadjvex(g,u,w))
    {
     if(!visited[w])
     {
      visited[w]=1;
      visitvex(g,w);
      enqueue(q,w);
     }
    }
   }
  }
 }
}  
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

ACM_程序设计竞赛:穷举法:DFS(深度优先)

DFS的伪码 从顶点v出发; 访问v相邻且未被访问的顶点w1w_1 依次w2,....,w_2,....,,直到不能继续 退回到出发点v, 若v的领域还有为访问结点,重复上述 //结果:abdcegh...
  • mijian1207mijian
  • mijian1207mijian
  • 2016年03月30日 01:11
  • 631

数据结构 - 图的深度优先遍历(C++)

Boolean visited[MAX_VERTEX_NUM]; //访问标志数组。 Status (*VisitFunc)(int v); //VisitFunc是访问函数,对图的每个顶点调用该函数...
  • chimomo
  • chimomo
  • 2014年02月25日 13:26
  • 10587

图(Graph)的常用代码集合

图的相关概念请查阅离散数学图这一章或者数据结构中对图的介绍。代码来自课本。/*Graph存储结构*/ //邻接矩阵表示法 #define MAX_VERTEX_NUM 20 /*最多顶点个数*/...
  • Solo95
  • Solo95
  • 2016年05月12日 17:48
  • 625

图的深度优先搜索

在介绍完图的定义和基本操作之后,我们这里要介绍图的遍历,图的遍历最基本的就是两种方法,就是DFS(Depth-First-Search)和广度优先搜索,这篇博文先介绍深度优先搜索。   深度优先遍历图...
  • lafengxiaoyu
  • lafengxiaoyu
  • 2016年12月06日 21:18
  • 1158

图论(一)--图的建立

基于算法导论图算法-图的建立 问题描述 问题分析 源代码 结果截图问题描述随机创建一个100个顶点,大约2000条边的有向图以及大约1000条边的无向图,并可以输出每个点的入度和出度(使用邻接表表...
  • deep_kang
  • deep_kang
  • 2017年04月27日 19:52
  • 313

数据结构例程——应用图的深度优先遍历思路求解问题

本文是[数据结构基础系列(7):图]中第4课时[图的邻接矩阵存储结构及算法]的例程。(程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…)1、是否有简单路径? 问题:假设图G...
  • sxhelijian
  • sxhelijian
  • 2015年11月03日 21:45
  • 2331

图的广度优先遍历BFS(邻接矩阵表示法)

图的广度优先遍历BFS(邻接矩阵表示法) 1.前言 复习算法第四章——图中的路径,首先完成算法广度优先遍历,其中使用到了队列结构 2.参考资料 http://blo...
  • u013951778
  • u013951778
  • 2015年10月18日 12:06
  • 276

[数据结构]第七章-图(读书笔记2)

7.2.2 邻接表 邻接表(Adjacency List)是图的一种链式存储结构。在邻接表中,对图中每个定点建立一个单链表,第i个单链表中的结点表示依附于顶点v的边。每个结点由3个域组成,其中邻接点...
  • Last_Impression
  • Last_Impression
  • 2013年10月06日 17:14
  • 835

数据结构-图的基本概念

图是由顶点集V和边E组成。每一条边就是一个点对(v,w)。如果点对是有序的(每一个点的下一个点是固定的),那么图被称为有向图,否则就是无向图。有的时候边还有权或者值。 图的路径是指一个顶点序列,v1...
  • qq_34941745
  • qq_34941745
  • 2016年12月05日 17:55
  • 361

图之有权最短路径-迪杰斯特拉

采用邻接 #include #include #include #define MAXSIZE 20 #define INFINITY 65535 typedef char VertexType...
  • Mrchenyulei
  • Mrchenyulei
  • 2017年02月15日 19:43
  • 296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的基本操作
举报原因:
原因补充:

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