课程设计------邻接表

图的遍历实现课程设计: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_数据结构_图_邻接表的更多相关文章

  1. 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)

    数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...

  2. 数据结构之---C语言实现图的邻接表存储表示

    // 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...

  3. 图的邻接表存储 c实现

    图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...

  4. 图的邻接表存储表示(C)

    //---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...

  5. 基于visual Studio2013解决算法导论之053图的邻接表表示

     题目 图的邻接表表示 解决代码及点评 // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <sta ...

  6. 《数据结构》C++代码 邻接表与邻接矩阵

    上一篇“BFS与DFS”写完,突然意识到这个可能偏离了“数据结构”的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵. 存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表 ...

  7. JAVA实现图的邻接表以及DFS

    一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...

  8. c_ 数据结构_图_邻接矩阵

    程序主要实现了图的深度遍历和广度遍历. #include <stdio.h> #include <stdlib.h> #include <string.h> #de ...

  9. 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)

    学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...

随机推荐

  1. SVM-SVR

    高频率的接触到了SVM模型,而且还有使用SVM模型做回归的情况,即SVR.另外考虑到自己从第一次知道这个模型到现在也差不多两年时间了,从最开始的腾云驾雾到现在有了一点直观的认识,花费了不少时间.因此在 ...

  2. python基础讲解部分&纯小白需要扎实基础

    第一章知识点 一.Python简介 ​ python的创始人为吉多·范罗苏姆(Guido van Rossum),在中国人称龟叔 ​ Python崇尚优美.清晰.简单 应用领域: ​ (1)云计算,写 ...

  3. CR0 - CR4 ,5个寄存器,留念,每次都要翻手册,太费事了

  4. H5在js中向指定的元素添加样式

    今天在做一个按钮的功能控制,点击之后,要根据判断条件,修改按钮的样式,然后就发现了一个巨好用的方法, <button type="button" id="btn_A ...

  5. python png与jpg的相互转换

    python将PNG格式的图片转化成为jpg """ 先来说一下jpg图片和png图片的区别 jpg格式:是有损图片压缩类型,可用最少的磁盘空间得到较好的图像质量 png ...

  6. zeromq protobuf例子

    https://github.com/AifiHenryMa/zeromq_protocolbuffer_demo https://github.com/protocolbuffers/protobu ...

  7. Struts2开发环境搭建

    eclipse配置struts2开发环境: 1.导入jar包:复制Struts\apps\struts2-blank\WEB-INF\lib下的所有jar包到当前项目的lib文件夹下 2.在web.x ...

  8. js怎样判断一个数是质数

    1.首先了解什么是质数(即:只能被1和它本身整除的数叫质数)主要代码 /** *判断该数是否为素数 */ function isPrimeNum(num){ ; i < num/+; i++) ...

  9. Python3 测试报告BeautifulReport中添加截图

    在测试类中,添加save_img方法,在测试过程中出现错误时,自动截图并返回失败 默认存放的图片路径是img def save_img(self, img_name): ""&qu ...

  10. bzoj1070题解

    [解题思路] 考虑拆点,得到一个二分图:左边点<i,j>表示第i个技师按顺序第j辆修的车,右边点k表示第k个车主,连接左右的边表示第k个车主可能成为第i个技师的第j个客户. 因为是二分图, ...