广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构图的创建与遍历实验示例
  • 380
分享到

C语言数据结构图的创建与遍历实验示例

2024-04-02 19:04:59 380人浏览 薄情痞子
摘要

目录一、 实验目的二、 实验内容三、 实验工具四、 实验代码五、 实验结果六、总结与思考一、 实验目的 理解图的基本概念,掌握图的存储结构,实现图的深度优先搜索遍历算法与广度优先搜索

一、 实验目的

理解图的基本概念,掌握图的存储结构,实现图的深度优先搜索遍历算法与广度优先搜索遍历算法。

二、 实验内容

利用邻接矩阵描述示例图,编写程序输出示例图的深度优先搜索和广度优先搜索的遍历序列。

具体步骤如下:

  • 将图的邻接矩阵描述为一个二维数组,并将该数组定义为全局变量,以便数据的传递;
  • 定义一个队列,在广度优先搜索时,该队列存储已被访问的路径长度为1,2,…的顶点;
  • 定义访问函数visit()、深度优先搜索函数DFS()和广度优先搜索函数BFS();
  • 主函数实现各函数的调用。

三、 实验工具

Dev-c++

四、 实验代码

//Authors:xiaobei
#include<stdio.h>
#include<stdlib.h>
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
//定义图结构
typedef struct{
 VerTexType vexs[MVNum];
 ArcType arcs[MVNum][MVNum];
 int vexnum,arcnum;
}AMGraph;
//定义辅助链队
typedef struct Qnode{
 char data;
 struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
 QueuePtr front;
 QueuePtr rear;
}LinkQueue;
//定义全局辅助数组visited[MVNum]
int visited[MVNum];
//函数返回定点下标
int LocateVex(AMGraph G,char v){
 int i;
 for(i=0;i<G.vexnum;i++)
  if(G.vexs[i]==v)
   return i;
  return -1;
}
//函数访问并输出顶点,返回下标
int visit(AMGraph G,char v){
 int i;
 for(i=0;i<G.vexnum;i++)
  if(v==G.vexs[i])
   printf("%c",v);
 return LocateVex(G,v);
}
//函数创建无向图,以邻接矩阵形式
int CreateUDN(AMGraph &G){
 int i,j,k,v1,v2,w;
 printf("[输入总顶点数和边数:]\n>>>");
 scanf("%d %d",&G.vexnum,&G.arcnum);
 for(i=0;i<G.vexnum;i++)
 {
  getchar();
  printf("[依次输入各顶点的信息:]\n>>>");
  scanf("%c",&G.vexs[i]);
 }
 for(i=0;i<G.vexnum;i++)
  for(j=0;j<G.vexnum;j++)
   G.arcs[i][j] = MaxInt;
 for(k=0;k<G.arcnum;k++){
  getchar();
  printf("[输入一条边依附的顶点及权值:]\n>>>"); 
  scanf("%c %c %d",&v1,&v2,&w);
  i = LocateVex(G,v1);
  j = LocateVex(G,v2);
  G.arcs[i][j]=w;
  G.arcs[j][i]=G.arcs[i][j];
 }
 return 1;
}
//函数深度遍历连通图
void DFS_AM(AMGraph G,char v){
 int w,u;
 u = visit(G,v);
 visited[u] = 1;
 for(w=0;w<G.vexnum;w++){
  if((G.arcs[u][w]<MaxInt) && (!visited[w]))
   DFS_AM(G,G.vexs[w]);
 }
}
//函数初始化链队
void InitQueue(LinkQueue &Q){
 Q.front = Q.rear = (QNode*)malloc(sizeof(QNode));
 Q.front->next=NULL;
}
//函数数据进队
void EnQueue(LinkQueue &Q,char e){
 QueuePtr p;
 p = (QNode*)malloc(sizeof(QNode));
 p->data = e;
 p->next = NULL;
 Q.rear->next=p;
 Q.rear = p;
}
//函数数据出队
void DeQueue(LinkQueue &Q,char &e){
 QueuePtr p;
 if(Q.front==Q.rear);
 else
 {
  p = Q.front->next;
  e = p->data;
  Q.front->next = p->next;
  if(Q.rear==p)
   Q.rear=Q.front;
  free(p);
 }
}
//函数判断链队是否为空
int QueueEmpty(LinkQueue Q){
 if(Q.front==Q.rear)
  return 1;
 else
  return 0;
}
//函数返回顶点下一个邻接点下标
int FirstAdjVex(AMGraph G,int c){
 int j;
 for(j=0;j<G.vexnum;j++)
  if(G.arcs[c][j]<MaxInt && visited[j]==0)
   return j;
  return -1;
}
//函数返回顶点下一个相对邻接点下标
int NextAdjVex(AMGraph G,int c,int w){
 int j;
 for(j=0;j<G.vexnum;j++)
  if(G.arcs[c][j]<MaxInt && visited[j]==0)
   return j;
  return -1;
}
//函数广度遍历连通图
void BFS_AM(AMGraph G,char v){
 int c,w,i;
 char u;
 LinkQueue Q;
 c = visit(G,v);
 visited[c] = 1;
 InitQueue(Q);
 EnQueue(Q,v);
 while(!QueueEmpty(Q)){
  DeQueue(Q,u);
  c = LocateVex(G,u);
  for(w=FirstAdjVex(G,c);w>=0;w=NextAdjVex(G,c,w))
  {
   if(!visited[w]){
    i = visit(G,G.vexs[w]);
    visited[i] = 1;
    EnQueue(Q,G.vexs[w]);
   }
  }
 }
}
//菜单打印
void Menu(){
 printf("\n————————菜单————————\n");
 printf("\n1.创建图结构;\n");
 printf("\n2.深度遍历(DFS);\n");
 printf("\n3.广度遍历(BFS);\n");
 printf("\n0.退出;\n");
 printf("\n——————————————————\n");
 printf("[请输入你的选择:]\n>>>");
}
//主函数
int main(){
 int i,user;
 char v;
 AMGraph G;
 while(1){
  Menu();
  scanf("%d",&user);
  switch(user){
  case 1:{
   CreateUDN(G);
   break;
  }
  case 2:{
   //初始化辅助数组
   for(i=0;i<G.vexnum;i++)
    visited[i] = 0;
   printf("[请输入遍历开始的顶点:]\n>>>");
   getchar();
   scanf("%c",&v);
   DFS_AM(G,v);
   break;
  }
  case 3:{
   //初始化辅助数组
   for(i=0;i<G.vexnum;i++)
    visited[i] = 0;
   printf("[请输入遍历开始的顶点:]\n>>>");
   getchar();
   scanf("%c",&v);
   BFS_AM(G,v);
   break;
  }
  case 0:{
   exit(0);
   break;
  }
  }
 }
 return 0;
}

