数据结构实验–图及其应用

(代码有一些纰漏 仅供自己后期修改保存用)

数据结构上机实验

题目:设计并验证如下算法:

带权图采用邻接表表示,实现无向图的广度优先搜索BFS与有向图的深度优先搜索DFS。

#define MAX_VERTEX_NUM 20    //图的邻接表存储表示
typedef struct ArcNode{int adjvex;  //该弧所指向的顶点的位置
struct ArcNode *nextarc;     //指向下一条弧的指针
InfoType *info;  //该弧相关信息的指针
}ArcNode;typedef struct VNode {VertexType data;     //顶点信息
ArcNode *firstarc;   //指向第一条依附该顶点弧的指针
}VNode,AdjList[MAX_VERTEX_NUM]Typedef struct {AdjList vertices;
int vexnum,arcnum;    //图的当前顶点数和弧数
int kind;    //图的种类标志
}ALGraph;

实现代码如下

//Queue.h头文件

#define  QUEUE_INIT_SIZE 100
#define QUEUE_INCREASE_SIZE 10
#define OK      1
#define ERROR   0
#define TRUE    1
#define FALSE   0
#define OVERFLOW 0typedef struct    SqQueue{QElemType *base; //空间基指针 int front;//队头元素数组下标 int tail;//队尾元素数组下标
}*Queue;Status  InitQueue(Queue);           //初始化结构体指针S 返回一个空队列 Q
Status  DestroyQueue(Queue );   //销毁非空队列 Q
Status  ClearQueue(Queue );     //把非空队列 Q置为空队列
Status  QueueEmpty(SqQueue Q);          //判断Q是否为空队列
Status  FullQueue(SqQueue ) ;           //判断是否是满队列
Status  QueueLength(SqQueue , int *) ;          //返回队列Q的元素个数
Status  DeQueue(Queue , QElemType *);   //删除Q中队首元素
Status  EnQueue(Queue , QElemType );    //队尾 将元素E排入队Q中
Status  QueueTraverse(SqQueue );                //从队首到队尾依次输出队列中每个元素Status   InitQueue(Queue Q){     //初始化结构体指针Q 返回一个空队列Q Q->base = (QElemType *)malloc( sizeof(QElemType )* QUEUE_INIT_SIZE  );if(!Q->base ) exit(OVERFLOW);Q->front = Q->tail = 0; return OK;
}Status DestroyQueue(Queue Q){  //销毁非空队列Qfree(Q->base);Q->base = NULL;return OK;
}Status ClearQueue(Queue Q){        //把非空队列 Q置为空队列  while(Q->front != Q->tail)Q->front = (Q->front+1)%QUEUE_INIT_SIZE; return OK;
}Status QueueEmpty(SqQueue Q){          if(Q.front == Q.tail ) return TRUE;else return FALSE;
}Status FullQueue(SqQueue Q){if( Q.front == (Q.tail + 1) % QUEUE_INIT_SIZE )return TRUE;else return FALSE;
}Status QueueLength(SqQueue Q, int *length){*length = 0;//设置为0 while(Q.base[Q.front] != Q.base[Q.tail] ) {Q.front = (Q.front + 1)% QUEUE_INIT_SIZE;(*length) ++;}return OK;
}Status EnQueue(Queue Q, QElemType e){ if( (Q->tail+1)%QUEUE_INIT_SIZE ==Q->front)return ERROR;//队列满 Q->base[Q->tail ] = e;Q->tail =(Q->tail+1)%QUEUE_INIT_SIZE;return OK;
}   Status  DeQueue(Queue Q, QElemType *e){if(QueueEmpty(*Q) ) return ERROR;else{*e = Q->base[Q->front];Q->front = (Q->front + 1)% QUEUE_INIT_SIZE;return OK;    }
}Status QueueTraverse(SqQueue Q){if(Q.front == Q.tail){printf("Empty Queue");return ERROR;}//队列空while(Q.front!= Q.tail ){printf("%5d",Q.base[Q.front]) ;Q.front = (Q.front+1)% QUEUE_INIT_SIZE;    }return OK;
}

Graph.h头文件(为方便起见将Graph.cpp文件写在.h文件中)

