mysql存储有向图_有向图的十字链表存储形式

十字链表是有向图的还有一种链式存储结构。能够看成是将有向图的邻接表和逆邻接表(仅仅考虑入度)结合起来得到的一种链表。在十字链表中,相应于有向图中每个顶点有一个节点,每一条弧也有一个结点。

顶点之间是数组顺序存储,而弧是链式存储。

弧结点结构:

Center

顶点结点结构:

b9ae2bd104647fe42acf68326a175b3a.png

十字链表形态:

Center

实现:

/***********************************************

有向图的存储形式——十字链表

by Rowandjj

2014/6/27

***********************************************/

#include

using namespace std;

#define MAX_VERTEX_NUM 20//顶点最大长度

#define MAX_INFO 20//弧信息的最大长度

typedef struct _ARCBOX_//弧结点

{

int tailvex,headvex;//该弧的尾和头顶点的位置

struct _ARCBOX_ *hlink,*tlink;//分别为弧头同样和弧尾同样的弧的链域

char *info;

}ArcBox;

typedef struct _VEXNODE_//顶点

{

char data;//顶点名称

ArcBox *firstin,*firstout;

}VexNode;

typedef struct _OLGRAPH_//图

{

VexNode xlist[MAX_VERTEX_NUM];//表头向量(数组)

int vexnum,arcnum;//顶点数目,弧数目

}OLGraph;

//------------------操作定义---------------------------------

int LocateVex(OLGraph G,char u);//返回顶点u在有向图G中的位置(序号),如不存在则返回-1

bool CreateDG(OLGraph* G);//採用十字链表存储表示,构造有向图G

void Display(OLGraph G);//输出有向图G

void DestroyGraph(OLGraph* G);//销毁有向图G

char GetVex(OLGraph G,int v);//返回v的值

bool PutVex(OLGraph* G,char v,char value);//对v赋新值value

int FirstAdjVex(OLGraph G,char v);//返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1

int NextAdjVex(OLGraph G,char v,char w);//返回v的(相对于w的)下一个邻接顶点的序号,若w是v的最后一个邻接顶点,则返回-1

void InsertVex(OLGraph* G,char v);//在有向图G中增添新顶点v(不增添与顶点相关的弧,留待InsertArc()去做)

bool DeleteVex(OLGraph* G,char v);//删除G中顶点v及其相关的弧

bool InsertArc(OLGraph* G,char v,char w);//在G中增添弧

bool DeleteArc(OLGraph* G,char v,char w);//在G中删除弧

void DFSTravel(OLGraph G,void (*Visit)(char));

void DFS(OLGraph G,int v);

void BFSTravel(OLGraph G,void (*Visit)(char));

void (*VisitFunc)(char); //全局函数指针

bool visited[MAX_VERTEX_NUM]; /* 訪问标志数组(全局量) */

//-----------------------------------------------------------

void Visit(char p)

{

cout<

}

//辅助队列

typedef struct _QUEUENODE_

{

int data;

struct _QUEUENODE_ *next;

}QueueNode;

typedef struct _QUEUE_

{

QueueNode *pHead;

QueueNode *pTail;

int size;

}Queue;

bool InitQueue(Queue *Q);

bool DestroyQueue(Queue *Q);

bool DeQueue(Queue *Q,int* e);

bool EnQueue(Queue *Q, int e);

bool QueueEmpty(Queue Q);

//-----------------------------------------------------------

bool InitQueue(Queue *Q)

{

Q->pHead = Q->pTail = (QueueNode*)malloc(sizeof(QueueNode));

if(!Q->pHead)

{

return false;

}

Q->pHead->next = NULL;<

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值