十字链表定义

之前的邻接表对于有向图来说,可分为邻接表和逆邻接表,对于出入度要求不同时,生成的邻接表也不同
十字链表的出现就是将 邻接表和逆邻接表整合在一起
在同一个代码中,对于一个顶点可以找到其出度也可以找到其入度
在十字链表存储结构中,有向图中的顶点表的结点结构如下所示:

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 二来巩固完善数据结构

数据结构——图的十字链表实现相关推荐

  1. 图的十字链表存储结构

    前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...

  2. 图的十字链表存储法详解

    前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...

  3. 数据结构——图的定义和实现

    这里写目录标题 图的定义 各种图的定义 无向边 有向边 图的顶点与边的关系 连通图生成树 图的各种实现 在引入邻接矩阵之前先介绍一下图的相关概念(概念比前树啥的面稍微复杂一点) 图的定义 之前学了线性 ...

  4. 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)

    目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...

  5. 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现

    上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...

  6. 数据结构--图(Graph)详解(二)

    数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...

  7. 数据结构--图(Graph)详解(一)

    数据结构–图(Graph)详解(一) 文章目录 数据结构--图(Graph)详解(一) 一.图的基本概念 1.图的分类 2.弧头和弧尾 3.入度和出度 4.(V1,V2) 和 < V1,V2 & ...

  8. c语言建立并存储树,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...

    #include #include #include /* 利用十字链表存储有向图,可用于同时查找某个顶点的出度与入度: */ typedef struct edge {//顶点表 int headv ...

  9. 构建复杂网络的几种方法(邻接矩阵,邻接表,十字链表,邻接多重表)

    目录 1. 数据结构 线性结构 非线性结构 2. 复杂网络的数组表示 3. 复杂网络的邻接表表示 4. 邻接矩阵与邻接表的比较 5. 复杂网络的其他表示方法 逆邻接表 十字链表 邻接多重表 前向星 链 ...

最新文章

  1. vr二维码_VR小花看看app
  2. 10·24【运维工程师也过节】【运维MySQL大礼包】
  3. Codeforces Round #619 (Div. 2) E. Nanosoft 思维 + 二维前缀和
  4. 吃透 | Elasticsearch filter和query的不同
  5. cocos2d-lua3.7组件篇(三)-http通信demo
  6. Hive静态分区表动态分区表
  7. java正则效率_善用Pattern提高你的应用处理正则表达式的效率(Java)
  8. ubuntu触电(转)
  9. BZOJ2612 : [Poi2003]Sums
  10. 用JAVA制作小游戏——飞机大战(二)
  11. c# 打开的窗口显示在最前面_了解各种切换程序窗口的方法,提高工作效率
  12. Mac动态桌面壁纸Dynamic Wallpaper惊艳你的桌面
  13. 想学一门计算机技术 Java和Python哪个前景好
  14. 百度给创新员工发2000w奖金........
  15. 最新青龙面板安装教程+依赖+拉库合集
  16. 【skLearn 回归模型】岭回归 <linear_model.Ridge>
  17. 【windows】win8.1的安装中绕过Microsoft帐户登录
  18. Oracle数据库,建库建表
  19. 年产2万吨山楂酒工厂的设计-装瓶工段及车间的设计(lunwen+任务书+开题+选题表+cad图纸)
  20. 运筹学——运输问题数学模型

热门文章

  1. jQuery attr()获取属性和设置属性的方法
  2. 第一二天作业-BGP MPLS + OSPF分流互备做法
  3. 单点登录与第三方登录 + CSRF-XSS-DNS-DDOS-SQL攻击
  4. Linux TCP之sack(一)
  5. 数据结构更新中...
  6. ORA-00054 错误原因分析
  7. 编程参考 - va_list的定义问题
  8. day03链表基础_移除链表元素_设计链表_反转链表
  9. tring转换成Integer numberformatexception 分析
  10. 文本预处理学习(2)