图——十字链表存储结构

#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
/*边表的数据结构*/ 
typedef struct ArcBox{
	int tailvex,headvex;//该弧的尾和顶点的位置
	struct ArcBox *hlink,*tlink;//分别为弧头和弧尾相同的弧的链域 
}ArcBox;
/*顶点结点的数据结构*/
typedef struct VexNode{
	char data;
	ArcBox *firstin,*firstout;//分别指向该顶点第一条入弧和出弧 
}VexNode;
/*十字链表的数据结构*/
typedef struct{
	VexNode xlist[MAX_VERTEX_NUM];//表头向量
	int vexnum,arcnum;//有向图的当前结点数和边数 
}OLGraph;
/*查找顶点所在的位置*/
int locateVex(OLGraph G,char v)
{
	int i=0;
	for(i=0;i<G.vexnum;i++)
	{
		if(G.xlist[i].data==v)
			return i;
	}
	return -1;
} 
/*创建十字链表*/
void CreateOLG(OLGraph &G)
{
	printf("请输入当前图的顶点总个数和总边数:\n");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	setbuf(stdin,NULL);
	int i=0;
	printf("请输入顶点的数据:\n");
	for(i=0;i<G.vexnum;i++)
	{
		scanf("%c",&G.xlist[i].data);
		getchar();
		G.xlist[i].firstin=NULL;
		G.xlist[i].firstout=NULL;//初始化顶点 
	} 
	setbuf(stdin,NULL);
	printf("请输顶点之间边的关系:\n");
	int k=0;
	int j=0;
	char v1;
	char v2;
	for(k=0;k<G.arcnum;k++){
		scanf("%c,%c",&v1,&v2);
		setbuf(stdin,NULL); 
		i=locateVex(G,v1);
		j=locateVex(G,v2);
		ArcBox *p1=(ArcBox *)malloc(sizeof(ArcBox)); //针对输出的firstout域 
		p1->headvex=j;
		p1->tailvex=i;
		p1->hlink=NULL;
		p1->tlink=NULL;//将边关系存储在*p1指针里面 
		p1->tlink=G.xlist[i].firstout;
		G.xlist[i].firstout=p1;
		p1->hlink=G.xlist[j].firstin;//针对输入的firstin域 
		G.xlist[j].firstin=p1;	
	} 	
} 
int main()
{
	OLGraph G;
	CreateOLG(G);
	printf("邻接表打印:\n");
	int i=0;
	ArcBox *p=(ArcBox *)malloc(sizeof(ArcBox));
	for(i=0;i<G.vexnum;i++){
		printf("%c",G.xlist[i].data);
		p->tlink=G.xlist[i].firstout;
		while(p->tlink!=NULL){
			printf("->%c",G.xlist[p->tlink->headvex].data);
			p->tlink=p->tlink->tlink;
		}
		printf("\n");
	}	
	printf("打印逆邻接表:\n");
	for(i=0;i<G.vexnum;i++){
		printf("%c",G.xlist[i].data);
		p->hlink=G.xlist[i].firstin;
		while(p->hlink!=NULL){
			printf("->%c",G.xlist[p->hlink->tailvex].data);
			p->hlink=p->hlink->hlink;
		}
		printf("\n");
	} 
	return 0;
}

测试数据:

 

有错的话,欢迎留言。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值