数据结构C语言实现----图
邻接表储存结构
/*邻接表的边*/
typedef struct ArcNode
{
int adjvex;
struct ArcNode *next;
}ArcNode;
/*邻接表的结点*/
typedef struct VNode
{
char date;
ArcNode *firstarc;
}VNode;
创建一个邻接表储存结构的图
//创建一个邻接表类型的图
void CreatArcGraph(int count , VNode G[])
{
ArcNode *p , *q;
char c; //储存结点内数据
int number; //储存要连接的结点
printf("请输入各个结点的数据:\n");
for (size_t i = 0; i < count; i++) //初始化数组,输入各结点数据
{
fflush(stdin);
printf("请输入第%d个结点内存入的字符:" , i);
c = getchar();
G[i].date = c;
G[i].firstarc = NULL;
}
图的遍历(1)-----深度优先搜索
//深度优先搜索一个连通图
void DFS(VNode G[] , int v)
{
int w;
printf("%c" , G[v].date); //访问当前结点
printfed[v] = 1;
w = FirstAdj(G , v);
while (w!=-1)
{
if (printfed[w]==0)
DFS(G,w);
w = NextAdj(G , v);
}
}
//对图G = (V,E)进行深度优化搜索的主算法
void Travel_DFS(VNode G[] , int n)
{
for (size_t i = 0; i < n; i++)
{
printfed[i] = 0;
}
for (size_t i = 0; i < n; i++)
{
if (printfed[i]==0)
{
DFS(G,i);
}
}
}
深度优先搜索实例
#include<stdio.h>
#include<stdlib.h>
/*邻接表的边*/
typedef struct ArcNode
{
int adjvex;
struct ArcNode *next;
}ArcNode;
/*邻接表的结点*/
typedef struct VNode
{
char date;
ArcNode *firstarc;
}VNode; //创建一个邻接表类型的图
void CreatArcGraph(int count , VNode G[])
{
ArcNode *p , *q;
char c; //储存结点内数据
int number; //储存要连接的结点
printf("请输入各个结点的数据:\n");
for (size_t i = 0; i < count; i++) //初始化数组,输入各结点数据
{
fflush(stdin);
printf("请输入第%d个结点内存入的字符:" , i);
c = getchar();
G[i].date = c;
G[i].firstarc = NULL;
//putchar('\n');
}
for (size_t i = 0; i < count; i++) //创建边
{
printf("请输入第%d个结点要连接的结点(各个结点以空格隔开):",i);
scanf("%d" , &number);
while (number!=-1)
{
p = (ArcNode*)malloc(sizeof(ArcNode));
p->next = NULL;
p->adjvex = number;
if (G[i].firstarc == NULL)
{
G[i].firstarc = p;
}else
{
q->next = p;
}
q = p;
scanf("%d" , &number);
}
}
}
int printfed[3];
//寻找第一个邻接点
int FirstAdj(VNode G[] , int v)
{
return G[v].firstarc->adjvex;
}
//寻找下一个邻接点
int NextAdj(VNode G[] , int v)
{
ArcNode *p;
p = G[v].firstarc->next;
while (p->next!=NULL )
{
p = p->next;
if (printfed[p->adjvex]==0)
{
return p->adjvex;
}
}
return -1;
}
//深度优先搜索一个连通图
void DFS(VNode G[] , int v)
{
int w;
printf("%c" , G[v].date); //访问当前结点
printfed[v] = 1;
w = FirstAdj(G , v);
while (w!=-1)
{
if (printfed[w]==0)
DFS(G,w);
w = NextAdj(G , v);
}
}
//对图G = (V,E)进行深度优化搜索的主算法
void Travel_DFS(VNode G[] , int n)
{
for (size_t i = 0; i < n; i++)
{
printfed[i] = 0;
}
for (size_t i = 0; i < n; i++)
{
if (printfed[i]==0)
{
DFS(G,i);
}
}
}
#define MAXG 100
int main()
{
int count;
VNode G[MAXG];
printf("请输入要创建的图的结点数:");
scanf("%d",&count);
CreatArcGraph(count , G);
Travel_DFS(G,count);
return 0;
}
运行结果

图的遍历(2)-------广度优先搜索
//广度优先搜索一个连通图
void BFS(VNode G[] , int v)
{
initQueue(&q);
//首先访问当前结点
printf("%c" , G[v].date);
visited[v] = 1; //访问标记
EnQueue(&q , v); //入队列
//
int w;
while (q.front==q.rear)
{
DeQueue(&q , &v);
w = Firstadj(G , v);
while (w!=-1)
{
if (visited[w]==0)
{
printf("%c",G[w].date);
EnQueue(&q , w);
visited[w] = 1;
}
w = Nextadj(G,v);
}
}
}
//广度优先搜索的主算法
void Travel_BFS(VNode G[] , int v)
{
for (size_t i = 0; i < v; i++)
{
visited[i] = 0;
}
for (size_t i = 0; i < v; i++)
{
BFS(G , i);
}
}
广度优先搜索实例
如图:

#include<stdio.h>
#include<stdlib.h>
//////////////////////////////////////////////////////////////////////////////
//储存类型定义
//图边
typedef struct ArcNode
{
int adjvex;
struct ArcNode *next;
}ArcNode;
//图结点
typedef struct VNode
{
char date;
ArcNode *firstarc;
}VNode;
//队列结点
typedef struct QNode
{
int date;
struct QNode *next;
}QNode , *QueuePtr;
//队列指针
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
////////////////////////////////////////////////////////////////////////////////
//队列操作
//创建队列
void initQueue(LinkQueue *q)
{
q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!q->front) exit(0);
q->front->next = NULL;
}
//入队列
void EnQueue(LinkQueue *q , int v )
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!q->front) exit(0);
p->date = v;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
//出队列
void DeQueue(LinkQueue *q , int *v)
{
if (q->front==q->rear)
{
exit(0);
}
QueuePtr p;
p = q->front->next;
*v = p->date;
q->front->next = p->next;
if (q->rear==p)
{
q->front = q->rear =NULL;
}
free(p);
}
/////////////////////////////////////////////////////////////////////////////////////
//图操作
//创建一个图(邻接表)
void CreatArcNode(VNode G[] , int count)
{
//为结点数组输入数据
char c;
printf("请输入要在各个结点存入的字符...");
for (size_t i = 0; i < count; i++)
{
fflush(stdin);
printf("请输入在第%d个结点存入的数据:",i);
c = getchar();
G[i].date = c;
G[i].firstarc = NULL;
}
//创建几条单链表连接在数组后面(创建边)
int number;
ArcNode *p , *q;
for (size_t i = 0; i < count; i++)
{
printf("请输入结点%d要指向的结点:",i);
scanf("%d",&number);
while (number!=-1)
{
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = number;
p->next = NULL; if (G[i].firstarc==NULL)
{
G[i].firstarc = p;
}else
{
q->next = p;
}
q = p;
scanf("%d",&number);
}
}
}
/***********************************全局变量****************************************/
int visited[100];
LinkQueue q; /////////////////////////////////////////////////////////////////////////////////
//广度优先搜索操作
//寻找第一个邻接点
int Firstadj(VNode G[] , int v)
{
return G[v].firstarc->adjvex;
}
//寻找下一个邻接点
int Nextadj(VNode G[] , int v)
{
ArcNode *p;
p = G[v].firstarc->next;
while (!p->next)
{
p = p->next;
if (visited[p->adjvex]==0)
{
return p->adjvex;
}
}
return -1;
}
//广度优先搜索一个连通图
void BFS(VNode G[] , int v)
{
initQueue(&q);
//首先访问当前结点
printf("%c" , G[v].date);
visited[v] = 1; //访问标记
EnQueue(&q , v); //入队列
//
int w;
while (q.front==q.rear)
{
DeQueue(&q , &v);
w = Firstadj(G , v);
while (w!=-1)
{
if (visited[w]==0)
{
printf("%c",G[w].date);
EnQueue(&q , w);
visited[w] = 1;
}
w = Nextadj(G,v);
}
}
}
//广度优先搜索的主算法
void Travel_BFS(VNode G[] , int v)
{
for (size_t i = 0; i < v; i++)
{
visited[i] = 0;
}
for (size_t i = 0; i < v; i++)
{
BFS(G , i);
}
} int main()
{
//创建一个图
int count;
printf("请输入创建的图有几个结点:");
scanf("%d" , &count);
VNode G[count];
CreatArcNode(G,count);
//打印邻接表
for (size_t i = 0; i < count; i++)
{
ArcNode *p;
p = G[i].firstarc;
printf("第%d个结点:%c",i,G[i].date);
do
{
if(p!=NULL)
{
printf("----<%d,%c>",p->adjvex,G[p->adjvex].date);
p = p->next;
}
}while(p!=NULL);
putchar('\n');
}
//广度优先搜索
Travel_BFS(G , count);
getchar();
return 0;
}
运行结果:


数据结构C语言实现----图的更多相关文章
- 图的存储结构大赏------数据结构C语言(图)
图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- 数据结构(C语言)—排序
数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...
- LaTeX宏包TikZ绘图示例——Go语言起源图
本例所绘图形选自<Go语言程序设计>(作者:Alan A. A. Donovan与Brian W. Kernighan)一书的前言部分. 完整代码 \documentclass{art ...
- Python语言数据结构和语言结构(2)
目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名 变量命名规则主要有以下几 ...
随机推荐
- 【科普】Scrum——从橄榄球争球到敏捷开发
对敏捷开发Scrum稍有了解的都知道Scrum来源于橄榄球,但你知道为何要以这项球类运动的术语来命名这个敏捷开发方法论吗? Scrum与橄榄球对应关系 Scrum 一词源于英式橄榄球运动,是指双方球员 ...
- web测试要点、方法_web端测试大全总结
一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...
- 关于渐进式 Web 应用,你应该知道的一切
渐进式 Web 应用是利用现代浏览器的特性,可以添加到主屏幕上,表现得像原生应用程序一样的 Web 应用程序. 什么是渐进式 Web 应用 渐进式 Web 应用(PWA)本质上与普通的网站没有什么不同 ...
- Java基础-线程与并发1
线程与并发 Thread 基本概念 程序: 一组计算机能识别和执行的指令 ,是静态的代码. 进程: 程序的一次运行活动, 运行中的程序 . 线程: 进程的组成部分,它代表了一条顺序的执行流. 进程线程 ...
- 带你学够浪:Go语言基础系列 - 10分钟学方法和接口
文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 对于一般的语言使用者来说 ,20% 的语言特性就能够满 ...
- 洛谷 P4910 帕秋莉的手环
题意 多组数据,给出一个环,要求不能有连续的\(1\),求出满足条件的方案数 \(1\le T \le 10, 1\le n \le 10^{18}\) 思路 20pts 暴力枚举(不会写 60pts ...
- 数据可视化之powerBI入门(八)PowerQuery学习:认识M函数
https://zhuanlan.zhihu.com/p/64148928 前面我们学习PQ的时候都是用鼠标操作,虽然通过这些操作能完成大部分的数据处理,但是毕竟还有些复杂的工作是处理不了的,如果想彻 ...
- Django之 Views组件
本节内容 路由系统 models模型 admin views视图 template模板 我们已经学过了基本的view写法 单纯返回字符串 1 2 3 4 5 6 7 8 def current_dat ...
- 从零搭建Spring Cloud Gateway网关(三)——报文结构转换
背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...
- html-webpack-plugin在html中插入数据
html-webpack-plugin在html中插入数据 <!DOCTYPE html> <html> <head> <meta charset=" ...