#ifndef STDIO_H
#define STDIO_H
#include "stdio.h"
#endif#ifndef STDLIB_H
#define STDLIB_H
#include "stdlib.h"
#endif#ifndef QUEUE_H
#define QUEUE_H
typedef int QElemType;
#include "Queue.h" #endif#ifndef GRAPH_STRUCT_H
#define GRAPH_STRUCT_H
#define MAX_VERTEX_NUM 20   //图的邻接表存储表示
//弧
typedef struct ArcNode{int adjvex;  //该弧所指向的顶点的位置(数组下标) struct ArcNode *nextarc;    //指向下一条弧的指针InfoType info;   //权重
}ArcNode;//顶点
typedef struct VNode {VertexType data;  //顶点信息ArcNode *firstarc;    //指向第一条依附该顶点的弧 的指针(对有向图而言 是以该顶点为尾的弧)
}AdjList[MAX_VERTEX_NUM];//总图
typedef struct ALGraph{AdjList vertices;int vexnum; //图的当前顶点数int arcnum;    //图的当前弧数int kind;   //图标志
}ALGraph;
#endif#define   TRUE        1
#define FALSE       0
#define ERROR       0
#define OVERFLOW    0   /*基本操作*/
void    CreateGraph(ALGraph *G);//创建图 其中V是图的顶点集 VR是顶点间的关系
void    DestroyGraph(ALGraph *G);   //销毁图G
int     LocateVex(ALGraph G,VNode u);   //G中存在顶点u则返回其在图中位置 否则返回其他信息
int     FirstAdjVex(ALGraph G, int v,ArcNode **w) ;//返回顶点v的第一个邻接顶点 若无临接顶点 则返回"空"
int     NextAdjVex(ALGraph G, int v, ArcNode **p);//返回v相对于w的下一个邻接顶点 若是w已经是最后一个邻接顶点 则返回"空"
void    DFSTraverse(ALGraph G);     //深度优先遍历图
void    DFS(ALGraph G,int v, int *visited);
void    BFSTraverse(ALGraph G);     //广度优先遍历图
/*各基本操作实现*//*图创建*/
void    CreateGraph(ALGraph *G){int i,  k, v, w;ArcNode *p=NULL, *q = NULL;printf("\n依次输入图的结点个数,边的个数:");scanf("%d%d",& G->vexnum, & G->arcnum);for(i = 1; i<=G->vexnum; i++){//创建顶点 printf("\n请输入%d号顶点信息:",i);rewind(stdin);scanf("%c",& G->vertices[i].data);G->vertices[i].firstarc = NULL;}for(k=1; k<=G->arcnum; k++){p = (ArcNode*)malloc(sizeof(ArcNode));scanf("%d%d", &v, &w);p->adjvex = w;scanf("%d", & p->info);p->nextarc = NULL;q = G->vertices[v].firstarc;G->vertices[v].firstarc = p;p->nextarc = q;//头插法 }//for G->kind = 0;//默认
}//CreateGraph()/*图销毁*/
void    DestroyGraph(ALGraph *G){int i; ArcNode *p= NULL, *q = NULL;//释放所有边结点 for(i =1 ; i<=G->vexnum; i++){while( G->vertices[i].firstarc){p = G->vertices[i].firstarc;q = p->nextarc;free(p);G->vertices[i].firstarc = q;}//释放一个结点发出的所有边 }//for G->arcnum = 0;G->vexnum = 0;
}
/*图的遍历DFS(递归)*/
void    DFSTraverse(ALGraph G){int v;int visited[MAX_VERTEX_NUM]={0};for(v=1; v<=G.vexnum; v++){if(!visited[v]) DFS(G, v, visited);//对未访问的顶点调用DFS }
}
void    DFS(ALGraph G,int v, int *visited){int w;ArcNode *p=NULL; visited[v] = 1;printf(" %c ",G.vertices[v].data);for(w = FirstAdjVex(G,v,&p); w>0; w=NextAdjVex(G, v, &p))if(!visited[w]) DFS(G, w, visited);
}/*图的遍历BFS*/
void    BFSTraverse(ALGraph G){int visited[MAX_VERTEX_NUM] = {0};int v, w, u;SqQueue Q;ArcNode *p =NULL; InitQueue(&Q);   for(v = 1; v<=G.vexnum; v++ ){if(!visited[v]){visited[v] = 1;//标志已访问过 printf(" %c ",G.vertices[v].data);EnQueue(&Q, v);while(!QueueEmpty(Q)){DeQueue(&Q, &u);for(w=FirstAdjVex(G, u, &p); w>0; w = NextAdjVex(G, u ,  &p) ){if(!visited[w]){visited[w] = 1;printf(" %c ",G.vertices[w].data);EnQueue(&Q, w);} }//for}//while      }//if       }//for
}//BFSTraverse()int LocateVex(ALGraph G,VNode u){int i = 1;for(i =G.vexnum ; i ; i--){if(G.vertices[i].data == u.data)break;}return i; //若为0则没找到
}int    FirstAdjVex(ALGraph G, int v,ArcNode **w){if (!(*w=G.vertices[v].firstarc ) ) return 0;return  (*w)->adjvex;
}int    NextAdjVex(ALGraph G, int v,ArcNode **p)//返回v相对于w的下一个邻接顶点 若是w已经是最后一个邻接顶点 则返回"空"
{if(!(*p)->nextarc)  return 0;int t=(*p)->nextarc->adjvex;*p=(*p)->nextarc;return t;
}

【数据结构 图】数据结构实验--图及其应用相关推荐

  1. 【数据结构C语言版】课程实验-图的应用

    数据结构C语言版 - 图的应用 前言: 大二本科计算机科学与技术程序员一枚,总结几篇课后实验内容,希望可以帮助到大家. 软件:Devc++ 实验目的: 通过实验掌握图的基本存储原理,能够利用图模型存储 ...

  2. 数据结构实验-图-普里姆算法、克鲁斯科尔算法

    数据结构实验-图-普里姆算法.克鲁斯科尔算法 (实验)自定义存储结构,并设计程序完成如下功能: ①创建图:创建带权无向图. ②普里姆算法:采用普里姆算法依次输出最小生成树中各条边. ③克鲁斯科尔算法: ...

  3. python函数结构图_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  4. js数据结构和算法(8)-图

    8-图(第11章) 8.1 图的定义 图是一种非线性结构,由一系列顶点及其连接顶点的边组成.比如A和B.A和D是相邻的,而A和E不是相邻的.一个顶点相邻顶点的数量叫作度,比如A的度为3.D的度为4.路 ...

  5. 《大话数据结构》读书笔记-图

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 7.2 图的定义 7.2.1 各种图定 ...

  6. python define graph_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  7. 【图数据结构的遍历】java实现广度优先和深度优先遍历

    [图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...

  8. 数据结构(5) -- 图

    5.4 图的应用 图的应用主要包括:最小生成树.最短路径.拓扑排序和关键路径 5.4.1 最小生成树(MST) 连通图的生成树:图的极小连通子图,包含图中所有顶点,只含尽可能少的边.若砍去最小生成树的 ...

  9. 从数据结构到算法:图网络方法初探

    如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入.图表示学习.网络嵌入等别名呈现出来,其实所有的这些方法本质上都是作用在图上的机器学 ...

最新文章

  1. 从find_vma和find_vma_prev看内核
  2. 垃圾回收器机制(二):快速解读GC算法之标记-清除,复制及标记整理-算法
  3. getprop 与 dumpsys 命令
  4. java applet js_jsp嵌入java-applet,实现js调用web服务器程序
  5. Unix和Linux的区别和联系
  6. 用delphi操作mapinfo
  7. 给Java程序员的Golang教程
  8. 16 | 基础篇:怎么理解内存中的Buffer和Cache?
  9. linux拷贝文件夹到另一台机器,linux肿么一个文件拷贝到另一个文件夹
  10. Micmac摄影测量软件介绍
  11. AD20导出Gerber教程
  12. Scrum敏捷开发实践
  13. 高德地图导航onInitNaviSuccess只调用一次
  14. 23种设计模式(15):备忘录模式
  15. Named Route ‘layout‘ has a default child route. When navigating to this named route (:to=“{name: ‘l
  16. 去掉input记录密码时的背景颜色
  17. Zig-Zag(Z型)填数
  18. spring源码之Mybatis扫描器
  19. easyExcel导出某列是固定下拉选框的excel模板
  20. 手机投屏电脑 - 用电脑看手机,爽歪歪!(仅限Win10,Win7/Win8不支持)

热门文章

  1. 无法启动服务,原因可能是已被禁用或与其他关联的设备没有启动
  2. linux kernel 4.4.1 uaf提权漏洞,条件竞争在Kernel提权中的应用
  3. c语言float能比较大小吗,C语言float和double之间有什么不同?
  4. 网页制作--苹果官方网站模仿
  5. python中文开发文档_pydoc (Development Tools) – Python 中文开发手册
  6. 读书笔记《Outlier Analysis》 第四章 基于邻近的异常检测
  7. 关于相机景深学习笔记
  8. 5G性价比神机!Redmi K30s至尊纪念版发布!
  9. P1169 [ZJOI2007]棋盘制作(悬线法)
  10. 一图读懂阿里云RDS架构与选型