邻接表-建立无向图、无向网、有向图、有向网
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define OK 1
#define ERROR 0
typedef int InfoType; /* 该弧相关信息的指针类型 */
typedef char VertexType; /* 顶点的类型 */
typedef struct ArcNode /* 弧结点的结构 */
{
int adjvex; /* 该弧所指向的顶点的位置 */
struct ArcNode *nextarc; /* 指向下一条弧的指针 */
InfoType *info; /* 该弧相关信息的指针(觉得应该是记录某些备注信息)如权值 */
}ArcNode;
typedef struct VNode /* 顶点结点的结构 */
{
VertexType data; /* 顶点信息 */
ArcNode *firstarc; /* 指向第一条依附该顶点的弧的指针 */
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct /* 图的邻接表结构定义 */
{
AdjList vertices; /* 存放顶点的数组 */
int vexnum, arcnum; /* 图的当前顶点数和弧数 */
int kind; /* 图的种类标志 */
}ALGraph;
int CreateUDG(ALGraph &G) /* 邻接表建立无向图 */
{
int i,s,d;
ArcNode *p, *q;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d",&s,&d); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
q = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 保存该弧所指向的顶点位置 */
q->adjvex = s; /* 保存该弧所指向的顶点位置 */
p->nextarc = G.vertices[s].firstarc;
G.vertices[s].firstarc = p;
q->nextarc = G.vertices[d].firstarc;
G.vertices[d].firstarc = q;
}
return OK;
}
int CreateUDN(ALGraph &G) /* 邻接表建立无向网 */
{
int i,s,d,w;
ArcNode *p, *q;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d%d",&s,&d,&w); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
q = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->info = (InfoType *)malloc(sizeof(InfoType));
q->info = (InfoType *)malloc(sizeof(InfoType));
p->adjvex = d; /* 保存该弧所指向的顶点位置 */
q->adjvex = s; /* 保存该弧所指向的顶点位置 */
*(p->info) = w; /* 保存权值到一个结点里 */
*(q->info) = w; /* 保存权值到一个结点里 */
p->nextarc = G.vertices[s].firstarc;
G.vertices[s].firstarc = p;
q->nextarc = G.vertices[d].firstarc;
G.vertices[d].firstarc = q;
}
return OK;
}
int CreateDG(ALGraph &G) /* 邻接表建立有向图 */
{
int i,s,d;
ArcNode *p;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d",&s,&d); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 保存该弧所指向的终点位置 */
/* 这两句代码相当于单链表的插入操作 */
p->nextarc = G.vertices[s].firstarc; /* 保存顶点所对应的终点位置 */
G.vertices[s].firstarc = p;
}
return OK;
}
int CreateDN(ALGraph &G) /* 邻接表建立有向网 */
{
int i,s,d,w;
ArcNode *p;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d%d",&s,&d,&w); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 保存该弧所指向的终点位置 */
p->info = (InfoType*)malloc(sizeof(InfoType));
*(p->info) = w;
/* 这两句代码相当于单链表的插入操作 */
p->nextarc = G.vertices[s].firstarc; /* 保存顶点所对应的终点位置 */
G.vertices[s].firstarc = p;
}
return OK;
}
int PrintALGraphUDG(ALGraph *G) /* 打印无向图每个结点的单链表 */
{
int i;
printf("打印无向图/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
printf("%c: ",G->vertices[i].data);
while(G->vertices[i].firstarc->nextarc != NULL)
{
printf("%d ",G->vertices[i].firstarc->adjvex);
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("%d/n",G->vertices[i].firstarc->adjvex);
}
return OK;
}
int PrintALGraphUDN(ALGraph *G) /* 打印无向网每个结点的单链表 */
{
int i, j;
printf("打印无向网/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
while(G->vertices[i].firstarc->nextarc)
{
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex;
printf("%c",G->vertices[j].data);
printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex;
printf("%c",G->vertices[j].data);
printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));
printf("------------------------------------------/n");
}
return OK;
}
int PrintALGraphDG(ALGraph *G) /* 打印有向图每个结点的单链表 */
{
int i;
printf("打印有向图/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
printf("%c: ",G->vertices[i].data);
if(G->vertices[i].firstarc == NULL)
{
printf("/n");
continue;
}
while(G->vertices[i].firstarc)
{
printf("%d ",G->vertices[i].firstarc->adjvex);
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("/n");
}
return OK;
}
int PrintALGraphDN(ALGraph *G) /* 打印有向网每个结点的单链表 */
{
int i, j;
printf("打印有向网/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
while(G->vertices[i].firstarc)
{
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex; /* 取得终点的位置 */
printf("%c",G->vertices[j].data);
printf("/tweight = %d/n",*(G->vertices[i].firstarc->info));
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
}
return OK;
}
void main()
{
ALGraph G;
//CreateUDG(G); /* 建立无向图 */
//PrintALGraphUDG(&G); /* 打印无向图 */
//CreateDG(G); /* 建立有向图 */
//PrintALGraphDG(&G); /* 打印有向图 */
//CreateUDN(G); /* 建立无向网 */
//PrintALGraphUDN(&G); /* 打印无向网 */
CreateDN(G); /* 建立有向网 */
PrintALGraphDN(&G); /* 打印有向网 */
}
图 的测试数据为:5 4 a b c d e 1 2 1 3 1 5 4 5
网 的测试数据为:5 4 a b c d e 1 2 10 1 3 15 1 5 20 4 5 30
提示:粘贴进控制台按回车运行!
邻接表-建立无向图、无向网、有向图、有向网相关推荐
- 使用邻接表创建无向图和有向图
图的邻接表表示法: 邻接表(Adjacency List) 是图的 一 种链式存储结构.在邻接表中,对图中每个顶点V建立一个单链表,把与 V相邻接的顶点放在这个链表中.邻接表中每个单链表的第一个结点存 ...
- 邻接表建立图(c语言)
邻接表建立图 有向图 无向图 邻接表存图进行拓扑排序 不得不说网上的真的是太乱了,看得我脑壳疼 自己写的可以,感觉好的话可以当成模板. 有向图 代码: #include<stdio.h> ...
- 数据结构与算法A实验六图论---7-11 邻接表创建无向图
采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输入第二行为顶点的信息,每个顶点只能用一个字符表 ...
- 6-6 采用邻接表创建无向图
采用邻接表创建无向图G ,依次输出各顶点的度. 函数接口定义: void CreateUDG(ALGraph &G); 其中 G 是采用邻接表表示的无向图. 裁判测试程序样例: #includ ...
- 利用邻接表创建无向图
#include<iostream> using namespace std; #define MVNum 100 #define OK 1 typedef char VerTexType ...
- 图 邻接表 建立 深度遍历 广度遍历
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 图的邻接 ...
- 无向图有向图的邻接表法建立
目录 无向图的邻接表法建立 有向图的邻接表法 无向图的邻接表法建立 要求建立一个无向图,采用邻接表做为存储结构. 例如: 输入信息为:第一行给出图的顶点数n和边数e.第二行给出n个字符,表示n个顶点的 ...
- 《数据结构与算法》实验报告——无向图邻接表的构造
<数据结构>实验报告 学号:2018329621200 机器号10-414-28 姓名: 申屠志刚 日期:2019/12/9 程序名:main.cpp 实验内容: 无向图邻接表的构造 一. ...
- 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)
摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...
最新文章
- 惨淡!苏州楼市政策调控下,这些房企高调入驻,如今黯然离场?
- 深度好文丨区块链将彻底改变人工智能
- 【Android 逆向】ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )
- python消费kafka逻辑处理导致cpu升高_请教:Python模块KafkaConsumer会被Kerberos的状态影响嘛?...
- python pynlpir中科院分词的使用
- 嵌入式操作系统的主要特点都有哪些
- 【论文】使用bilstm在中文分词上的SOTA模型
- jt808server .java_jt808-server
- 网站地图在线生成html
- springboot maven项目打包SAPJCO3.JAR
- EMC VMAX控制台更换指南
- win11浏览器默认主页如何设置
- Broken Auth and session mgmt
- smbian c++生成sis文件日记
- 记录:seekbar进度条宽度和滑块高度一致问题
- 从 ADNI 的 XML 文件中读取临床信息
- 研究发现,每天冲洗鼻腔,可减少新冠症状和死亡风险
- 通过数据了解用户——数据在新品设计中的应用
- js将图片/文件等资源保存(下载)到本地
- 网站服务器如何选择?
热门文章
- java中protected权限与默认权限的区别
- 渗透之路 安全工具【第四篇】系统漏洞扫描之启明天镜
- lynda怎样免费看_您可能可以从本地图书馆获得免费的Lynda.com访问
- RISCV--汇编指令
- 面试测试岗想拿13K,HR说你最多值10K,教你怼死HR?
- 最常去的IT网站(技术类,资讯类,个人博客)
- 杭电ACM 1003
- 因果推断1:Counterfactual Prediction for Bundle Treatment(NeurIPS 2020)
- 论文中文翻译——Double-Fetch情况如何演变为Double-Fetch漏洞:Linux内核中的双重获取研究
- 以太网使用的CSMA/CD协议是以争用方式接入到共享信道的。这与传统的时分复用TDM相比优缺点如何?网络适配器的作用是什么?网络适配器工作在哪一层?假定1km长的CSMA/CD网络的数据率为1Gb/s