用邻接表实现无向图的创建与输出

 1 #include<stdio.h>
 2 #include <iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 #define MVNum 100
 6 typedef struct ArcNode // 边表结点
 7 {
 8     int adjvex;    // 邻接点域,存储该顶点对应的下标
 9     //int info;      //用于存储权值,对于非网图可以不需要
10     struct ArcNode *nextarc; // 链域,指向下一个邻接点
11 }ArcNode;
12 typedef struct VNode // 顶点表结点
13 {
14     char data; // 顶点域,存储顶点信息
15     ArcNode *firstarc; // 边表头指针
16 }VNode, AdjList[MVNum];
17 typedef struct
18 {
19     AdjList vertices;
20     int vexnum,arcnum; // 图中当前顶点数和边数
21 }ALGraph;
22
23 int LocateVex(ALGraph &G,char v)//找到v在邻接表G中的位置
24 {
25     for(int i=0;i<G.vexnum;i++)
26     {
27         if(G.vertices[i].data==v)
28             return i;
29     }
30     return -1;
31 }
32 void  CreateALGraph(ALGraph &G)
33 {
34     int i,j,k,v;
35     char v1,v2;
36     ArcNode *p1,*p2;
37     scanf("%d%d",&G.vexnum,&G.arcnum); // 输入顶点数和边数
38     for(v = 0;v < G.vexnum;v++) // 读入顶点信息,建立顶点表
39     {
40         scanf("%s",&G.vertices[v].data);     // 输入顶点信息
41         G.vertices[v].firstarc=NULL;     // 将边表置为空表
42     }
43     getchar();
44     for(k = 0;k < G.arcnum;k++)// 建立边表
45     {
46         scanf("%c %c",&v1,&v2);
47         getchar();
48         i=LocateVex(G,v1);
49         j=LocateVex(G,v2);
50         p1=new ArcNode; // 向内存申请空间,生成边表结点
51         p1->adjvex=j;    // 邻接序号为j
52         p1->nextarc=G.vertices[i].firstarc;    //将e的指针指向当前顶点上指向的结点
53         G.vertices[i].firstarc=p1;            // 将当前顶点的指针指向e
54
55         p2=new ArcNode; // 向内存申请空间,生成边表结点
56         p2->adjvex=i;    //邻接序号为i
57         p2->nextarc=G.vertices[j].firstarc;    // 将e的指针指向当前顶点上指向的结点
58         G.vertices[j].firstarc=p2;        // 将当前顶点的指针指向e
59     }
60 }
61 void DispGraphAdjList(ALGraph &G)
62 {
63     int i;
64     ArcNode *p;
65     for(i=0;i< G.vexnum;i++)
66     {
67         printf("%c",G.vertices[i].data);
68         for(p=G.vertices[i].firstarc;p!=NULL;p=p->nextarc)
69             printf("->%c",p->adjvex+‘A‘);
70         printf("\n");
71     }
72 }
73 int main(void)
74 {
75     ALGraph G;
76     CreateALGraph(G);
77     DispGraphAdjList(G);
78     return 0;
79 }

如上图所示的无向图(邻接表创建):

输入:

8 9
A B C D E F G H
A B
B D
B E
E F
D F
A C
C G
C H
G H

输出:

A->C->B
B->E->D->A
C->H->G->A
D->F->B
E->F->B
F->D->E
G->H->C
H->G->C

原文地址:https://www.cnblogs.com/diandianer/p/9965805.html

时间: 2024-10-07 16:10:38

用邻接表实现无向图的创建与输出的相关文章

图论——图的邻接表实现——Java语言(完整demo)

1.图的简单实现方法--邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法. 对于每条边(u,v),置A[u,v]等于true:否则,数组的元素就是false.如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权来标记不存在的边.虽然这样表示非常简单,但是,它的空间需求则为θ(|V|2),如果图的边不是很多,那么这种表示的代价就太大了.若图是稠密(dense)的:|E|=θ(|V|2),则领接矩阵是合适的

DS之顺序表实现乱序输入顺序输出

顺序表的实例有很多,在学其他的编程语言时,肯定都学过要求输入一串乱序的数字,要求进行排序,实现升序或降序输出.今天就来用顺序表实现乱序输入,顺序输出(升序). 实现上述的功能需要用到的顺序表的基本操作有0基本操作前的准备,1初始化顺序表,6向顺序表插入数据元素. 自己只需写一个排序的函数,排序函数的代码为: <span style="font-size:18px;">//排序函数 void paixu(SqList &L) { for(int i=0;i<L.

JAVA邻接表实现拓扑排序

由于一直不适用邻接表 ,现在先贴一段使用邻接矩阵实现图的拓扑排序以及判断有无回路的问题.自己做的图.将就看吧. package TopSort; import java.util.LinkedList; import java.util.Scanner; /*拓扑序列:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性 * 序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. * */ p

用邻接表实现某个点入度和出度

#include <cstdio> #include <cstring> #include <cctype> using namespace std; typedef struct node{//邻接表上的节点 int n; struct node * next; } GNode; typedef struct graph{//图的整个结构 int cn;//顶点个数 int bn;//边的个数 GNode *list;//顶点的数组相当于list[]; }Graph;

数据结构Java版之邻接表实现图(十)

邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.util.List; public class Table { private List<List<Character>> list; private List<Character> headNodes; private int n; private int nVerts;

用顺序表实现一个循环队列

队列是一种先进先出的线性表,简称FIFO.允许插入的一端为队尾,允许出列的一端为队头. 比如一个队列q=(p1,p2,p3,p4...pn),p1就是那个队头,pn就是队尾.出列时总是从p1开始 向后,入列时总是从pn后面插入.就像敲键盘,依次敲qwr,屏幕上显示的就是qwr,先敲的先显 示. 以下代码是用顺序表实现一个循环队列 1 /** 2 * @filename queue.c 3 * @author haohaibo 4 * @data 2017/4/12 5 * @brief 用顺序表

数据结构之哈希表实现浅析

看了下JAVA里面有HashMap.Hashtable.HashSet三种hash集合的实现源码,这里总结下,理解错误的地方还望指正 HashMap和Hashtable的区别 HashSet和HashMap.Hashtable的区别 HashMap和Hashtable的实现原理 HashMap的简化实现MyHashMap HashMap和Hashtable的区别 两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全Hashtable的实现方法里面都添加了synchron

SQL SERVER 2014--内存表实现秒杀场景

===================================== 网上针对“秒杀”的解决方案很多,数据拆分化解热点,READPASH解决锁问题,应用程序排队限制并发等等很多方式,各有优缺点,只为证明一句名言:条条大路通罗马. ===================================== 今天拿SQL SERVER 2014的内存表来试水“秒杀”,内存表使用“版本”解决了高并发下锁请求和阻塞的问题,使用HASH索引来处理数据页“热点”的问题,解决了PAGE_LATCH等待,

DropDownList绑定数据表实现两级联动示例

这篇文章主要介绍了DropDownList绑定数据表实现两级联动具体实现,需要的朋友可以参考下 场景一:平时我们在DropDownList控件下添加下拉选项时,都会使用它的Item.Add方法,直接在代码下添加.如果我们想添加或修改下拉选项,则必须去修改源代码.如果几个DropDownList控件的下拉选项相同,我们则需要重复添加好多次,后期的维护工作很不方便. 场景二:我们在12306网站买票时,肯定遇到过这么一种情景:我们需要先选定目的地的省份,选完省份后在城市选框中会自动加载该省份的城市,