图的操作

//图
#include <stdio.h>
#include <stdlib.h>

#define MaxNum 100
typedef char Type;

//邻接矩阵类型定义
typedef struct
{
Type vexs[MaxNum];
int edges[MaxNum][MaxNum];
int Vertex_num,edge_num;
}MGraph;

//邻接表类型定义
typedef struct node
{
int adjvex;
struct node *next;
}EdgeNode;

typedef struct
{
struct
{
  Type vertex;
  EdgeNode * firstedge;
}VertexNode[MaxNum];
int Vertex_num,edge_num;

}ALGraph;

//为图G建立邻接矩阵
void CreateMGraph(MGraph *G)
{
int i,j,k;
printf("请输入顶点数:");
scanf("%d",&G->Vertex_num);//输入顶点数和边数
printf("请输入边数:");
scanf("%d",&G->edge_num);

printf("请输入顶点数信息(例如:若有5个顶点,则连续输入ABCDE):");
flushall();
for(i=0;i<G->Vertex_num;i++)
{
  scanf("%c",&G->vexs[i]); //输入顶点信息,建立顶点表
}

for(i=0;i<G->Vertex_num;i++)     //初始化邻接矩阵各元素值为0
  for(j=0;j<G->Vertex_num;j++)
   G->edges[i][j]=0;

printf("注意:顶点序列对应点的序号是从0起始编号,即0,1,2,···\n");
printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j<cr>):\n");

for(k=0;k<G->edge_num;k++)
{
  for(i=0;i<G->Vertex_num;i++)
   printf("%c(%d)",G->vexs[i],i);
  printf("\n");
  printf("请输入第%d条边:",k+1);
  scanf("%d,%d",&i,&j);   //输入e条边,建立邻接矩阵
  if(i<0 || i>=G->Vertex_num || j<0 || i>=G->Vertex_num)
  {
   printf("输入出错!\n");
   k--;
   continue;
  }
  printf("(%c--%c)\n",G->vexs[i],G->vexs[j]);
  G->edges[i][j]=1;
  G->edges[j][i]=1;  //若为有向图建立邻接矩阵,该句舍弃
}
}

//深度优先搜索遍历函数
//第一个形参MGraph * G是指要遍历的图的存储结构
//第二个形参int v是指从序号为V的顶点开始深度优先遍历图
//第三个形参int *visited指向访问数组,指示顶点是否被访问过

void dfs(MGraph *G,int v,int *visited)
{
int i;
*(visited+v)=1;   //标识序号为v的顶点被访问过
printf("访问过的顶点式:%d---%c\n",v,G->vexs[v]);

for(i=0;i<G->Vertex_num;i++) //查找当前顶点的邻接顶点
  if(G->edges[v][i]=1)   //邻接顶点找到
   if(*(visited+i)!=1)
    dfs(G,i,visited);

}

void clear()       //清屏
{
system("pause");
system("cls");
}
//深度优先遍历图
void Depth_first_graph(MGraph *G)
{
int visited[MaxNum];
int i;

//初始化visited数组,该数组每一个元素对应图的一个顶点,用来标识顶点是否被访问过
for(int i=0;i<MaxNum;i++)
  visited[i]=0;
  i=0;
do
{
  printf("从顶点%c开始进行深度优先遍历\n",G->vexs[i]);
  dfs(G,i,visited);  //对图进行深度优先搜索遍历
  for(;i<G->Vertex_num;i++)
   if(visited[i]==0)
    break;
}while(i<G->Vertex_num);
}

//为图G建立邻接表
void CreateALGraph(ALGraph *G)
{
int i,j,k;
EdgeNode *s;

printf("请输入顶点数");
scanf("%d",&G->Vertex_num);
printf("请输入边数:");
scanf("%d",&G->edge_num);
printf("请输入顶点信息(例如:若有5个顶点,则连续输入ABCDE):");
flushall();
for(i=0;i<G->Vertex_num;i++)
{
  scanf("%c",&G->VertexNode[i].vertex);
  G->VertexNode[i].firstedge=NULL;
}

printf("注意:顶点的序列对应的序号从0开始编号,即0,1,2,···\n");
printf("请输入每条边对应的两个顶点的序号(输入格式为:ij<cr>):\n");
for(k=0;k<G->edge_num;k++)
{
  for(i=0;i<G->Vertex_num;i++)
   printf("%c(%d)",G->VertexNode[i].vertex,i);
  printf("\n");

  printf("请输入第%d条边:",k+1);
  scanf("%d,%d",&i,&j);  //读入边的两顶点的对应的序号

  if(i<0||i>=G->Vertex_num||j<0||i>=G->Vertex_num)
  {
   printf("输入出错!\n");
   k--;
   continue;
  }
  printf("(%c--%c)\n",G->VertexNode[i].vertex,G->VertexNode[j].vertex);
  s=new(EdgeNode);
  s->adjvex=j;  //邻接点序号为j
  s->next=G->VertexNode[i].firstedge;

  G->VertexNode[i].firstedge=s;
  s=new(EdgeNode);    //再申请一个新边表结点
  s->adjvex=i;   //邻接点序号为i
  s->next=G->VertexNode[j].firstedge; //将新边表结点s插入到序号为J的顶点的边表头部

  G->VertexNode[j].firstedge=s;
 
}
}

