看数据结构写代码(37) 图的十字链表的表示与实现

图的邻接表在 查找 有向图的 出度 很 方便,但是 在 查找 入度 时,需要遍历整个图。如果想要 方便的 查找 入度,需要 建立 逆邻接表。十字链表 正好 就是 邻接表 和 逆邻接表的结合。具体结构图如下:


感觉 十字链表 在 查找 入度时 方便 一些,其他 跟 邻接表没什么区别。

源代码 网盘地址:点击打开链接

代码如下:

// CrossLinkGraph.cpp : 定义控制台应用程序的入口点。
//有向图的十字链表表示法

#include "stdafx.h"
#include <cstdlib>

#define MAX_VEX_NUM 20
enum E_State
{
	E_State_Error = 0,
	E_State_Ok = 1,
};

struct ArcNode//弧节点
{
	int tailIndex;//弧尾位置
	int headIndex;//弧头位置
	ArcNode * tailNext;//下一个弧尾相同的弧
	ArcNode * headNext;//下一个弧头相同的弧
};

typedef struct VNode
{
	char vexName;//顶点名称
	ArcNode * firstIn;
	ArcNode * firstOut;
}GraphList[MAX_VEX_NUM];//

struct Graph
{
	GraphList list;//顶点数组.
	int vexNum,arcNum;
};
//获取弧 的 头节点
ArcNode * getHeadNode(){
	ArcNode * pNode = (ArcNode *)malloc(sizeof(ArcNode));
	if (pNode){
		pNode->headIndex = pNode->tailIndex = -1;
		pNode->headNext = pNode->tailNext = NULL;
	}
	return pNode;
}

ArcNode * getArcNode(int tailIndex,int headIndex){
	ArcNode * pNode = getHeadNode();
	if (pNode){
		pNode->headIndex = headIndex;
		pNode->tailIndex = tailIndex;
	}
	return pNode;
}

int vexLocation(Graph g,char vex){
	for (int i = 0; i < g.vexNum; i++){
		if (g.list[i].vexName == vex){
			return i;
		}
	}
	return -1;
}

void createGrahp(Graph * g){
	printf("输入图的顶点数 和 边(弧)数\n");
	scanf("%d%d%*c",&g->vexNum,&g->arcNum);  
    //构造顶点集  
    printf("请输入顶点集\n");  
    for (int i &
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值