图的基本操作 (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,如果不存在任何简单路, ...
随机推荐
- unity 调试 packages
package中代码vs无法f12跳转 解决方法 1 把包copy出来 2 Package Manager->Add package from disk 3 选择包文件中的package.jso ...
- HTML学习笔记1----HTML是什么
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- .net基础—多线程(一)
基本概念 进程 打开任务管理器,从任务管理器里面可以看到当前所有正在运行的进程.那么究竟什么是进程呢? 进程(Process)是操作系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行 ...
- 1.EditPlus
EditPlus软件使用 1.新建 XML 文件 2.编辑器设置 在文件保存时选择编码格式
- FTP替代传输方案的优异性体现在哪些方面?
多年来,FTP一直是最常见的交换文件的方式,FTP-FTPS-SFTP似乎是FTP的不断迭代更新,但是究竟是技术更新导致FTP过时?还是它真的已经满足不了企业的需求了? 之前,大家选择FTP往往是因为 ...
- ue4 启动顺序
GameMode PlayerController Actor Level https://www.cnblogs.com/fjz13/p/6133795.html
- Python通过解压ofd文件获取发票信息
实际上ofd.docx.xlsx等文件就是一个压缩文件,是可以被解压处理的.所以我们把一个ofd格式的发票文件解压后就可以看到它的目录,如下: 再用谷歌或者IE打开里面的xml属性的文件,就可以看到发 ...
- linux 7.2升级7.3
原文地址: https://www.jianshu.com/p/6a4492a9cd03 检查 PHP 版本 php -v 安装 Remi 和 EPEL 数据源 rpm -Uvh https://dl ...
- rpm制作(简)
yum -y install gcc prec-devel openssl-devel zlib-devel yum -y install rpm-build #生成工作目录 rpmdev-setup ...
- Linux-centos7 下开放某个端口
方式一 1.开启防火墙 systemctl start firewalld 2.开放指定端口 firewall-cmd --zone=public --add-port=1935/tcp --per ...