图的基本操作 (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,如果不存在任何简单路, ...
随机推荐
- SQL1224 is returned during the execution of an SQL procedure
SQL1224 is returned during the execution of an SQL procedure https://www.ibm.com/support/pages/sql12 ...
- Linux 查询 磁盘空间 系统报错:No space left on device
报这个错误是磁盘空间不足导致的 使用 du -h -d 1 / | sort -nr 这个命令 一级一级排查
- CORE8051-APB总线
1 APB总线 core8051s内核支持APB3总线,APB writebuffer 为{XWB3, XWB2, XWB1, ACC}; 写访问 对FC00以上地址写值,即表示APB写操作,值为(X ...
- c# 如何实现图片压缩
一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的.尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图. 下面贴出我自己琢磨 ...
- Android studio学习笔记1
Android studio学习笔记1 20201303张奕博 2023.1.13 studio布局 1.线性布局 Android的线性布局不会换行,当组件一个挨着一个地排列到头之后,剩下的组件将不会 ...
- Wps调用dll操作Excel表格转PDF
起始原因:wps编辑创建的文档在microsoft office 中打开,会报内容存在异常是否恢复,因此wps文件被微软设定为破损文件,无法对原有文档进行操作运行,故在此使用wps对Excel进行操作 ...
- linux篇之常用的文本操作命令
命令 功能 cat .tac 显示文本文件 ...
- redis分布式锁实现,setnx,nodejs版本
const redis = require('ioredis'); const clienId = Math.random() * 100; //模拟客户端Id const lockKey = 'te ...
- dedecms安装使用
1.运行 http://域名/install/index.php(比如你的域名是:http://www.dede58.com/,就输入http://www.dede58.com/install/ind ...
- .netcore 以widnows服务方式运行
应用需要 Microsoft.AspNetCore.Hosting.WindowsServices 的包引用. 生成主机时会调用 IHostBuilder.UseWindowsService. 若应用 ...