数据结构:有向图的十字链表存储表示(c实现)

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

程序:有向图的十字链表存储表示
完成时间:2013年6月10日
完成者:小单

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


//-------------有向图的十字链表存储表示----------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_VERTEX_NUM 20
#define OVERFLOW -2
#define OK 1
typedef int Status;
typedef char VertexType[MAX_VERTEX_NUM];
typedef char InfoType;
typedef struct ArcBox
{
	int tailvex,headvex;  //该弧的尾和头顶点的位置
	struct ArcBox *hlink, *tlink;  //分别为弧头相同和弧尾相同的弧的链域
	InfoType *info;  //该弧的相关信息的指针

}ArcBox;//弧结点

typedef struct VexNode
{
	VertexType data;
	ArcBox *firstin, *firstout;  //分别指向该顶点的第一条入弧和出弧
}VexNode;  //顶点结点

typedef struct  
{
	VexNode xlist[MAX_VERTEX_NUM];  //表头向量
	int vexnum, arcnum;  //有向图的当前顶点数和弧数
}OLGraph;

int LocateVex(OLGraph &G, VertexType u)
{
	for(int i = 0; i < G.vexnum; ++i)
		if(strcmp(G.xlist[i].data, u) == 0)
			return i;
	return -1;
}

Status CreateDG(OLGraph &G)
{
	//采用十字链表存储表示,构造有向图G;
	int i,j,k;
	printf("请输入图的顶点数以及弧数:");
	scanf("%d%d",&G.vexnum, &G.arcnum);
	
	printf("请输入%d个顶点的值,之间有空格隔开:\n",G.vexnum);
	for(i=0; i<G.vexnum; ++i) //构造表头向量
	{
		getchar();
		scanf("%s",G.xlist[i].data);  //输入顶点值
		G.xlist[i].firstin = NULL;
		G.xlist[i].firstout = NULL;
	}
	
	VertexType v1,v2;
	ArcBox *p;
	printf("请依次输入%d条弧各自依附的两个顶点(输入格式:v1 v2<Enter>)\n",G.arcnum);
	for(k=0; k < G.arcnum; ++k)  //输入各弧并构造十字链表
	{
		getchar();
		scanf("%s%s",v1,v2);
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		p = (ArcBox *)malloc(sizeof(ArcBox));
		if(!p)
			exit(OVERFLOW);
		p->tailvex = i;
		p->headvex = j;
		p->hlink = G.xlist[j].firstin;
		p->tlink = G.xlist[i].firstout;
		p->info = NULL;
		G.xlist[j].firstin = G.xlist[i].firstout = p;  //完成在入弧和出弧链头的插入
	}
	getchar();
	return OK;
}

void DisplayArc(OLGraph &G)
{
	ArcBox *p;
	for(int i=0; i < G.vexnum; ++i)
	{
		p=G.xlist[i].firstout;
		while(p)
		{
			printf("<%s,%s> ",G.xlist[p->tailvex].data, G.xlist[p->headvex].data);
			p = p->tlink;
		}
	}
	printf("\n");
}

int VexDegree(OLGraph &G, VertexType v)
{
	//求指点v的度:入度+出度
	int k = LocateVex(G,v);
	if(k<0)
		exit(OVERFLOW);
	int id=0,od=0;  //入度,出度

	ArcBox *pin = G.xlist[k].firstin;
	ArcBox *pout = G.xlist[k].firstout;
	while(pin)  //求入度
	{
		++id;
		pin = pin->hlink;
	}

	while(pout)  //求出度
	{
		++od;
		pout = pout->tlink;
	}

	return id+od; //顶点的度
}

int main()
{
	OLGraph G;
	CreateDG(G);

	printf("输入该有向图的所有弧:\n");
	DisplayArc(G);
	VertexType v;
	while(1)
	{
		printf("请输入你要求度的顶点:");
		scanf("%s",v);
		getchar();
		printf("顶点%s的度为:%d\n",v,VexDegree(G,v));
		system("pause");
	}
	
	return 0;
}


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值