五、 实验结果

六、总结与思考

  • 无向图的邻接矩阵是对称的,有向图邻接矩阵可能不对称。
  • 深度优先搜索类似于栈结构的出栈于入栈过程,模拟递归,其实递归也是通过堆栈的形式实现的。
  • 广度遍历是非递归过程,借助队列来实现。
  • 辅助数组需要在全局使用,在主函数外定义。
  • DFS与BFS空间复杂度都是O(n),邻接矩阵时间复杂度都是O(n2),邻接表时间复杂度为O(n+e)。

邻接矩阵示意图:

以上就是C语言数据结构图的创建与遍历实验示例的详细内容,更多关于C语言数据结构图的创建遍历的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言数据结构图的创建与遍历实验示例

本文链接: https://www.lsjlt.com/news/150689.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构图的创建与遍历实验示例
    目录一、 实验目的二、 实验内容三、 实验工具四、 实验代码五、 实验结果六、总结与思考一、 实验目的 理解图的基本概念,掌握图的存储结构,实现图的深度优先搜索遍历算法与广度优先搜索...
    99+
    2022-11-13
  • C语言数据结构图如何创建与遍历
    本篇内容介绍了“C语言数据结构图如何创建与遍历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 实验目的理解图的基本概念,掌握图的存储结构...
    99+
    2023-07-01
  • C语言数据结构与算法图的遍历分析
    这篇文章主要介绍“C语言数据结构与算法图的遍历分析”,在日常操作中,相信很多人在C语言数据结构与算法图的遍历分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法图的遍历分析”的疑惑有所帮助!...
    99+
    2023-06-22
  • C语言数据结构与算法之图的遍历(一)
    目录引入 深度优先搜索代码实现 完整代码  引入  在数据结构中常见的有深度优先搜索和广度优先搜索。为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图: 图是由一些小圆...
    99+
    2022-11-12
  • C语言数据结构与算法之图的遍历(二)
    目录前言 广度优先搜索过程主要思想 代码实现  前言  在上一章的内容中我们使用了深度优先搜索来进行遍历,这一章我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:...
    99+
    2022-11-12
  • C语言数据结构创建及遍历十字链表
    目录一、十字链表是什么?二、十字链表的存储结构三、代码实现 1.引入头文件并定义结构体2.建立十字链表3.遍历十字链表4.调用函数本文需要读者有一定的代码基础,了解指针,链...
    99+
    2022-11-12
  • C语言数据结构与算法中怎样完成图的遍历
    C语言数据结构与算法中怎样完成图的遍历,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言 我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:广度...
    99+
    2023-06-22
  • PHP数据结构中图遍历的示例分析
    这篇文章将为大家详细讲解有关PHP数据结构中图遍历的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图的遍历:深度优先与广度优先树的遍历演化到图的遍历还记得在树的学习中,我们讲到过先序、中序、后序以...
    99+
    2023-06-20
  • C语言数据结构系列篇二叉树的遍历
    目录前言:Ⅰ.  定义二叉树0x00 二叉树的概念(回顾)0x00 定义二叉树0x01 手动创建二叉树Ⅱ.  二叉树的遍历...
    99+
    2022-11-13
  • C语言植物大战数据结构堆排序图文示例
    目录TOP.堆排序前言一、向下调整堆排序1.向下调整建堆建堆的技巧建堆思路代码2.向下调整排序调整思路排序整体代码3.时间复杂度(难点)向下建堆O(N)向下调整(N*LogN)二、向...
    99+
    2022-11-13
  • C语言数据结构之绪论的示例分析
    小编给大家分享一下C语言数据结构之绪论的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!绪论什么是数据结构?不同于计算机操作培训,注意与程序设计的区别。Ex...
    99+
    2023-06-20
  • C语言植物大战数据结构快速排序图文示例
    目录快速排序一、经典1962年Hoare法1.单趟排序2.递归左半区间和右半区间3.代码实现二、填坑法(了解)1.单趟思路2.代码实现三、双指针法(最佳方法)1.单趟排序2.具体思路...
    99+
    2022-11-13
  • C语言编程数据结构栈与队列的全面讲解示例教程
    目录一、栈的表示和实现1栈的概念和结构2栈的初始化3压栈(栈顶插入一个数据)4出栈(栈顶删除一个数据)5取栈顶元素6取栈顶元素7判断栈是否为空二、队列的表示和实现1队列的概念及结构2...
    99+
    2022-11-12
  • C语言数据结构之队列的定义与实现
    目录一、队列的性质二、队列的结构三、代码实现头文件功能函数一、队列的性质 上次我们学习栈,了解到栈储存释放数据的方式是:先进后出 而队列与其相反,队列是:先进先出,后进后出。 二、队...
    99+
    2022-11-13
  • C语言数据结构实例讲解单链表的实现
    目录1、单链表2、单链表的实现头文件函数的实现(1)打印链表(2)动态申请结点(3)尾插(4)头插(5)尾删(6)头删(7)查找(8)在pos之前插入(9)删除pos(10)在pos...
    99+
    2022-11-13
  • C语言数据结构之栈与队列的相互实现
    目录一、用对列实现栈代码实现二、用栈实现队列代码实现一、用对列实现栈 题干要求: 细节分析:队列是先进先出; 要实现的栈是先进后出。 解题思路:假设:先用一个队列储存数据 N 个,...
    99+
    2022-11-13
  • C语言数据结构与算法时间空间复杂度实例分析
    这篇文章主要介绍“C语言数据结构与算法时间空间复杂度实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言数据结构与算法时间空间复杂度实例分析”文章能帮助大家解决问题。时间复杂度来看第一个:l...
    99+
    2023-06-29
  • C语言数据结构与算法之队列的实现详解
    目录队列的概念及结构队列的实现Queue.hQueue.cTest.c队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FI...
    99+
    2022-11-13
    C语言数据结构 队列 C语言 队列实现 C语言 队列
  • C语言数据结构之算法的时间复杂度实例分析
    这篇文章主要讲解了“C语言数据结构之算法的时间复杂度实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言数据结构之算法的时间复杂度实例分析”吧!1、算法的复杂度算法在编写成可执行程序...
    99+
    2023-06-30
  • 构建高性能的数据存储与检索系统:Go语言开发经验总结
    构建高性能的数据存储与检索系统:Go语言开发经验总结引言:随着大数据和云计算时代的到来,数据存储和检索成为了现代计算的重要组成部分。构建高性能的数据存储与检索系统,是提高计算效率和数据处理速度的重要手段之一。本文将从Go语言开发的角度,总结...
    99+
    2023-11-20
    Go语言 构建 高性能 数据存储 检索系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作