目录

原题复刻:

思想的火花:

代码复刻:


原题复刻:

 思想的火花:

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- 邻接表表示法相关推荐

  1. 【转载】邻接表表示法

    图的邻接表表示法 图的邻接表表示法类似于树的孩子链表表示法.对于图G中的每个顶点v i ,该方法把所有邻接于v i 的顶点v j 链成一个带头 结点的单链表,这个单链表就称为顶点v i 的邻接表(Ad ...

  2. 有向图的邻接表表示法

    图的邻接表表示法类似于树的孩子链表表示法.对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List). 1. ...

  3. 《数据结构》-图的邻接表表示法(四)

    邻接表表示法(链式) 存储定义: 顶点:按编号顺序将顶点数据存储在一维数组中 关联同一顶点的边(以顶点为尾的弧):用线性链表存储 无向图的邻接表 例如,如下无向图 则它的邻接表为 无向图邻接表的特点: ...

  4. C语言邻接表表示法创建无向图并输出

    C语言邻接表表示法创建无向图并输出 邻接表是图的一种链式存储结构,对图的每个顶点建立一个单链表,单链表第一个结点存放顶点信息,其余存放有关边信息. 邻接表由表头结点表和边表组成. 邻接表存储结构 #i ...

  5. 无向图的邻接表表示法 及 深搜遍历DFS

    昨天有小朋友求助关于图的邻接表示及深搜,记得一年前的我学数据结构也搞的乱七八糟的.我就顺便学下吧,网上的代码都好规范的感觉,读那些代码的能力不够,自己把那些代码简化了下. 非常感谢那些小朋友给我这么一 ...

  6. 数据结构——图的链表实现(邻接表表示法)

    图的链表实现 之前实现了图的数组实现 http://blog.csdn.net/cinmyheart/article/details/41370465 下图仅作示意性说明,和测试数据有点区别,测试数据 ...

  7. 图——图的存储结构(邻接矩阵和邻接表法)

    图的五种存储结构: 1.图的邻接矩阵表示法 图是由顶点和边或弧两部分组成.图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组表示图,一个一维数组存储图中的顶点信息,一个二维数组(邻接 ...

  8. [邻接表] 学习邻接表的表示方法+BFS

    算法导论上面的伪代码实现哦,没啥技术,不过这个邻接表表示法(figo大神教的)很nice. 简单说一下,head里面是放着自己节点后面链的最后一个元素在边池中的位置,边池里面成一个一个链状,像并查集, ...

  9. 图的建立-邻接表表示(C语言)

    代码如下: /* 图的邻接表表示法 */#define MaxVertexNum 100 /* 最大顶点数设为100 */ typedef int Vertex; /* 用顶点下标表示顶点,为整型 * ...

  10. 有向图的邻接表描述 c++

    有向图的邻接表表示法 图的邻接表表示法类似于树的孩子链表表示法.对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency ...

最新文章

  1. trinosql_prestosql问题
  2. 【 MATLAB 】模拟信号采样及离散时间傅里叶变换(DTFT)案例分析
  3. 数据中心网络架构 — 云网一体化数据中心网络 — 算力网络 — SDN 架构
  4. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
  5. python学习(函数)
  6. js解决客户端与服务器时间不一致的问题
  7. SQLyog创建表示的bug
  8. linux16.04设置网络,ubuntu16.04之后网络IP配置
  9. wⅰndows办公软件2003,办公软件2003
  10. windows批处理脚本bat命令解析【12】ECHO处于关闭状态
  11. android camera2美颜,Nano Camera(多功能美颜相机)V2.1 安卓版
  12. 附加SQL Server MDF文件的不同方法
  13. 外星人入侵(python期末课程设计+源代码)
  14. 【️C语言-游戏设置】---三子棋(N满)
  15. 字节跳动小程序对接环信IM遇到的问题
  16. 互联网快讯:小米公益平台正式上线;极米优质投影产品获好评;三星公布三款新型车用芯片
  17. Spring Boot 实现苹果支付同步验证
  18. 用DIV+CSS技术设计我的家乡网站(web前端网页制作课作业)南宁绿城之都
  19. 算法与数据结构知识点及面试题总结(持续更新中)
  20. TensorFlow.js 和 Node-RED 图像识别应用程序

热门文章

  1. YOLOv7姿态估计pose estimation(姿态估计+目标检测+跟踪)
  2. 操作系统 第七章 死锁
  3. 时间轴:确保ADAM电影如期进行
  4. maya导入abc动画_(送给纠结自学3d建模的同学)自学maya,zbrush,substance一个月的感想...
  5. C语言:编写一个函数,把一个从午夜0点开始计算的秒数转化为对应时间。
  6. 【kafka实战】分区重分配可能出现的问题和排查问题思路(生产环境实战,附视频)
  7. 重磅官宣:GitHub App 终于来了
  8. 微前端之 qiankun 入门、上手、实战(构建大型 web 应用)
  9. Linux-Linux内核-进程调度
  10. java操作es创建索引和索引设置