//孤独优先搜索遍历函数
//第一个形参ALGraph *G是指要遍历的图的存储结构
//第二个形参int V 是指从序号为V的顶点开始广度优先遍历图
//第三个形参int *visited指向访问数组,表示顶点是否被访问过
void bfs(ALGraph *G,int v,int *visited)
{
int quene[MaxNum],front=0,rear=1; //定义一个队列
EdgeNode *p; //定义边指针
*(visited+v)=1;
printf("现在访问的顶点式:%d--%c\n",v,G->VertexNode[v].vertex); //输出正访问的顶点

if(front==rear)
  exit(1);//队列满,溢出
quene[rear]=v;//把访问过的点放入队列中
rear=(rear+1)%MaxNum;
while((front+1)!=rear)   //队列不空
{
  front=(front+1)%MaxNum;   //一个顶点出队
  v=quene[front];
  p=G->VertexNode[v].firstedge;
  while(p)
  {
   if(visited[p->adjvex]==0)//判断p->adjvex是否被访问过
   {
    visited[p->adjvex]=1; //若没有,则对其进行访问
    printf("访问的顶点是:%d--%c\n",p->adjvex,G->VertexNode[p->adjvex].vertex);//输出正访问的结点
    if(front==rear)
     exit(1);
    quene[rear]=p->adjvex;
    rear=(rear+1)%MaxNum;
   }
   p->next;
  }
}

}

//广度优先遍历图
void Breadth_first_graph(ALGraph *G)
{
int i,visited[MaxNum];

//初始化visited数组,该数组的每一个元素对应图的每一个顶点是否被访问过
for(i=0;i<MaxNum;i++)
  visited[i]=0;
i=0;
do
{
  printf("从顶点%c开始进行广度优先搜索遍历\n",G->VertexNode[i].vertex);
  bfs(G,i,visited);//对图进行深度优先搜索遍历
  for(;i<G->Vertex_num++;i++)
   if(visited[i]==0)
    break;
}while(i<G->Vertex_num);
}

void showmenu()
{
printf("\n\n\n");
printf("                  --图的遍历--                 \n");
printf("****************************************************\n");
printf("*       1------用邻接矩阵表表示一个图              *\n");
printf("*       2------深度优先搜索遍历图(邻接矩阵表)    *\n");
printf("*       3------用邻接表表示一个图                  *\n");
printf("*       4------广度优先搜索遍历图(邻接矩阵表)    *\n");
printf("*                                                  *\n");
printf("*       0------退出                                *\n");
printf("****************************************************\n");
printf("请选择菜单号(0-4):");

}

void graphOP()
{
char choice ='N';
int adjacency_martrix=0;
int adjacency_list=0;//标志位邻接表是否存在

MGraph G;
ALGraph T;
while(choice!=0)
{
  showmenu();
  flushall();
  scanf("%c",&choice);
  switch(choice)
  {
  case '1':
   CreateMGraph(&G);
   adjacency_martrix=1;
      clear();
   break;

  case '2':
   if(adjacency_martrix)
   {
    Depth_first_graph(&G);
   }
   else
   {
    printf("请先输入图的顶点信息!\n");
   }
   clear();
   break;
  case '3':
   CreateALGraph(&T);//创建图的邻接表
   adjacency_list=1;
   clear();
   break;
  case '4':
   if(adjacency_list)
   {
    Breadth_first_graph(&T);
   }
   else
   {
    printf("请输入图的顶点信息!\n");
   }
   clear();
   break;
  case '0':
   printf("\n\t程序结束!\n");
   break;

  default:
   printf("\n\t输入错误,请重新输入!\n");

  }
}

}

void main()
{
graphOP();
}

时间: 2024-10-26 07:44:00

图的操作的相关文章

动态-线性表、树、图的操作和演示

问题描述 线性表.树.图的操作和演示 那个动态演示怎么弄 啊.以动画形式演示在其上的插入.查找.删除等操作. 解决方案 是不是数据结构课件中的演示~~~ 解决方案二: 动画?也就是说不是编程来实现动画,可以考虑动画制作软件来实现.

kali-metasploit如何打开msfgui图形化操作界面

