/*** C++: 邻接表表示的"无向图(List Undirected Graph)"** @author judyge* @date 2014/04/19*/#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;#define MAX 100
// 邻接表
class ListUDG
{private: // 内部类// 邻接表中表对应的链表的顶点class ENode{public:int ivex;           // 该边所指向的顶点的位置ENode *nextEdge;    // 指向下一条弧的指针};// 邻接表中表的顶点class VNode{public:char data;          // 顶点信息ENode *firstEdge;   // 指向第一条依附该顶点的弧};private: // 私有成员int mVexNum;             // 图的顶点的数目int mEdgNum;             // 图的边的数目VNode mVexs[MAX];public:// 创建邻接表对应的图(自己输入)ListUDG();// 创建邻接表对应的图(用已提供的数据)ListUDG(char vexs[], int vlen, char edges[][2], int elen);~ListUDG();// 打印邻接表图void print();private:// 读取一个输入字符char readChar();// 返回ch的位置int getPosition(char ch);// 将node节点链接到list的最后void linkLast(ENode *list, ENode *node);
};/** 创建邻接表对应的图(自己输入)*/
ListUDG::ListUDG()
{char c1, c2;int v, e;int i, p1, p2;ENode *node1, *node2;// 输入"顶点数"和"边数"cout << "input vertex number: ";cin >> mVexNum;cout << "input edge number: ";cin >> mEdgNum;if ( mVexNum < 1 || mEdgNum < 1 || (mEdgNum > (mVexNum * (mVexNum-1)))){cout << "input error: invalid parameters!" << endl;return ;}// 初始化"邻接表"的顶点for(i=0; i<mVexNum; i++){cout << "vertex(" << i << "): ";mVexs[i].data = readChar();mVexs[i].firstEdge = NULL;}// 初始化"邻接表"的边for(i=0; i<mEdgNum; i++){// 读取边的起始顶点和结束顶点cout << "edge(" << i << "): ";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);// 初始化node1node1 = new ENode();node1->ivex = p2;// 将node1链接到"p1所在链表的末尾"if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;elselinkLast(mVexs[p1].firstEdge, node1);// 初始化node2node2 = new ENode();node2->ivex = p1;// 将node2链接到"p2所在链表的末尾"if(mVexs[p2].firstEdge == NULL)mVexs[p2].firstEdge = node2;elselinkLast(mVexs[p2].firstEdge, node2);}
}/** 创建邻接表对应的图(用已提供的数据)*/
ListUDG::ListUDG(char vexs[], int vlen, char edges[][2], int elen)
{char c1, c2;int i, p1, p2;ENode *node1, *node2;// 初始化"顶点数"和"边数"mVexNum = vlen;mEdgNum = elen;// 初始化"邻接表"的顶点for(i=0; i<mVexNum; i++){mVexs[i].data = vexs[i];mVexs[i].firstEdge = NULL;}// 初始化"邻接表"的边for(i=0; i<mEdgNum; i++){// 读取边的起始顶点和结束顶点c1 = edges[i][0];c2 = edges[i][1];p1 = getPosition(c1);p2 = getPosition(c2);// 初始化node1node1 = new ENode();node1->ivex = p2;// 将node1链接到"p1所在链表的末尾"if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;elselinkLast(mVexs[p1].firstEdge, node1);// 初始化node2node2 = new ENode();node2->ivex = p1;// 将node2链接到"p2所在链表的末尾"if(mVexs[p2].firstEdge == NULL)mVexs[p2].firstEdge = node2;elselinkLast(mVexs[p2].firstEdge, node2);}
}/* * 析构函数*/
ListUDG::~ListUDG()
{
}/** 将node节点链接到list的最后*/
void ListUDG::linkLast(ENode *list, ENode *node)
{ENode *p = list;while(p->nextEdge)p = p->nextEdge;p->nextEdge = node;
}/** 返回ch的位置*/
int ListUDG::getPosition(char ch)
{int i;for(i=0; i<mVexNum; i++)if(mVexs[i].data==ch)return i;return -1;
}/** 读取一个输入字符*/
char ListUDG::readChar()
{char ch;do {cin >> ch;} while(!((ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')));return ch;
}/** 打印邻接表图*/
void ListUDG::print()
{int i,j;ENode *node;cout << "List Graph:" << endl;for (i = 0; i < mVexNum; i++){cout << i << "(" << mVexs[i].data << "): ";node = mVexs[i].firstEdge;while (node != NULL){cout << node->ivex << "(" << mVexs[node->ivex].data << ") ";node = node->nextEdge;}cout << endl;}
}int main()
{char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};char edges[][2] = {{'A', 'C'}, {'A', 'D'}, {'A', 'F'}, {'B', 'C'}, {'C', 'D'}, {'E', 'G'}, {'F', 'G'}};int vlen = sizeof(vexs)/sizeof(vexs[0]);int elen = sizeof(edges)/sizeof(edges[0]);ListUDG* pG;// 自定义"图"(输入矩阵队列)//pG = new ListUDG();// 采用已有的"图"pG = new ListUDG(vexs, vlen, edges, elen);pG->print();   // 打印图return 0;
}

ACM 模板--链接表 无向图相关推荐

  1. ACM模板--邻接矩阵 无向图 搜索算法

    /*** C++: 邻接矩阵表示的"无向图(Matrix Undirected Graph)"** @author judyge* @date 2014/04/19*/#inclu ...

  2. ACM模板--邻接矩阵 无向图

    /*** C++: 邻接矩阵表示的"无向图(List Undirected Graph)"** @author skywang* @date 2014/04/19*/#includ ...

  3. ACM模板--邻接矩阵 无向图 Prim Kruskal Dijkstra

    /*** C++: Dijkstra算法获取最短路径(邻接矩阵)** @author skywang* @date 2014/04/24*/#include <iomanip> #incl ...

  4. ACM模板--链接表 有向图

    /*** C++: 邻接表图** @author judyge* @date 2014/04/19*/#include <iomanip> #include <iostream> ...

  5. 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)

    你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...

  6. ACM模板 | 学习笔记 树相关

    持续更新中qwq 咕咕咕 此次update是在我原先自己的博客园博客的基础上进行更新的(隔了两年该忘的不该忘的都忘完了qwq),顺便整理一下我的acm模板QAQ (我保证2021.3.1开学之前搞完! ...

  7. 线性求逆元模板_ZXBlog/ACM模板(C++).md at bb6f2522054d5370df79222461293721e8edede2 · cw1027/ZXBlog · GitHub...

    ACM模板(C++) 1.大数 加法,乘法模板 //题目链接 : http://poj.org/problem?id=2506 //题目大意 : 就是问你用2*1,1*2,2*2的砖拼成2*n的长方形 ...

  8. ACM模板(满注释模板!)

    转自:https://fanfansann.blog.csdn.net/article/details/105493218 目录 F o r e w o r d ForewordForeword T ...

  9. ACM 模板--邻接表 无向图 搜索算法

    图的 广度优先搜索 深度递归与非递归搜索 /*** C++: 邻接表表示的"无向图(List Undirected Graph)"** @author judyge* @date ...

最新文章

  1. AI 助力金融后,中美金融科技领域最大的差距是什么?
  2. vue openlayer单击地图事件循环多次执行_VUE生命周期函数面试题
  3. Sql Server截断日志(转)
  4. python wand安装_Python Wand posterize()用法及代码示例
  5. Python3解析XML文件(xml.etree.ElementTree)——以简单网络爬虫为例
  6. Gartner:克服SIEM部署失败的通病
  7. (图文)HBASE的知识点以及工作原理的详细解释--架构
  8. SQLi LABS Less-22
  9. 计算机网络第二章-----物理层
  10. 1.1 统计学习方法概论(个人笔记与随感)
  11. 菜鸟使用RedHat Linux9.0极品笑话
  12. 移动开发需要关心的热门技术(1)
  13. 梅特勒托利多xk3124电子秤说明书_托利多电子秤设置说明
  14. 水准测量的各种数字考点
  15. 【高德地图入门】--- 绘制面
  16. JAVA入门-024(int的正负数)
  17. 谷歌的nofollow外链还有权重传递效果吗?【外贸知识】
  18. BZOJ 1412: [ZJOI2009]狼和羊的故事
  19. eth0和lo含义和虚拟IP技术
  20. linux pci 网卡驱动,linux网络设备驱动_pci网卡

热门文章

  1. 【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )
  2. 【错误记录】Android Studio 运行报错 ( There is not enough memory to perform the requested operation. )
  3. 【Flutter】StatefulWidget 组件 ( Image 组件 | TextField 组件 )
  4. react复习总结(1)--react组件开发基础
  5. python pip命令技巧
  6. python中为什么需要使用“if __name__ == '__main__'”语句
  7. Centos 安装Mongo DB
  8. 20145228《Java程序设计》课程总结
  9. 设计模式-设计原则(Design Principle)
  10. rabbitmq 集群搭建