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

图的遍历实现课程设计: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. Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)

      写这篇博客时2D游戏引擎Cocos2d-x的最新版本为2.1.4,记得很久以前使用博客园博主子龙山人的一篇博文<Cocos2d-x win7+vs2010配置图文详解(亲测)>成功配置 ...

  2. 如何用json 与jsonp 的区别去回答你的面试官?

    常常 有面试官这样问我们,虽然用过无数次,但是回答不上岂不是尴尬,那我们浅析一下它们的区别? 1. json JSON是一种基于文本的数据交换格式,用于描述复杂的数据,举个例子: var nax=[ ...

  3. 干货满满!10分钟看懂Docker和K8S

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...

  4. HTTP状态码(转)

    转自菜鸟教程:https://www.runoob.com/http/http-status-codes.html HTTP状态码共分为5种类型: HTTP状态码分类 分类 分类描述 1** 信息,服 ...

  5. vuex之module

    由于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿. 为了解决以上问题,Vuex 允许我们将 store 分割成模块(module) ...

  6. 三种Spring加载机制

    方法一. 在main方法中启动Spring ApplicationContext ac = new XmlApplicationContext("applicationContext.xml ...

  7. leetcode-159周赛-5231-删除子文件夹

    题目描述: 自己的提交: class Solution: def removeSubfolders(self, folder: List[str]) -> List[str]: d = {} r ...

  8. react使用阿里爸爸的iconfont时,不展示的问题

    选择使用Unicode时: 正常使用如下,显示也是正常: <i className="iconfont"></i> 使用map去循环时,需将原本的,改成 ...

  9. Java递归调用

    6.递归调用 方法的递归调用就是方法自身调用自身. 以下程序因为递归没有结束的条件,所以一直压栈,没有弹栈,导致栈内存溢出错误!所以递归必须要有结束条件. public class Recursion ...

  10. 在IDEA安装SonarLint插件的步骤和使用方法

    1.安装SonarLint插件方式 2.使用方式 3.效果