图的十字链表

//图的十字链表 表示法 (有向图)
#include<stdio.h>
#include<stdlib.h>

#define MAX_SIZE 10
#define ERROR 0
#define OK 0

typedef int Status;//有向图 
typedef struct ArcBox{
	int tailvex,headvex; //弧尾 弧头 (起点 终点) 
	struct ArcBox *hlink,*tlink; //各种入度  各种出度 	
	int weight; //两个点(起点 终点)之间 的权重 
}ArcBox;

typedef struct VexNode{
	ArcBox *fristin,*fristout; //第一个入度 第一个出度  (头结点)  为一个点服务 
	int data;  //点的值 
}VexNode;

typedef struct Graph{ //网 
	VexNode list[MAX_SIZE];   //图上的点
	int nodenum,arc; //结点的个数(要小于MAX_SIZE哦)  要不要统计弧 
}Graph,*PGraph;

Status CreateGraph(PGraph *PG)
{
	int i,j,weight,k;
	ArcBox *PA;
	
	if(!((*PG)=(PGraph)malloc(sizeof(Graph)))) return ERROR;

	(*PG)->arc=0;
	scanf("%d",&((*PG)->nodenum));
	printf("输入各点数据: ");
	for(k=0;k<(*PG)->nodenum;k++)//初始化 
	{
		(*PG)->list[k].fristin=NULL;
		(*PG)->list[k].fristout=NULL;
		scanf("%d",&((*PG)->list[k].data));
	}
	
	while(scanf("%d%d%d",&i,&j,&weight))//描绘图的点 i,j从零开始 起点 和 到达点 
	{
		if(i>=(*PG)->nodenum || j>=(*PG)->nodenum) return OK;
		
		PA=(ArcBox *)malloc(sizeof(ArcBox));
		
		PA->tailvex=i; PA->headvex=j;
		PA->hlink=(*PG)->list[j].fristin;
		PA->tlink=(*PG)->list[i].fristout;
		PA->weight=weight;
		//(*PA)={i,j,((*PG)->list[j].fristin),((*PG)->list[i].fristout)}; //入  出 错 
		(*PG)->list[i].fristout=(*PG)->list[j].fristin=PA; /*头 */ 
		(*PG)->arc++;
	}
	
}

Status PrintEveryInOut(const PGraph G)
{
	int k;
	ArcBox *Pnode;

	printf("出点\n");
	for(k=0;k<(G)->nodenum;k++)
	{
		printf(" k:%d data:%d \n",k,G->list[k].data);
		for(Pnode=(G)->list[k].fristout;Pnode;Pnode=Pnode->tlink)
		{printf(" k:%d tail:%d head:%d weight:%d \n",k,Pnode->tailvex,Pnode->headvex,Pnode->weight);}
		printf("\n");
	}
	printf("\n入点\n");
	for(k=0;k<(G)->nodenum;k++) 
	{
		printf(" k:%d data:%d \n",k,G->list[k].data);
		for(Pnode=(G)->list[k].fristin;Pnode;Pnode=Pnode->hlink)
		{printf(" k:%d tail:%d head:%d weight:%d \n",k,Pnode->tailvex,Pnode->headvex,Pnode->weight);}
		printf("\n");
	}	
	
	return OK;
}

Status DestoryGraph(PGraph PG)
{
	int k;
	ArcBox *Pnode,*Ptemp;	
	
	for(k=0;k<(PG)->nodenum;k++)
	{
		Pnode=(PG)->list[k].fristout;
		while(Pnode)
		{
			Ptemp=Pnode;
			Pnode=Pnode->tlink;
			free(Ptemp);
		}
		free((PG)->list[k].fristout);
	}
}

int main()
{
	PGraph G;
	CreateGraph(&G);
	PrintEveryInOut(G);
	DestoryGraph(G);
	PrintEveryInOut(G);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值