HNUST-OJ-1964- 邻接表表示法
目录
原题复刻:
思想的火花:
代码复刻:
原题复刻:
思想的火花:
1.
struct ArcNode //边结点
{此结构体就是每一条链中非头节点储存的信息int adjvex; // //该节点指向的对应顶点是谁,即回答自己是谁struct ArcNode *nextarc; //指向链的下一条节点OtherInfo info; //和边相关的信息,此题未用到
} ArcNode;
2.
struct VNode
{VerTexType data; //顶点信息,也就是链的头结点ArcNode *firstarc; //指向第一条依附该顶点的边的指针,也就是头结点指向的第一个节点
} VNode, AdjList[MVNum];
3.
struct Graph
{AdjList vertices; //邻接表int vexnum, arcnum; //图的当前顶点数和边数
} ;
4.
VerTexType Vertexdata(const Graph &g, int i)
{return g.vertices[i].data;//得到顶点i的数据
}
5.
int LocateVex(const Graph &g, VerTexType v)
{//确定顶点v在G中的位置for(int i = 0; i < g.vexnum; ++i) if(g.vertices[i].data == v) return i;return -1;
}
6.
int FirstAdjVex(const Graph &g, int v)
{//返回顶点v的第一个邻接顶点。若顶点在G中没有邻接表顶点,则返回-1。
if(g.vertices[v].firstarc)return g.vertices[v].firstarc->adjvex;return -1;
}
7.
int NextAdjVex(const Graph &g, int v, int w)
{
ArcNode *p1=g.vertices[v].firstarc;//找个指针p移动
while(p1->adjvex!=w)p1=p1->nextarc;//负责找到与顶点v有边的除节点w外的下一个节点
if(p1->nextarc)return p1->nextarc->adjvex;//if防止越界
return -1;
}
8.
void sort(ArcNode *arclist)
{//对每个顶点的链表排序,按顶点编号从小到大排列ArcNode *p1,*p2;for(p1=arclist; p1; p1=p1->nextarc){for(p2=p1->nextarc; p2; p2=p2->nextarc){if(p1->adjvex>p2->adjvex)swap(p1->adjvex,p2->adjvex);}}//非常笨拙的排序方法,但数据很小,就没必要要求高效sort
}
9.
int CreateUDG(Graph &g)
{//采用邻接表表示法,创建无向图Gcin>>g.vexnum>>g.arcnum;//顶点数,边数for(int i=0; i<g.vexnum; i++){cin>>g.vertices[i].data;//相当于邻接矩阵中的顶点表g.vertices[i].firstarc=NULL;//在有边关系前,任何一个顶点都没有邻接点}while(g.arcnum--){string v1,v2;cin>>v1>>v2;int h1=LocateVex(g,v1),h2=LocateVex(g,v2);//分别确定顶点v1与v2在G中vexnum个链的位置if(h1!=-1&&h2!=-1)//if防止越界{//v1:ArcNode*p1=new ArcNode;p1->adjvex=h2;//顶点v1的邻接点是v2//头插法:新的节点都会是头节点的新的第一个节点p1->nextarc=g.vertices[h1].firstarc;g.vertices[h1].firstarc=p1;//v2:ArcNode*p2=new ArcNode;//顶点v2的邻接点是v1//头插法:新的节点都会是头节点的新的第一个节点p2->adjvex=h1;p2->nextarc=g.vertices[h2].firstarc;g.vertices[h2].firstarc=p2;}}/***********************************/for(i = 0; i < g.vexnum; ++i){sort(g.vertices[i].firstarc); 保证有序,不依赖输入次序}//forreturn OK;
}
代码复刻:
#include <iostream>
#include <iomanip>
using namespace std;#define MVNum 100 //最大顶点数
#define OK 1
typedef string VerTexType; //顶点信息
typedef int OtherInfo; //和边相关的信息//- - - - -图的邻接表存储表示- - - - -
typedef struct ArcNode //边结点
{int adjvex; //该节点指向的对应顶点是谁,即回答自己是谁struct ArcNode *nextarc; //指向下一条边的指针OtherInfo info; //和边相关的信息
} ArcNode;typedef struct VNode
{VerTexType data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的边的指针
} VNode, AdjList[MVNum]; //AdjList表示邻接表类型typedef struct
{AdjList vertices; //邻接表int vexnum, arcnum; //图的当前顶点数和边数
} Graph;//得到顶点i的数据
VerTexType Vertexdata(const Graph &g, int i)
{return g.vertices[i].data;
}int LocateVex(const Graph &g, VerTexType v)
{//确定点v在G中的位置for(int i = 0; i < g.vexnum; ++i)if(g.vertices[i].data == v)return i;return -1;
}//LocateVex//返回v的第一个邻接顶点。若顶点在G中没有邻接表顶点,则返回-1。
int FirstAdjVex(const Graph &g, int v)
{/****在此下面完成代码***************/if(g.vertices[v].firstarc)return g.vertices[v].firstarc->adjvex;return -1;/***********************************/
}// 返回v的(相对于w的)下一个邻接顶点。
int NextAdjVex(const Graph &g, int v, int w)
{/****在此下面完成代码***************/ArcNode *p1=g.vertices[v].firstarc;while(p1->adjvex!=w)p1=p1->nextarc;if(p1->nextarc)return p1->nextarc->adjvex;return -1;/***********************************/
}//对每个顶点的链表排序,按顶点编号从小到大排列
void sort(ArcNode *arclist)
{/****在此下面完成代码***************/ArcNode *p1,*p2;for(p1=arclist; p1; p1=p1->nextarc){for(p2=p1->nextarc; p2; p2=p2->nextarc){if(p1->adjvex>p2->adjvex)swap(p1->adjvex,p2->adjvex);}}/***********************************/
}int CreateUDG(Graph &g)
{//采用邻接表表示法,创建无向图G/****在此下面完成代码***************/cin>>g.vexnum>>g.arcnum;for(int i=0; i<g.vexnum; i++){cin>>g.vertices[i].data;g.vertices[i].firstarc=NULL;}while(g.arcnum--){string v1,v2;cin>>v1>>v2;int h1=LocateVex(g,v1),h2=LocateVex(g,v2);if(h1!=-1&&h2!=-1){ArcNode*p1=new ArcNode;p1->adjvex=h2;p1->nextarc=g.vertices[h1].firstarc;g.vertices[h1].firstarc=p1;ArcNode*p2=new ArcNode;p2->adjvex=h1;p2->nextarc=g.vertices[h2].firstarc;g.vertices[h2].firstarc=p2;}}/***********************************/for(int i = 0; i < g.vexnum; ++i){sort(g.vertices[i].firstarc); 保证有序,不依赖输入次序}//forreturn OK;
}//CreateUDGvoid DestroyUDG(Graph &g)
{//you should do this
}int main()
{Graph g;CreateUDG(g);//输出各个顶点的邻接点for(int i = 0; i < g.vexnum; i++){cout << Vertexdata(g, i) << ":";for(int w = FirstAdjVex(g, i); w >= 0; w = NextAdjVex(g, i, w)){cout << ' ' << Vertexdata(g, w);}cout << endl;}DestroyUDG(g);return 0;
}//main
HNUST-OJ-1964- 邻接表表示法相关推荐
- 【转载】邻接表表示法
图的邻接表表示法 图的邻接表表示法类似于树的孩子链表表示法.对于图G中的每个顶点v i ,该方法把所有邻接于v i 的顶点v j 链成一个带头 结点的单链表,这个单链表就称为顶点v i 的邻接表(Ad ...
- 有向图的邻接表表示法
图的邻接表表示法类似于树的孩子链表表示法.对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List). 1. ...
- 《数据结构》-图的邻接表表示法(四)
邻接表表示法(链式) 存储定义: 顶点:按编号顺序将顶点数据存储在一维数组中 关联同一顶点的边(以顶点为尾的弧):用线性链表存储 无向图的邻接表 例如,如下无向图 则它的邻接表为 无向图邻接表的特点: ...
- C语言邻接表表示法创建无向图并输出
C语言邻接表表示法创建无向图并输出 邻接表是图的一种链式存储结构,对图的每个顶点建立一个单链表,单链表第一个结点存放顶点信息,其余存放有关边信息. 邻接表由表头结点表和边表组成. 邻接表存储结构 #i ...
- 无向图的邻接表表示法 及 深搜遍历DFS
昨天有小朋友求助关于图的邻接表示及深搜,记得一年前的我学数据结构也搞的乱七八糟的.我就顺便学下吧,网上的代码都好规范的感觉,读那些代码的能力不够,自己把那些代码简化了下. 非常感谢那些小朋友给我这么一 ...
- 数据结构——图的链表实现(邻接表表示法)
图的链表实现 之前实现了图的数组实现 http://blog.csdn.net/cinmyheart/article/details/41370465 下图仅作示意性说明,和测试数据有点区别,测试数据 ...
- 图——图的存储结构(邻接矩阵和邻接表法)
图的五种存储结构: 1.图的邻接矩阵表示法 图是由顶点和边或弧两部分组成.图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组表示图,一个一维数组存储图中的顶点信息,一个二维数组(邻接 ...
- [邻接表] 学习邻接表的表示方法+BFS
算法导论上面的伪代码实现哦,没啥技术,不过这个邻接表表示法(figo大神教的)很nice. 简单说一下,head里面是放着自己节点后面链的最后一个元素在边池中的位置,边池里面成一个一个链状,像并查集, ...
- 图的建立-邻接表表示(C语言)
代码如下: /* 图的邻接表表示法 */#define MaxVertexNum 100 /* 最大顶点数设为100 */ typedef int Vertex; /* 用顶点下标表示顶点,为整型 * ...
- 有向图的邻接表描述 c++
有向图的邻接表表示法 图的邻接表表示法类似于树的孩子链表表示法.对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency ...
最新文章
- trinosql_prestosql问题
- 【 MATLAB 】模拟信号采样及离散时间傅里叶变换(DTFT)案例分析
- 数据中心网络架构 — 云网一体化数据中心网络 — 算力网络 — SDN 架构
- JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
- python学习(函数)
- js解决客户端与服务器时间不一致的问题
- SQLyog创建表示的bug
- linux16.04设置网络,ubuntu16.04之后网络IP配置
- wⅰndows办公软件2003,办公软件2003
- windows批处理脚本bat命令解析【12】ECHO处于关闭状态
- android camera2美颜,Nano Camera(多功能美颜相机)V2.1 安卓版
- 附加SQL Server MDF文件的不同方法
- 外星人入侵(python期末课程设计+源代码)
- 【️C语言-游戏设置】---三子棋(N满)
- 字节跳动小程序对接环信IM遇到的问题
- 互联网快讯:小米公益平台正式上线;极米优质投影产品获好评;三星公布三款新型车用芯片
- Spring Boot 实现苹果支付同步验证
- 用DIV+CSS技术设计我的家乡网站(web前端网页制作课作业)南宁绿城之都
- 算法与数据结构知识点及面试题总结(持续更新中)
- TensorFlow.js 和 Node-RED 图像识别应用程序
热门文章
- YOLOv7姿态估计pose estimation(姿态估计+目标检测+跟踪)
- 操作系统 第七章 死锁
- 时间轴:确保ADAM电影如期进行
- maya导入abc动画_(送给纠结自学3d建模的同学)自学maya,zbrush,substance一个月的感想...
- C语言:编写一个函数,把一个从午夜0点开始计算的秒数转化为对应时间。
- 【kafka实战】分区重分配可能出现的问题和排查问题思路(生产环境实战,附视频)
- 重磅官宣:GitHub App 终于来了
- 微前端之 qiankun 入门、上手、实战(构建大型 web 应用)
- Linux-Linux内核-进程调度
- java操作es创建索引和索引设置