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

图的遍历实现课程设计: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. jQuery实用美化input 上传组建

     下载插件    (5)     简要教程 jquery-filestyle是一款可以简单实用的表单文件上传域美化jQuery插件.该插件可以将表单的文件上传域转换为类似Bootstrap按钮组的样式 ...

  2. Selenium3 + Python3自动化测试系列八——警告框处理和下拉框选择

    警告框处理 在WebDriver中处理JavaScript所生成的alert.confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confi ...

  3. zabbix--添加host

    在client配置好zabbix_agent后,如果server端没配置自动发现,那就需要创建添加host. 首先找到地方.Configuration--Hosts--Create Host 创建ho ...

  4. C语言指针函数和函数指针

    #include <stdio.h> char *test(); void test1(); int main() { /********************************* ...

  5. angulatJs 前端数据分页展示——例

    注:css用的是amazeui html: ···<div style="height:500px;overflow: auto;"> <table class= ...

  6. yum处理损坏的包依赖关系

    有时在安装多个软件包时,某个包的软件依赖关系可能会被另外一个包的安装覆盖掉.这叫做损坏的包依赖关系(broken dependency). 如果系统出现问题,可以先尝试: yum clean all ...

  7. C#链接Mysql

    先在网上找到Mysql.Data.dll组件, 文件下载地址为http://dev.mysql.com/downloads/connector/net/6.6.html#downloads ,下载平台 ...

  8. centos7 安装KDE

    下载安装了centos7 64位系统之后.初始化安装的是GNOME桌面系统.因为是按照鸟哥的Linux在学习,所以需要安装kde. 首先需要root权限. 打开终端. 输入su root密码.进入ro ...

  9. 杭电多校第一场-M-Code

    题目描述 After returning with honour from ICPC(International Cat Programming Contest) World Finals, Tom ...

  10. Simple example of use of __setstate__ and __getstate__

    class Foo(object): def __init__(self, val=2): self.val = val def __getstate__(self): print ("I' ...