问题描述 metasploit如何打开msfgui图形化操作界面 用kali自带的metasploit,打开的是命令行操作,怎么打开msfgui界面?还是需要安装什么插件. 解决方案 http://zhidao.baidu.com/link?url=SUnHtd-5Tdo2OPdwWhUpBWyhcubX4-6fVwusheBFYPUQd1IAfNl1ZxRnQvE6aNaDZk-VbTUfCHMzqSkDhA-svOGpvRbE_iIVD5lrc5Rvi4O 解决方案二: 怎么返回上一级呢 -

快速上手MySQL-图形化操作详解

一.MySQL下载与安装     1.下载介绍   MySQL相信大家一定听说过,如果不知道它是干什么的,可以去google一下.  MySQL的大本营:http://www.mysql.com/  MySQL的下载地址:http://dev.mysql.com/downloads/   因为要从这个地址下载不少东东,所以详细分析一下这个网页.     ● 关于镜像网站,没有大陆的,有香港和台湾的.选择它,是为了加快下载速度,不过也不是绝对的,我经常就从北美的镜像下载,速度反而更快些.    ●

Oracle中使用PL/SQL操作COM对象

PL/SQL是由Oracle公司对标准SQL进行扩展,专用于Oracle数据库中程序设计的专用语言,属第三代过程式程序设计语言.从Oracle8开始提供了直接从PL/SQL中调用外部C语言过程,允许开发人员用PL/SQL进行使用C语言编制的程序模块.从Oracle8i开始,又引入了Java程序. 在本文中主要介绍外部例程的基本原理以及使用条件,介绍如何通过引用外部例程来操作Windows中的COM对象,并做了一个操作Excel对象的示例. 本文的运行环境全部建立在Oracle9i和Windows

图解MySQL数据库的安装和操作

mysql|数据|数据库     一.MySQL下载与安装 1.下载介绍 MySQL相信大家一定听说过,如果不知道它是干什么的,可以去google一下. MySQL的大本营:http://www.mysql.com/ MySQL的下载地址:http://dev.mysql.com/downloads/ 因为要从这个地址下载不少东东,所以详细分析一下这个网页. · 关于镜像网站,没有大陆的,有香港和台湾的.选择它,是为了加快下载速度,不过也不是绝对的,我经常就从北美的镜像下载,速度反而更快些. ·

2345看图王介绍

什么是2345看图王? 2345看图王是2345推出的一款速度最快并且格式兼容最多的高清看图软件,支持常用的jpg.bmp.gif.tiff.png等多达67种格式图片的查看. 为什么要使用2345看图王? 1.快速 2345看图王使用了全球最快的强劲图像引擎,即使在低配置电脑上,也能闪电般打开十几兆的大图片; 2345看图王配合同为2345旗下产品的"好压"相结合使用,不需要等待漫长的解压缩,即点即看压缩包内图片; 2345看图王的快速还体现在图片的缩放上,它的放大率更是可以高达16

2345看图王鸟瞰图功能使用介绍

什么是鸟瞰图功能? 鸟瞰图是2345看图王为方便用户更好的定位大图的局部和细节所采用的图片缩略展示功能.当图片被放大查看时,因为受到电脑界面尺寸的限制,图片只能被局部看到,这样就不方便用户定位到整个图片的某个细节部分,所以我们为用户提供了鸟瞰图的功能,当您需要看图片细节放大图片时,界面的右下方会出现一个鸟瞰图,从这个缩略图上您可以看到整张图片,并且当您用鼠标在鸟瞰图上移动时就可以定位移动界面的位置. 如何使用鸟瞰图功能? 鸟瞰图功能是2345看图王为方便用户更好的定位大图的局部和细节所采用的图片

美图看看实用快捷键

作为一款最快的万能看图软件,美图看看可以大幅度提升浏览图片的速度,叫起高清大图看图更流畅快捷.如果你觉得光是鼠标操作还不够"风驰电掣",那不如学习一下美图看看的快捷键操作,更加方便快捷的操作体验相信不会令你失望.还不知道在美图看看中有哪些快捷键可用?那就请仔细往下看吧: 一.美图看看主界面相关快捷键 启动美图看看进入图片文件夹(如图01),我们可以通过如图02所示快捷键来提升操作速度: 图01 美图看看主界面 图02 操作快捷键示意 二.大图浏览窗口相关快捷键 双击图片进入美图看看大图

拖拖我的家户型图怎么用

  拖拖我的家户型图怎么用 导入户型图:可直接导入格式为*.jpg的文件,作为底图进行临摹.用描图的方法实现直观快速的三维设计. 拖拖我的家导入户型图操作方法: 点击导入户型图菜单,选择所需导入户型图(图的格式必须为*JPG).输入估计的横向(或竖向尺寸).点确定将图导入操作界面. 用操作视图下方的放大/缩小/或窗口缩放按钮把图调至合适大小,然后用直墙等结构功能依照导入的图型描绘户型结构,并依次绘制地面.插门窗赋材质等. 注意:横向跨度为整个房间的横向尺寸加上图纸的空白横向部分.