数据结构——图的十字链表实现
十字链表定义
之前的邻接表对于有向图来说,可分为邻接表和逆邻接表,对于出入度要求不同时,生成的邻接表也不同
十字链表的出现就是将 邻接表和逆邻接表整合在一起
在同一个代码中,对于一个顶点可以找到其出度也可以找到其入度
在十字链表存储结构中,有向图中的顶点表的结点结构如下所示:
data存储数据,firstIn指向入边表头指针,firstOut指向出边表头指针。
边表结点结构如下
其中的tailVex表示该弧的弧尾顶点在顶点数组xList中的位置
headVex表示该弧的弧头顶点在顶点数组中的位置
hLink则表示指向弧头相同的下一条弧
tLink则表示指向弧尾相同的下一条弧。
如下图所示的一个有向图:
十字链表结构体定义
里面那个inof不知道啥意思
#include<iostream>
using namespace std;
#define MAX 25typedef char Vertype;
typedef int infotype;//这是权重吗
typedef int Status;typedef struct Arc_node//弧结点结构
{int tailvex, headvex;struct Arc_node *hlink, *tlink;infotype *info;//这是权重的意思吗?int weight;
}Arc_node;typedef struct Vex_Node//顶点结构
{Vertype data;Arc_node *firstIn, *firstOut;
}Vex_Node;typedef struct Or_list//十字链表
{Vex_Node list[MAX];//顶点列表int Vexnum, Arcnum;//顶点数目 和 边的数目
}Or_list;
//被调用的函数要声明
Status locateVertex(Or_list &G, Vex_Node node);
Status inserArc(Or_list &G, Vex_Node node1, Vex_Node node2);
Status inserArction(Or_list &G, int index1, int index2);//生成图
Status CreatOr_list(Or_list &G)
{cout <<"输入顶点数目和边的数目: " << endl;cin >> G.Vexnum;cin >> G.Arcnum;//初始化cout <<"输入"<<G.Vexnum<<"个顶点内容: " << endl;for (int i = 0; i < G.Vexnum; i++){cin >> G.list[i].data;G.list[i].firstIn = NULL;G.list[i].firstOut = NULL;}//增加弧for (int j = 0; j < G.Arcnum; j++){//此时,只有初始化的十字链表 弧还没有形成,所以这里将形成弧Vex_Node node1, node2;cout << "请输入第"<<j+1<<"条弧的两个顶点"<< endl;cin >> node1.data >> node2.data;inserArc(G,node1,node2);}return 0;
}//获取两个顶点下标 并生成弧
Status inserArc(Or_list &G, Vex_Node node1, Vex_Node node2)
{int index1 = locateVertex(G,node1);//获取下标int index2 = locateVertex(G,node2);if (index1 == -1 || index2 == -1){cout << "顶点不存在"<< endl;return NULL;}inserArction(G,index1,index2);return 0;
}//寻找某一顶点的下标
Status locateVertex(Or_list &G, Vex_Node node)//获取该顶点下标
{int i,index=-1;for (i = 0; i < G.Vexnum; i++){if (G.list[i].data == node.data){index = i;break;//如果有重复的呢}}return index;
}//生成弧
Status inserArction(Or_list &G, int index1, int index2)
{Arc_node *pArc = new Arc_node;pArc->tailvex = index1;pArc->headvex = index2;pArc->info = NULL;//这一段是什么, pArc->tlink = G.list[index1].firstOut;pArc->hlink = G.list[index2].firstIn;G.list[index1].firstOut = pArc;G.list[index2].firstIn = pArc;cout << "输入权重: "<< endl;cin>>pArc->weight;return 0;
}//输出图
Status DispGhaph(Or_list &G)
{for (int i = 0; i < G.Vexnum; i++){//ptail 和phead 可以指向弧的前后顶点位置Arc_node *ptail = G.list[i].firstOut;//以i位置顶点为出指针Arc_node *phead = G.list[i].firstIn;//以i位置顶点为入指针cout << i << " 位置顶点元素为: " << G.list[i].data << endl;cout << "输出以" << G.list[i].data << "弧尾结构: " << endl;while (ptail){cout << G.list[ptail->tailvex].data <<'\t'<< "->" << '\t' << ptail->weight << '\t' << G.list[ptail->headvex].data << endl;ptail = ptail->tlink;}cout << "输出以" << G.list[i].data << "弧头结构" << endl;while (phead){cout << G.list[phead->headvex].data << '\t' << phead->weight << '\t' << "<-" << '\t' << G.list[phead->tailvex].data << endl;phead = phead->hlink;}}return 0;
}
//增加弧
Status ADDGhaphARC(Or_list &G)
{//增加新的弧 如果弧原本存在,提示。如果不存在就生成这条弧Vex_Node node1, node2;int I1=-1, I2=-1;cout << "输入两个顶点以便生成弧"<< endl;cin >> node1.data >> node2.data;for (int i = 0; i < G.Vexnum; i++){if (G.list[i].data == node1.data){I1 = i;break;}}for (int i = 0; i < G.Vexnum; i++){if (G.list[i].data == node2.data){I2 = i;break;}}if (I1 == -1 || I2 == -1){cout << "没有这个值"<< endl;return NULL;}else if (G.list[I1].firstOut ==G.list[I2].firstIn){cout << "弧原本存在"<< endl;return NULL;}else{cout << "顶点合法,将生成弧"<< endl;inserArction(G,I1,I2);}return 0;
}int main()
{Or_list G;CreatOr_list(G);DispGhaph(G);ADDGhaphARC(G);DispGhaph(G);system("pause");return 0;
}
在写这个的时候发现前面的额数据结构 都是在顺利的条件下生成 那么如果遇到输入格式或者范围超过时应该写一个提示输入不合规,重新输入的循环体,,,记得下次循环回头时重新编,我打算先将数据结构基础的都过一遍,用c给它写出来,现在开始入门JAVA的坑了,等学了基本的,在将数据结构用JAVA编写,一来练练JAVA 二来巩固完善数据结构
数据结构——图的十字链表实现相关推荐
- 图的十字链表存储结构
前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...
- 图的十字链表存储法详解
前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...
- 数据结构——图的定义和实现
这里写目录标题 图的定义 各种图的定义 无向边 有向边 图的顶点与边的关系 连通图生成树 图的各种实现 在引入邻接矩阵之前先介绍一下图的相关概念(概念比前树啥的面稍微复杂一点) 图的定义 之前学了线性 ...
- 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)
目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...
- 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现
上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...
- 数据结构--图(Graph)详解(二)
数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...
- 数据结构--图(Graph)详解(一)
数据结构–图(Graph)详解(一) 文章目录 数据结构--图(Graph)详解(一) 一.图的基本概念 1.图的分类 2.弧头和弧尾 3.入度和出度 4.(V1,V2) 和 < V1,V2 & ...
- c语言建立并存储树,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...
#include #include #include /* 利用十字链表存储有向图,可用于同时查找某个顶点的出度与入度: */ typedef struct edge {//顶点表 int headv ...
- 构建复杂网络的几种方法(邻接矩阵,邻接表,十字链表,邻接多重表)
目录 1. 数据结构 线性结构 非线性结构 2. 复杂网络的数组表示 3. 复杂网络的邻接表表示 4. 邻接矩阵与邻接表的比较 5. 复杂网络的其他表示方法 逆邻接表 十字链表 邻接多重表 前向星 链 ...
最新文章
- vr二维码_VR小花看看app
- 10·24【运维工程师也过节】【运维MySQL大礼包】
- Codeforces Round #619 (Div. 2) E. Nanosoft 思维 + 二维前缀和
- 吃透 | Elasticsearch filter和query的不同
- cocos2d-lua3.7组件篇(三)-http通信demo
- Hive静态分区表动态分区表
- java正则效率_善用Pattern提高你的应用处理正则表达式的效率(Java)
- ubuntu触电(转)
- BZOJ2612 : [Poi2003]Sums
- 用JAVA制作小游戏——飞机大战(二)
- c# 打开的窗口显示在最前面_了解各种切换程序窗口的方法,提高工作效率
- Mac动态桌面壁纸Dynamic Wallpaper惊艳你的桌面
- 想学一门计算机技术 Java和Python哪个前景好
- 百度给创新员工发2000w奖金........
- 最新青龙面板安装教程+依赖+拉库合集
- 【skLearn 回归模型】岭回归 <linear_model.Ridge>
- 【windows】win8.1的安装中绕过Microsoft帐户登录
- Oracle数据库,建库建表
- 年产2万吨山楂酒工厂的设计-装瓶工段及车间的设计(lunwen+任务书+开题+选题表+cad图纸)
- 运筹学——运输问题数学模型
热门文章
- jQuery attr()获取属性和设置属性的方法
- 第一二天作业-BGP MPLS + OSPF分流互备做法
- 单点登录与第三方登录 + CSRF-XSS-DNS-DDOS-SQL攻击
- Linux TCP之sack(一)
- 数据结构更新中...
- ORA-00054 错误原因分析
- 编程参考 - va_list的定义问题
- day03链表基础_移除链表元素_设计链表_反转链表
- tring转换成Integer numberformatexception 分析
- 文本预处理学习(2)