图的基本操作 (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,如果不存在任何简单路, ...
随机推荐
- JavaScript逗号运算符的用法
var a = 3, b b = (a++, a) 与 var a = 3, b b = a++ 区别
- vant-ui经验
1.van-checkbox搭配van-cell使用,点击圆圈区域,不触发定义的click函数. 解决:给van-checkbox添加一层div,添加click事件:van-checkbox也添加cl ...
- 【C++复习】第九章 模板与群体数据(1)
1.例:求绝对值函数的模板 函数重载方便了函数的使用者,开发者还是要写两个函数 模板是用来生成函数的东西 编译器通过推导生成函数: 2.函数模板定义语法 从例题入手,别上来就扣语法 3.例9-1 函数 ...
- HDLbits——Exams/m2014 q4k
//四级移位寄存器 module top_module ( input clk, input resetn, // synchronous reset input in, output reg out ...
- C语言学习--指针函数与函数指针
#include<stdio.h> #include<string.h> //指针函数: 是一个函数, 但是这个函数的返回值类型是一个指针 //函数指针: 是一个指针, 这个指 ...
- 03、如何理解Kafka和Zookeeper的关系
001.Kafka简介 Apache Kafka最早是由Linkedin公司开发,后来捐献给了Apack基金会. Kafka被官方定义为分布式流式处理平台,因为具备高吞吐.可持久化.可水平扩展等特性而 ...
- windows下git bash不显示中文问题解决
问题: 在git bash下输入git log,查看log记录的时候中文显示不出来 解决方案: 网上查了很多解决方法,逐个尝试 1.尝试 git config --global core.quotep ...
- 在cesium中导出图片
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- code的用法
今天写程序的时候用了const,想到之前遇到的code的用法,那是第一次遇到code的那样的用法,查了一下,解释如下: 在单片机使用C语言进行编程的时候,经常使用到code.code是keil C51 ...
- Angular+FileSaver实现导出(xlsx或ExcelJS)
1.安装相关插件 npm install file-saver --savenpm install @types/file-saver --save-dev 一.xlsx(虽然强大,但是默认不支持改变 ...