目录

//1、含邻接矩阵的图结构

//2、创建邻接矩阵

//3、打印邻接矩阵

//4、邻接表的图结构

//5、创建邻接表

//6、打印邻接表

//7、深度优先搜索

//8、广度优先搜索

//9、带主函数完整测试源码


//1、含邻接矩阵的图结构

用邻接矩阵来表示图:

//定义邻接矩阵的图结构
typedef struct graph {elemtype data[N + 1];//存放顶点,不使用data[0]存放int side[N + 1][N + 1];//邻接矩阵,同上
}graph;

//2、创建邻接矩阵

邻接矩阵是用来表示边的,0表示没有边,1表示有边,值为1的数组下标分别为边的起始和结尾序号:

//创建邻接矩阵
void Create1(graph* g,int sum) {int i, j;//初始化矩阵;for (i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {g->side[i][j] = 0;//0表示没有边,1表示右边}}//输入边的信息printf("分别输入%d条边的始尾:\n",sum);for (int k = 1; k <= sum; k++) {scanf("%d %d", &i, &j);g->side[i][j] = 1;//无向图的边是双向的g->side[j][i] = 1;}
}

//3、打印邻接矩阵

//打印邻接矩阵
void Print1(graph g) {for (int i = 1; i <= N; i++) {//控制行for (int j = 1; j <= N; j++) {//控制列printf("%d ", g.side[i][j]);}printf("\n");//换行}
}

//4、邻接表的图结构

//定义邻接表结构
typedef struct Linkgraph {elemtype data;//顶点值int index;//下标值struct Linkgraph* next;//邻接点
}*Linkgraph;

//5、创建邻接表

先把每个顶点给放在一个数组里,然后把各顶点的邻接点以链表形式连在其后:

//创建邻接表
void Create2(Linkgraph arr[],graph* g) {//arr是邻接表的顶点数组,g是图//先存放每个顶点的值和序号for (int i = 1; i <= N; i++) {arr[i] = (Linkgraph)malloc(sizeof(struct Linkgraph));//不初始化就报错arr[i]->data = g->data[i];//先存顶点arr[i]->index = i;//给每个顶点排号arr[i]->next = NULL;//因为还不知道该顶点的邻接点是谁所以给空}//然后输入边int i, j, sum;Linkgraph new;//新的邻接表结点,用来连接邻接点printf("输入边的条数:");scanf("%d", &sum);if (sum > E)printf("输入错误!");else {printf("分别输入%d条边的始尾序号:\n", sum);for (int k = 1; k <= sum; k++) {scanf("%d %d", &i, &j);//输入边,也就是两个顶点的下标值new = (Linkgraph)malloc(sizeof(struct Linkgraph));new->index = j;//先给邻接点排号new->data=arr[j]->data;//再给新节点赋值让他去连上前一个顶点new->next = arr[i]->next;//这里是头插法,尾插法需要头节点arr[i]->next = new;////无向图,所以两遍new = (Linkgraph)malloc(sizeof(struct Linkgraph));new->index = i;new->data = arr[i]->data;new->next = arr[j]->next;arr[j]->next = new;}}
}

//6、打印邻接表

打印出每个顶点和他的邻接点

//打印邻接表
void Print2(Linkgraph arr[]) {printf("顶点--->邻接点\n");for (int i = 1; i <= N; i++) {//控制顶点Linkgraph p = arr[i];//这里主要是方便后面的书写printf("%c:\t", p->data);while (p->next) {//这里循环退出时就代表他没有邻接点了p = p->next;//找到他 的邻接点printf("%c ", p->data);}printf("\n");}
}

//7、深度优先搜索

深度优先就是一条路走到黑,用递归一直访问没有被访问过的顶点,直到把所有顶点都访问了:

//深度优先搜索
int visited[N + 1];//辅助数组,代表顶点的访问状态,访问过了为1,没访问为0
//先初始化这个辅助数组
void InitVisited() {for (int i = 1; i <= N; i++) {visited[i] = 0;}
}
void DFS(graph* g,int i) {printf("%c ", g->data[i]);visited[i] = 1;//标记被访问过了for (int j = 1; j <= N; j++) {if (g->side[i][j] && !visited[j])//判断两顶点是否存在边并且另一顶点是否被访问过了DFS(g, j);}
}

//8、广度优先搜索

广度优先类似于树的层序遍历:

//广度优先搜索
void BFS(graph* g, int i) {printf("%c ", g->data[i]);int Queue[N + 1];//辅助队列int front, rear;//队首队尾指针front = rear = 0;visited[i] = 1;//标记被访问过了Queue[++rear] = i;//入队,把顶点的下标值入队while (front < rear) {i = Queue[++front];//出队,找到当前顶点的下标值for (int j = 1; j <= N; j++) {if (g->side[i][j] && !visited[j]) {//判断两顶点是否存在边并且另一顶点是否被访问过了printf("%c ", g->data[j]);visited[j] = 1;//标记被访问过了Queue[++rear] = j;//入队,把顶点的下标值入队}}}
}

//9、带主函数完整测试源码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#define N 4//图的最大顶点数
#define E N*(N-1)/2//无向图的最大边数
#define elemtype char //顶点元素类型
#define max 32727
//无向图
//定义邻接矩阵的图结构
typedef struct graph {elemtype data[N + 1];//存放顶点,不使用data[0]存放int side[N + 1][N + 1];//邻接矩阵,同上
}graph;
//初始化顶点信息
void Init(graph* g) {//先存好顶点信息for (int i = 1; i <= N; i++) {scanf("%c", &g->data[i]);getchar();}
}
//创建邻接矩阵
void Create1(graph* g,int sum) {int i, j;//初始化矩阵;for (i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {g->side[i][j] = 0;//0表示没有边,1表示右边}}//输入边的信息printf("分别输入%d条边的始尾:\n",sum);for (int k = 1; k <= sum; k++) {scanf("%d %d", &i, &j);g->side[i][j] = 1;//无向图的边是双向的g->side[j][i] = 1;}
}
//打印邻接矩阵
void Print1(graph g) {for (int i = 1; i <= N; i++) {//控制行for (int j = 1; j <= N; j++) {//控制列printf("%d ", g.side[i][j]);}printf("\n");//换行}
}//定义邻接表结构
typedef struct Linkgraph {elemtype data;//顶点值int index;//下标值struct Linkgraph* next;//邻接点
}*Linkgraph;
//创建邻接表
void Create2(Linkgraph arr[],graph* g) {//arr是邻接表的顶点数组,g是图//先存放每个顶点的值和序号for (int i = 1; i <= N; i++) {arr[i] = (Linkgraph)malloc(sizeof(struct Linkgraph));//不初始化就报错arr[i]->data = g->data[i];//先存顶点arr[i]->index = i;//给每个顶点排号arr[i]->next = NULL;//因为还不知道该顶点的邻接点是谁所以给空}//然后输入边int i, j, sum;Linkgraph new;//新的邻接表结点,用来连接邻接点printf("输入边的条数:");scanf("%d", &sum);if (sum > E)printf("输入错误!");else {printf("分别输入%d条边的始尾序号:\n", sum);for (int k = 1; k <= sum; k++) {scanf("%d %d", &i, &j);//输入边,也就是两个顶点的下标值new = (Linkgraph)malloc(sizeof(struct Linkgraph));new->index = j;//先给邻接点排号new->data=arr[j]->data;//再给新节点赋值让他去连上前一个顶点new->next = arr[i]->next;//这里是头插法,尾插法需要头节点arr[i]->next = new;////无向图,所以两遍new = (Linkgraph)malloc(sizeof(struct Linkgraph));new->index = i;new->data = arr[i]->data;new->next = arr[j]->next;arr[j]->next = new;}}
}
//打印邻接表
void Print2(Linkgraph arr[]) {printf("顶点--->邻接点\n");for (int i = 1; i <= N; i++) {//控制顶点Linkgraph p = arr[i];//这里主要是方便后面的书写printf("%c:\t", p->data);while (p->next) {//这里循环退出时就代表他没有邻接点了p = p->next;//找到他 的邻接点printf("%c ", p->data);}printf("\n");}
}
void menu() {printf("================\n");printf("1、邻接矩阵\n");printf("2、邻 接 表\n");printf("================\n");
}
//深度优先搜索
int visited[N + 1];//辅助数组,代表顶点的访问状态,访问过了为1,没访问为0
//先初始化这个辅助数组
void InitVisited() {for (int i = 1; i <= N; i++) {visited[i] = 0;}
}
void DFS(graph* g,int i) {printf("%c ", g->data[i]);visited[i] = 1;//标记被访问过了for (int j = 1; j <= N; j++) {if (g->side[i][j] && !visited[j])//判断两顶点是否存在边并且另一顶点是否被访问过了DFS(g, j);}
}
//广度优先搜索
void BFS(graph* g, int i) {printf("%c ", g->data[i]);int Queue[N + 1];//辅助队列int front, rear;//队首队尾指针front = rear = 0;visited[i] = 1;//标记被访问过了Queue[++rear] = i;//入队,把顶点的下标值入队while (front < rear) {i = Queue[++front];//出队,找到当前顶点的下标值for (int j = 1; j <= N; j++) {if (g->side[i][j] && !visited[j]) {//判断两顶点是否存在边并且另一顶点是否被访问过了printf("%c ", g->data[j]);visited[j] = 1;//标记被访问过了Queue[++rear] = j;//入队,把顶点的下标值入队}}}
}
int main(){int chose = 0;int start = 0;int sum = 0;//边的数目graph g;//创建一个无向图Linkgraph arr[N + 1];//存放表头的数组,也就是存放每个结点的数组printf("输入%d个顶点信息:", N);Init(&g);//初始化顶点while (1) {menu();scanf("%d", &chose);switch (chose) {case 1:printf("输入边的条数:");scanf("%d", &sum);Create1(&g,sum);//创建矩阵Print1(g);//打印邻接矩阵InitVisited();printf("输入起点序号:");scanf("%d", &start);printf("深度优先搜索遍历:\n");DFS(&g, start);printf("\n");printf("广度优先搜索遍历:\n");InitVisited();BFS(&g, start);printf("\n");break;case 2:Create2(arr,&g);//创建邻接表Print2(arr);break;default:return 0;}}
}

数据结构无向图的操作(C语言)相关推荐

  1. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

  2. 数据结构与算法(C语言)

    第一章: 数据结构绪论 1.什么是程序:程序 = 数据结构 + 算法 2.逻辑结构&物理结构的区别用法 基本的目标就是将数据及其逻辑关系存储到计算机的内存中 一:逻辑结构: 逻辑结构是指数据对 ...

  3. 《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timo ...

  4. 《数据结构与抽象:Java语言描述(原书第4版)》一2.1.4 让实现安全

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timoth ...

  5. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  6. 《数据结构与抽象:Java语言描述(原书第4版)》一1.1 什么是包

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第1章 ,第1.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timoth ...

  7. 资料分享:送你一本《数据结构与算法:Python语言描述》电子书!

    下图为 TIOBE 3月编程语言排行榜. 从榜单来看,曾经铁打的 Java.C.C++ 局势,早已在数月前被 Python 的闯入而打破.究其根由,并非是 C++ 的应用领域正在逐渐缩减,而是随着人工 ...

  8. 数据结构--链栈的c语言实现(超详细注释/实验报告)

    数据结构–链栈的c语言实现(超详细注释/实验报告) 知识小回顾 栈(Stack)作为一种限定性线性表,是将线性表的插入和删除操作限制为仅在表的一端进行,通常将表中允许进行插入.删除操作的一端成为栈顶( ...

  9. 《数据结构与抽象:Java语言描述(原书第4版)》一1.2 说明一个包

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第1章 ,第1.2节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timoth ...

最新文章

  1. C#计时器,记录程序运行时长
  2. ASP.NET AJAX 1.0 发布
  3. centos 7 安装docker 并设置阿里云镜像仓库
  4. 成年人的低头,从拼多多开始
  5. VC++ 多线程同步实例
  6. cartographer编译过程遇到未定义的dlclose@@GLIBC_2.2.5
  7. ❤️一分钟学会python条件语句❤️
  8. 老司机 iOS 周报 #37 | 2018-09-24
  9. 64位程序如何调用32位dll(简单解决方案 )
  10. 生成VOC2012数据集
  11. apa引用要在文中吗_【019】写作格式 | APA 7th style 引用格式
  12. php存省市,PHP格式化全国省市区列表
  13. 多变量时间序列相似度量
  14. 雪人(snowman)
  15. 干货!网页设计中最常用的5种配图
  16. 算法刷题记录(Day 73)
  17. 适合程序员使用的二进制计算器Megatops BinCalc
  18. 2022江苏最新中级消防设施操作员模拟考试试题及答案
  19. 【致客户书】关于CSDN专栏订阅的说明
  20. 微信小程序 社区电商demo模板

热门文章

  1. 数据分析和用户增长的思维导图
  2. Linux_UNIX编程手册-读书笔记-第五十四章(POSIX共享内存)
  3. 快速实现私密的网络日记功能(群晖nas)
  4. 洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量)
  5. 模拟量使用计算机电缆,DJYPVRP计算机电缆型号规格
  6. nginx实现hls自动切片--nginx-vod-module
  7. 无线摄像头 服务器,下一波摄像头僵尸网络来袭!350家厂商的WiFi摄像头内置不安全的Web服务器软件...
  8. 中秋节古典flash动画素材
  9. 软件工程毕业设计 SSM健身运动平台管理系统(源码+论文)
  10. java计算机毕业设计基于安卓Android/微信小程序的智能停车场管理系统APP