#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

提示:粘贴进控制台按回车运行!

邻接表-建立无向图、无向网、有向图、有向网相关推荐

  1. 使用邻接表创建无向图和有向图

    图的邻接表表示法: 邻接表(Adjacency List) 是图的 一 种链式存储结构.在邻接表中,对图中每个顶点V建立一个单链表,把与 V相邻接的顶点放在这个链表中.邻接表中每个单链表的第一个结点存 ...

  2. 邻接表建立图(c语言)

    邻接表建立图 有向图 无向图 邻接表存图进行拓扑排序 不得不说网上的真的是太乱了,看得我脑壳疼 自己写的可以,感觉好的话可以当成模板. 有向图 代码: #include<stdio.h> ...

  3. 数据结构与算法A实验六图论---7-11 邻接表创建无向图

    采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输入第二行为顶点的信息,每个顶点只能用一个字符表 ...

  4. 6-6 采用邻接表创建无向图

    采用邻接表创建无向图G ,依次输出各顶点的度. 函数接口定义: void CreateUDG(ALGraph &G); 其中 G 是采用邻接表表示的无向图. 裁判测试程序样例: #includ ...

  5. 利用邻接表创建无向图

    #include<iostream> using namespace std; #define MVNum 100 #define OK 1 typedef char VerTexType ...

  6. 图 邻接表 建立 深度遍历 广度遍历

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 图的邻接 ...

  7. 无向图有向图的邻接表法建立

    目录 无向图的邻接表法建立 有向图的邻接表法 无向图的邻接表法建立 要求建立一个无向图,采用邻接表做为存储结构. 例如: 输入信息为:第一行给出图的顶点数n和边数e.第二行给出n个字符,表示n个顶点的 ...

  8. 《数据结构与算法》实验报告——无向图邻接表的构造

    <数据结构>实验报告 学号:2018329621200 机器号10-414-28 姓名: 申屠志刚 日期:2019/12/9 程序名:main.cpp 实验内容: 无向图邻接表的构造 一. ...

  9. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

最新文章

  1. 惨淡!苏州楼市政策调控下,这些房企高调入驻,如今黯然离场?
  2. 深度好文丨区块链将彻底改变人工智能
  3. 【Android 逆向】ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )
  4. python消费kafka逻辑处理导致cpu升高_请教:Python模块KafkaConsumer会被Kerberos的状态影响嘛?...
  5. python pynlpir中科院分词的使用
  6. 嵌入式操作系统的主要特点都有哪些
  7. 【论文】使用bilstm在中文分词上的SOTA模型
  8. jt808server .java_jt808-server
  9. 网站地图在线生成html
  10. springboot maven项目打包SAPJCO3.JAR
  11. EMC VMAX控制台更换指南
  12. win11浏览器默认主页如何设置
  13. Broken Auth and session mgmt
  14. smbian c++生成sis文件日记
  15. 记录:seekbar进度条宽度和滑块高度一致问题
  16. 从 ADNI 的 XML 文件中读取临床信息
  17. 研究发现,每天冲洗鼻腔,可减少新冠症状和死亡风险
  18. 通过数据了解用户——数据在新品设计中的应用
  19. js将图片/文件等资源保存(下载)到本地
  20. 网站服务器如何选择?

热门文章

  1. java中protected权限与默认权限的区别
  2. 渗透之路 安全工具【第四篇】系统漏洞扫描之启明天镜
  3. lynda怎样免费看_您可能可以从本地图书馆获得免费的Lynda.com访问
  4. RISCV--汇编指令
  5. 面试测试岗想拿13K,HR说你最多值10K,教你怼死HR?
  6. 最常去的IT网站(技术类,资讯类,个人博客)
  7. 杭电ACM 1003
  8. 因果推断1:Counterfactual Prediction for Bundle Treatment(NeurIPS 2020)
  9. 论文中文翻译——Double-Fetch情况如何演变为Double-Fetch漏洞:Linux内核中的双重获取研究
  10. 以太网使用的CSMA/CD协议是以争用方式接入到共享信道的。这与传统的时分复用TDM相比优缺点如何?网络适配器的作用是什么?网络适配器工作在哪一层?假定1km长的CSMA/CD网络的数据率为1Gb/s