iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构图如何创建与遍历
  • 922
分享到

C语言数据结构图如何创建与遍历

2023-07-01 05:07:12 922人浏览 泡泡鱼
摘要

本篇内容介绍了“C语言数据结构图如何创建与遍历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 实验目的理解图的基本概念,掌握图的存储结构

本篇内容介绍了“C语言数据结构图如何创建与遍历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、 实验目的

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

二、 实验内容

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

C语言数据结构图如何创建与遍历

具体步骤如下:

  • 将图的邻接矩阵描述为一个二维数组,并将该数组定义为全局变量,以便数据的传递;

  • 定义一个队列,在广度优先搜索时,该队列存储已被访问的路径长度为1,2,…的顶点;

  • 定义访问函数visit()、深度优先搜索函数DFS()和广度优先搜索函数BFS();

  • 主函数实现各函数的调用。

三、 实验工具

Dev-c++

四、 实验代码

//Authors:xiaobei#include<stdio.h>#include<stdlib.h>#define MaxInt 32767#define MVNum 100typedef 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;}

五、 实验结果

C语言数据结构图如何创建与遍历

C语言数据结构图如何创建与遍历

C语言数据结构图如何创建与遍历

C语言数据结构图如何创建与遍历

六、总结与思考

  • 无向图的邻接矩阵是对称的,有向图邻接矩阵可能不对称。

  • 深度优先搜索类似于栈结构的出栈于入栈过程,模拟递归,其实递归也是通过堆栈的形式实现的。

  • 广度遍历是非递归过程,借助队列来实现。

  • 辅助数组需要在全局使用,在主函数外定义。

  • DFS与BFS空间复杂度都是O(n),邻接矩阵时间复杂度都是O(n2),邻接表时间复杂度为O(n+e)。

邻接矩阵示意图:

C语言数据结构图如何创建与遍历

“C语言数据结构图如何创建与遍历”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C语言数据结构图如何创建与遍历

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

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

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

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

下载Word文档
猜你喜欢
  • C语言数据结构图如何创建与遍历
    本篇内容介绍了“C语言数据结构图如何创建与遍历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 实验目的理解图的基本概念,掌握图的存储结构...
    99+
    2023-07-01
  • C语言数据结构图的创建与遍历实验示例
    目录一、 实验目的二、 实验内容三、 实验工具四、 实验代码五、 实验结果六、总结与思考一、 实验目的 理解图的基本概念,掌握图的存储结构,实现图的深度优先搜索遍历算法与广度优先搜索...
    99+
    2024-04-02
  • C语言数据结构创建及遍历十字链表
    目录一、十字链表是什么?二、十字链表的存储结构三、代码实现 1.引入头文件并定义结构体2.建立十字链表3.遍历十字链表4.调用函数本文需要读者有一定的代码基础,了解指针,链...
    99+
    2024-04-02
  • C语言数据结构与算法之图的遍历(二)
    目录前言 广度优先搜索过程主要思想 代码实现  前言  在上一章的内容中我们使用了深度优先搜索来进行遍历,这一章我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:...
    99+
    2024-04-02
  • C语言数据结构与算法图的遍历分析
    这篇文章主要介绍“C语言数据结构与算法图的遍历分析”,在日常操作中,相信很多人在C语言数据结构与算法图的遍历分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法图的遍历分析”的疑惑有所帮助!...
    99+
    2023-06-22
  • C语言数据结构与算法之图的遍历(一)
    目录引入 深度优先搜索代码实现 完整代码  引入  在数据结构中常见的有深度优先搜索和广度优先搜索。为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图: 图是由一些小圆...
    99+
    2024-04-02
  • C语言数据结构与算法中怎样完成图的遍历
    C语言数据结构与算法中怎样完成图的遍历,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言 我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:广度...
    99+
    2023-06-22
  • c语言二叉树怎么创建与遍历
    在C语言中,可以使用结构体来表示二叉树节点,然后通过递归的方式来创建和遍历二叉树。 首先定义一个结构体表示二叉树节点: struct...
    99+
    2024-04-02
  • C语言数据结构系列篇二叉树的遍历
    目录前言:Ⅰ.  定义二叉树0x00 二叉树的概念(回顾)0x00 定义二叉树0x01 手动创建二叉树Ⅱ.  二叉树的遍历...
    99+
    2024-04-02
  • C#中如何创建与遍历DataTable对象
    小编给大家分享一下C#中如何创建与遍历DataTable对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、创建DataTable对象/// <...
    99+
    2023-06-06
  • PHP数据结构中图遍历的示例分析
    这篇文章将为大家详细讲解有关PHP数据结构中图遍历的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图的遍历:深度优先与广度优先树的遍历演化到图的遍历还记得在树的学习中,我们讲到过先序、中序、后序以...
    99+
    2023-06-20
  • C语言二叉树的建立与遍历方法
    本篇内容介绍了“C语言二叉树的建立与遍历方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录这里给一个样例树:总结这里给一个样例树:代码:...
    99+
    2023-06-20
  • C语言线索二叉树的前中后如何创建和遍历
    这篇“C语言线索二叉树的前中后如何创建和遍历”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言线索二叉树的前中后如何创建和...
    99+
    2023-06-29
  • C语言数据结构之二叉链表创建二叉树
    目录一、思想(先序思想创建)二、创建二叉树(1)传一级参数方法(2)传二级参数方法一、思想(先序思想创建) 第一步先创建根节点,然后创建根节点左子树,开始递归创建左子树,直到递归创建...
    99+
    2024-04-02
  • 数据结构——栈(C语言)
    需求:无 栈的概念: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端为栈底。栈中的数据元素遵守后进先出(LIFO)原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈...
    99+
    2023-09-04
    数据结构 c语言 经验分享
  • C语言的struct结构体怎么创建
    本篇内容主要讲解“C语言的struct结构体怎么创建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的struct结构体怎么创建”吧!一、本章重点创建结构体typedef与结构体的渊源匿名结...
    99+
    2023-06-30
  • c语言怎么动态创建结构体
    在C语言中,可以使用动态内存分配函数`malloc()`来动态创建结构体。首先,需要定义一个结构体类型,如下所示:```ctyped...
    99+
    2023-10-10
    c语言
  • C语言如何实现后序遍历
    这篇文章主要介绍“C语言如何实现后序遍历”,在日常操作中,相信很多人在C语言如何实现后序遍历问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现后序遍历”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-16
  • C语言数据结构二叉树先序、中序、后序及层次四种遍历
    目录一、图示展示(1)先序遍历(2)中序遍历(3)后序遍历(4)层次遍历(5)口诀二、代码展示一、图示展示 (1)先序遍历 先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着...
    99+
    2024-04-02
  • C语言数据结构之图书借阅系统
    本文实例为大家分享了C语言实现图书借阅系统的具体代码,供大家参考,具体内容如下   #include <cstdlib> #include <iostream&g...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作