c_数据结构_图_邻接表
课程设计------邻接表
图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define OK 1
#define MAX_VERTEX_NUM 20 //最大顶点个数 //邻接表存储结构
typedef struct ArcNode { //邻接顶点信息链表
int adjvex; //该弧指向的结点位置
struct ArcNode *nextarc; //指向下一个弧的指针
}ArcNode;
typedef struct VNode { //顶点信息数组
char data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct { //图的邻接表存储结构
AdjList vertices;
int vexnum,arcnum;
}ALGraph; /*定位顶点*/
int LocateVex(ALGraph G,int v){
int i;
for(i=;i<G.vexnum;i++)
if(G.vertices[i].data == v) return i;
return -;
}
/*边的连接*/
int CreateSide(ALGraph &G){
int m,n,v1,v2;ArcNode *s;
printf("\n请输入两顶点间的关系(用空格隔开):");
fflush(stdin);
scanf("%d %d",&v1,&v2);
m = LocateVex(G,v1);
n = LocateVex(G,v2);
while (m==-||n==-) {
printf("!!!顶点输入错误!!!");
if(CreateSide(G))break;
}
s = (ArcNode * )malloc(sizeof(ArcNode));
s->adjvex = n; // 新的顶点指向结点位置的信息
s->nextarc = G.vertices[m].firstarc; // 新的顶点的next指向m位置的next
G.vertices[m].firstarc = s; // m 位置的next指向新节点
return OK;
} /*图的创建*/
void Create(ALGraph &G){
int i,x;
printf("\n请输入顶点数和弧数(用空格隔开):");
scanf("%d",&G.vexnum); // 顶点数
scanf("%d",&G.arcnum); // 弧数
x=G.vexnum;
if(G.vexnum< && G.arcnum<=(x*(x-))/){
printf("\n请输入%d 个顶点值(用空格隔开):",G.vexnum);
for(i=;i<G.vexnum;i++){ // 循环存入顶点值
scanf("%d",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
for(i=;i<G.arcnum;i++){
CreateSide(G);
}
}else{
printf("\n!!!您输入的总顶点数 大于 20 了或者是输入的总边数 不符合 n(n-1)/2 !!!\n");
Create(G);
} }
/*打印输出邻接关系*/
void Print(ALGraph G){
int i;
ArcNode *p;
printf("邻接表:\n");
for(i=;i<G.vexnum;i++){
printf("%d ->",G.vertices[i].data);
p = G.vertices[i].firstarc;
while(p){
printf("%d-> ",G.vertices[p->adjvex].data);
p = p->nextarc;
}
printf("NULL\n");
} } /*图的深度遍历*/
int visited[MAX_VERTEX_NUM]; // 辅助数组
void DFS(ALGraph &G,int i){
ArcNode *p;
visited[i]=;
printf("\n访问到顶点%d \n",G.vertices[i].data);
p = G.vertices[i].firstarc;
while(p){
if(visited[p->adjvex]==){ // 如果结点未被访问
DFS(G,p->adjvex);
}
p = p->nextarc;
} }
/* 保证非连通图被遍历*/
void DFSTraverse(ALGraph &G){
int i,m,x;ArcNode *p;
printf("\n深度优先遍历\n");
for(i=;i<G.vexnum;i++){ // 初始化辅助数组
visited[i] = ;
}
printf("\n请输入遍历起点:");
scanf("%d",&x);
printf("\n遍历起点为:%d \n",x);
m = LocateVex(G,x);
if(m!=-){
visited[m]=;
p = G.vertices[m].firstarc;
while(p){
if(visited[p->adjvex]==){ // 如果结点未被访问
DFS(G,p->adjvex);
}
p = p->nextarc;
}
for(i=;i<G.vexnum;i++){ // 保证非连通图被遍历
if(visited[i]==){
DFS(G,i);
}
}
}else{
printf("\n!!!您输入的起点不在顶点表内!!!\n");
DFSTraverse(G);
} }
/*菜单*/
void OperateMenu(){ printf("\n--------------请选择元素处理方式---------\n\n");
printf("!!!!!注:测试程序过程中,输入应全为数字!!!!!\n\n");
printf("0> :退出\n\n");
printf("1>: 建立无向无权图\n\n");
printf("2>:深度遍历图\n\n");
printf("3>:打印邻接顶点间的关系\n\n");
printf("请选择对元素的处理:");
}
/*主函数*/
void main(){
ALGraph G;
int w,m;
OperateMenu();
scanf("%d",&w);
if(w!=){
printf("\n您未完成建图,是否继续(1-建图,0-退出):");
scanf("%d",&m);
if(m==){
w=;
Create(G);
}
else
w=;
}
while(w){ switch(w){
case :break;
case :printf("已经建立邻接表!!\n");break;
case :DFSTraverse(G);break;
case :Print(G);break;
}
OperateMenu();
scanf("%d",&w);
} }
c_数据结构_图_邻接表的更多相关文章
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
- 数据结构之---C语言实现图的邻接表存储表示
// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...
- 图的邻接表存储 c实现
图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...
- 图的邻接表存储表示(C)
//---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...
- 基于visual Studio2013解决算法导论之053图的邻接表表示
题目 图的邻接表表示 解决代码及点评 // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <sta ...
- 《数据结构》C++代码 邻接表与邻接矩阵
上一篇“BFS与DFS”写完,突然意识到这个可能偏离了“数据结构”的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵. 存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表 ...
- JAVA实现图的邻接表以及DFS
一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...
- c_ 数据结构_图_邻接矩阵
程序主要实现了图的深度遍历和广度遍历. #include <stdio.h> #include <stdlib.h> #include <string.h> #de ...
- 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...
随机推荐
- Django框架(三)—— orm增删改查、Django生命周期
目录 orm增删改查.Django生命周期 一.orm介绍 二.orm增删改字段 三.Django生命周期 orm增删改查.Django生命周期 一.orm介绍 1.什么是orm ORM即Object ...
- Java服务定位器模式
当我们想要使用JNDI查找来定位各种服务时,使用服务定位器设计模式. 考虑到为服务查找JNDI的高成本,所以在服务定位器模式使用缓存技术. 首次需要服务时,服务定位器在JNDI中查找并缓存服务对象. ...
- Linux中的网络管理——网络配置及命令
Linux网络配置 在Linux中配置IP地址的方法有以下这么几种: 图形界面配置IP地址(操作方式如Windows系统配置IP,但在实际生产中,我们并不建议在我们的服务器上安装Linux的图形界面, ...
- DNF抽奖活动
活动内容: DNF用户在注册页面注册获得抽奖资格(或分享好友注册)参与抽奖,产生奖品后,活动参与用户,在活动领奖页面领取奖品,金币及点券需填写相应游戏区服.qq号等信息,并且为防止活动刷子,在领取页提 ...
- Ubuntu18.04 一键升级Python所有第三方包
一.pip是什么 pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 二.升级pip版本 1.默认Ubuntu自带的pip (pip 9.0.1)是基 ...
- 天道神诀--IPSAN(iscsi配置)
数据存储技术 DSA(Direct Attacted Storage 直接附加存储)本地硬盘 NAS(Network Attacted Storage 网络附加存储)网络服务共享:文件夹 SAN(St ...
- 牛客网多校训练第九场H Cutting Bamboos
题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...
- kibana 7.* 设置中文 汉化
原文:kibana 7.* 设置中文 汉化 个人博客:forever121.cn kibana 一直是 日志分析 中得力的助手 由于 kibana5.* 6.* 官方并没有支持中文,需要另外下载补丁包 ...
- 关于js 重载
拜读js忍者修炼一书 读到关于js函数重载内容这个模块 主要是介绍通过js的访问argument这个参数来实现js函数的重载 通过在函数内部进行判断js argument参数的长度 代码如下所示 va ...
- Oracle数据库与MySQL的不同点
Oracle笔记 一. Oracle的启动和登录: 1.启动:通过启动Oracle的服务启动. OracleServiceORCL:核心服务,必须启动. OracleOraDb11g_home1 ...