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

图的遍历实现课程设计: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. 剑指offer——56在排序数组中查找数字

    题目描述 统计一个数字在排序数组中出现的次数.   题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N) ...

  2. divide方法

    java.math.BigDecimal.divide(BigDecimal divisor, RoundingMode roundingMode) 返回一个BigDecimal,其值为(this/除 ...

  3. USACO2007 The Bale Tower /// DFS oj21160

    题目大意: 给出N个捆包,每个捆包有相应的长度和宽度,要求堆叠捆包,使下方的捆包长宽永远大于上方的捆包的长宽. Input Multiple test case. For each case: * L ...

  4. k小子串 SPOJ - SUBLEX 2

    题意: 求字典序第K大的子串 题解: 先求出后缀自动机对应节点 // 该节点后面所形成的自字符串的总数 然后直接模拟即可 #include <set> #include <map&g ...

  5. 读书笔记五--numpy

    数组转置和轴对换 转置是重塑的一种特殊形式,返回的是源数据的视图(不会进行任何复制操作).数组不仅有transpose方法,还有一个特殊的T属性: arr=np.arange().reshape((, ...

  6. selenium 自动下载文件

    #coding=utf-8 from selenium import webdriver #实例化一个火狐配置文件 fp = webdriver.FirefoxProfile() #设置各项参数,参数 ...

  7. 微服务(Microservices)和服务网格(Service Mesh)的架构概念

    注:文章内容为摘录性文字,自己阅读的一些笔记,方便日后查看. 微服务(Microservices) 在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技 ...

  8. FastStone Capture 文件名设置小记录

    我使用的FastStone Capture 的文件名设置 文件名称模板 fs$Y$M$D#####@ 起始于: [1] 重置 [ 选中] 新的一天自动重置为1

  9. ES6点点点运算符

    1. rest(可变)参数 * 用来取代arguments 但比arguments灵活,只能是最后部分形参参数 function add(...values) { let sum = ; for(va ...

  10. Batch - windows batch 常用命令(cheat sheet)

    原文地址:https://www.oschina.net/code/snippet_158297_4964 1 echo 和 @ 回显命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 ...