图的基本操作 (c语言)
图的基本操作:创建 删除 遍历
创建:邻接矩阵和邻接表 十字链表 下面代码是邻接矩阵的定义和邻接表的创建
遍历:深度优先遍历(一条路走到黑) 广度优先遍历(树的层次遍历)
具体代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<conio.h>
int visited[20] = {0};//标记深度优先遍历访问过的节点 访问过1 未访问0
//邻阶矩阵存储
struct pic {
int picture[20][20];//假设此图最大顶点数为20
char data[20];//存放数据的顶点
int e, top;//边的数量 顶点的数量 };
//邻阶表存储
struct anode
{
int array;//数组元素的下标(对应边的元素)
struct anode* next;
};
struct node {
char dat;//数据元素区域
struct anode* link;
};
struct arc {
struct node data[100];
int e, top;
};
struct arc t;
void create_pir();//无向图
void deep_b();//深度优先遍历(主函数)
void deep_b1(int i);//递归函数
int find_fristnode(int i);//寻找第一个领节点
int next_node(int i, int w);//相对于i的下一个元素
void BFS(int i);//广度优先遍历
//广度遍历需用队操作 定义一个队列
struct queue {
int a[20];//对中的元素
int top, base;
};
void chu_queue();
void enter_queue(int i);
void del_queue(int i);
struct queue q;
int main()
{
create_pir();
BFS(0);
return 0;
}
void create_pir()
{
printf("请输入顶点的数量和边的数量:\n");
scanf("%d %d", &t.top, &t.e);
int i,s,d;
printf("请输入顶点的数据:\n");
for (i = 0; i < t.top; i++)
{
t.data[i].link = NULL;
std::cin>>t.data[i].dat;
}
for (i = 0; i < t.e; i++)
{
printf("请输入对应的两边顶点的下标:\n");
scanf("%d %d", &s, &d);
//如果为有向图 输入以s为狐尾的节点 开辟一次空间就可
struct anode* p;
p = (struct anode*)malloc(sizeof(struct anode));
p->array = d;
p->next = t.data[s].link;
t.data[s].link = p;
p = (struct anode*)malloc(sizeof(struct anode));
p->array = s;
p->next = t.data[d].link;
t.data[d].link = p;
}
}
void deep_b()
{ int i;
for (i = 0; i < t.top; i++)
{
if (visited[i] == 0)
{
//没有等于0 深度优先遍历
deep_b1(i);
}
}
}
void deep_b1(int i)
{
int a;//遍历的结束条件
int w;//记录第一个邻接结点元素的下标
//假设邻接表存储
printf("%c ", t.data[i].dat);
visited[i] = 1;
//如果是矩阵或者十字链表则执行相应操作
//下面内容可根据图的存储构造函数
if (t.data[i].link != NULL)
{
w = t.data[i].link->array;
}
else
{
w = -1;
} if (visited[w] == 0)
{
deep_b1(w);
}
else
{
return;
}
//条件不成立就寻找下一个领接点 }
void BFS(int i)
{
int w;
printf("%c ", t.data[i].dat);
visited[i] = 1;
chu_queue();
enter_queue(i);
while (q.top!=q.base)
{
del_queue(i);
w = find_fristnode(i);
while (w != -1)
{
if (visited[w] == 0) {
printf("%c ", t.data[w].dat);
enter_queue(w);
}
w = next_node(i,w);
}
}
}
void chu_queue()
{
q.top = 0;
q.base = 0;
}
int find_fristnode(int i)
{
if (t.data[i].link != NULL)
{
return t.data[i].link->array;
}
else
{
return -1;
}
}
int next_node(int i, int w)
{
struct anode *p;
p = t.data[i].link;
while (p)
{
if (p->array != w&& p->array!=i)
{
return p->array;
}
p = p->next;
}
return -1;
}
void enter_queue(int i)
{
q.a[q.top] = i;
q.top++;
}
void del_queue(int i)
{
q.top--;
}
图的基本操作 (c语言)的更多相关文章
- C语言数据结构之图的基本操作
本博文是是博主在学习数据结构图的这一章知识时做的一些总结,代码运行环境:visual studio2017 纯C语言 ,当然掌握了方法,你也可以试着用其它的语言来实现同样的功能. 下面的程序主要实现了 ...
- 数据结构(C语言)关于树、二叉树、图的基本操作。
1) 编写算法函数int equal(tree t1, tree t2),判断两棵给定的树是否等价: int equal(tree t1,tree t2) { int k; if(t1==NULL&a ...
- 二叉树的基本操作(C语言版)
今天走进数据结构之二叉树 二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆.二叉树是链式存储结构,用的是二叉 ...
- JavaScript思维导图—DOM基本操作
JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/ DOM基本 ...
- 顺序栈的基本操作(C语言)
由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址 但是这种用法好像C并不 ...
- mysql数据库基本操作sql语言
mysql的启动与关闭 启动 /etc/init.d/mysql start 多实例使用自建脚本启动 2种关闭数据库方法 mysqladmin -uroot -p密码 shutdown #优雅关闭/e ...
- 详解双向链表的基本操作(C语言)
@ 目录 1.双向链表的定义 2.双向链表的创建 3.双向链表的插入 4.双向链表的删除 5.双向链表更改节点数据 6.双向链表的查找 7.双向链表的打印 8.测试函数及结果 1.双向链表的定义 上一 ...
- 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)
邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...
- [数据结构]单向链表及其基本操作(C语言)
单向链表 什么是单向链表 链表是一种物理储存单元上非连续.非顺序的储存结构.它由一系列结点(链表中每一个元素称为结点)组成,结点可动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存 ...
- C++实现有向权图的基本操作,界面友好,操作方便,运行流畅
Ⅰ.功能: .创建图 .展示全图 .添加顶点 .添加边 .删除顶点 .删除边 .查看指定边权值 .修改指定边权值 .输出两点间的所有简单路及路径对应权值 .销毁图 ps:关于9,如果不存在任何简单路, ...
随机推荐
- element-ui中el-table设置多选checkbox时,selection-change重复执行,以及选不中问题
项目中使用了elementUI中el-table的选择框.在另外一个地方展示选中的行的数量.设置显示数量之后,选择框就无法选中,change事件执行两次. 解决办法:给el-table设置row-ke ...
- composer更新报错
在用composer安装Yii2的扩展插件时,报错: [UnexpectedValueException] Could not parse version constraint <=2.*: I ...
- stm32f030 模拟IIC
#define read_SDA (GPIOA->IDR&GPIO_Pin_10) >>10 //PA10 SDA#define set_SDA GPIO_SetBits(G ...
- 扫二维码 下载app
<?phpheader("Access-Control-Allow-Origin: https:// ");$version = PAPI_GetSafeParam('ver ...
- Nginx 配置https的单向或双向认证
一.自制https认证证书 1. 制作CA证书 A. 生成CA私钥:openssl genrsa -des3 -out ca.key 2048,注意要输入两次密码,若去除密码使用openssl rsa ...
- Jquery_002
6.$.ajax方法 $.ajax([options]) options是一个json格式的对象,参数是通过键值对的形式存在的 常用的参数如下: async:(默认: true) 默认设置下,所有请求 ...
- win10禁用自带键盘
本文转载:https://blog.csdn.net/BiandanLoveyou/article/details/1163550041.不要相信网上说的那种在控制面板更换驱动,禁用什么设备,没卵用, ...
- ProcessLassoLauncher.exe
html, body { font-size: 15px } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, &q ...
- 深入理解snp-calling流程——转载
------------恢复内容开始------------ GATK4流程 准备配套数据 明确参考基因组版本!!!b36/b37/hg18/hg19/hg38,记住b37和hg19并不是完全一样的, ...
- 实验 四 [bx]和loop的使用
1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. 代码 assume cs:code code segme ...