【数据结构 图】数据结构实验--图及其应用
数据结构实验–图及其应用
(代码有一些纰漏 仅供自己后期修改保存用)
数据结构上机实验
题目:设计并验证如下算法:
带权图采用邻接表表示,实现无向图的广度优先搜索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;
}
【数据结构 图】数据结构实验--图及其应用相关推荐
- 【数据结构C语言版】课程实验-图的应用
数据结构C语言版 - 图的应用 前言: 大二本科计算机科学与技术程序员一枚,总结几篇课后实验内容,希望可以帮助到大家. 软件:Devc++ 实验目的: 通过实验掌握图的基本存储原理,能够利用图模型存储 ...
- 数据结构实验-图-普里姆算法、克鲁斯科尔算法
数据结构实验-图-普里姆算法.克鲁斯科尔算法 (实验)自定义存储结构,并设计程序完成如下功能: ①创建图:创建带权无向图. ②普里姆算法:采用普里姆算法依次输出最小生成树中各条边. ③克鲁斯科尔算法: ...
- python函数结构图_Python数据结构与算法之图结构(Graph)实例分析
本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...
- js数据结构和算法(8)-图
8-图(第11章) 8.1 图的定义 图是一种非线性结构,由一系列顶点及其连接顶点的边组成.比如A和B.A和D是相邻的,而A和E不是相邻的.一个顶点相邻顶点的数量叫作度,比如A的度为3.D的度为4.路 ...
- 《大话数据结构》读书笔记-图
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 7.2 图的定义 7.2.1 各种图定 ...
- python define graph_Python数据结构与算法之图结构(Graph)实例分析
本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...
- 【图数据结构的遍历】java实现广度优先和深度优先遍历
[图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...
- 数据结构(5) -- 图
5.4 图的应用 图的应用主要包括:最小生成树.最短路径.拓扑排序和关键路径 5.4.1 最小生成树(MST) 连通图的生成树:图的极小连通子图,包含图中所有顶点,只含尽可能少的边.若砍去最小生成树的 ...
- 从数据结构到算法:图网络方法初探
如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入.图表示学习.网络嵌入等别名呈现出来,其实所有的这些方法本质上都是作用在图上的机器学 ...
最新文章
- 从find_vma和find_vma_prev看内核
- 垃圾回收器机制(二):快速解读GC算法之标记-清除,复制及标记整理-算法
- getprop 与 dumpsys 命令
- java applet js_jsp嵌入java-applet,实现js调用web服务器程序
- Unix和Linux的区别和联系
- 用delphi操作mapinfo
- 给Java程序员的Golang教程
- 16 | 基础篇:怎么理解内存中的Buffer和Cache?
- linux拷贝文件夹到另一台机器,linux肿么一个文件拷贝到另一个文件夹
- Micmac摄影测量软件介绍
- AD20导出Gerber教程
- Scrum敏捷开发实践
- 高德地图导航onInitNaviSuccess只调用一次
- 23种设计模式(15):备忘录模式
- Named Route ‘layout‘ has a default child route. When navigating to this named route (:to=“{name: ‘l
- 去掉input记录密码时的背景颜色
- Zig-Zag(Z型)填数
- spring源码之Mybatis扫描器
- easyExcel导出某列是固定下拉选框的excel模板
- 手机投屏电脑 - 用电脑看手机,爽歪歪!(仅限Win10,Win7/Win8不支持)
热门文章
- 无法启动服务,原因可能是已被禁用或与其他关联的设备没有启动
- linux kernel 4.4.1 uaf提权漏洞,条件竞争在Kernel提权中的应用
- c语言float能比较大小吗,C语言float和double之间有什么不同?
- 网页制作--苹果官方网站模仿
- python中文开发文档_pydoc (Development Tools) – Python 中文开发手册
- 读书笔记《Outlier Analysis》 第四章 基于邻近的异常检测
- 关于相机景深学习笔记
- 5G性价比神机!Redmi K30s至尊纪念版发布!
- P1169 [ZJOI2007]棋盘制作(悬线法)
- 一图读懂阿里云RDS架构与选型