图的基本操作 (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,如果不存在任何简单路, ...
随机推荐
- 代码行数统计(指定目录下所有文件的Line)
遍历文件夹计算文件行数(Windows) 主要使用的是 FindFirstFile. FindNextFile函数寻找子目录下的文件,使用 WIN32_FIND_DATA(文件属性) 结构体 #def ...
- linux 删除暂时无用内容
查看磁盘使用情况[root@localhost games]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/VolGroup- ...
- java抽象类继承抽象类和抽象方法 java抽象类继承抽象类和抽象方法
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量.成员方法和构造方法的访问方式和普通类一样. 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用.也是因为这个原因,通常在设计阶段决 ...
- 93、springboot 和springcloud版本对比
https://start.spring.io/actuator/info 建议转为json
- 0xc0000142怎么修复
0xc0000142怎么修复 参考链接 https://jingyan.baidu.com/article/4d58d54102f3d29dd4e9c0b1.html
- 【剑指Offer】【链表】合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. A:若链表1为空,则合并后的链表头结点为pHead2:若链表2为空,则合并后的链表头结点为pHead ...
- three.js基础用法
import * as THREE from '../libs/build/three.module.js'; import { OrbitControls } from '../libs/jsm/c ...
- Cimage类处理图像像素(数据)的3种方式(转)
这里只讨论对图像像素的处理,cimage类的具体用法查相关资料#include <atlimage.h> //VS2010以后不用加这个 --------CImage m_Image ...
- S家lic
1,用1patch里对应的工具patch 2019的s家的工具2,用ocad里的lmgrd和snpslmd替换s家的scl里的3,用scl_keygen产生license,再用fix.bat,添加si ...
- CCF 202012-1 期末预测之安全指数
#include <iostream> //#include <bits/stdc++.h> #include <string> using namespace s ...