鄰接表存圖(出邊表+入邊表)

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"

#define MAX 100

struct ArcNode
{
	int adjvex;//臨接的邊序號.
	ArcNode *next;//下一個節點
};

struct Vnode
{
	int data;//頂點信息
	ArcNode *InputLine;//出邊表
	ArcNode *OutputLine;//入邊表
};

struct Graph
{
	Vnode vertexs[MAX];//頂點數組
	int vexnum;//頂點數
	int arcnum;//邊數
};

Graph G;

void CreatGraph()
{
	int i;
	ArcNode *pi;
	int v1,v2;
	G.vexnum=0;
	G.arcnum=0;
	printf("please input Graph's vexnum or arcnum.\n");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	for(i=0;i<G.vexnum;i++)
	{
		G.vertexs[i].InputLine=G.vertexs[i].OutputLine=NULL;
	}
	printf("please input partner number like X X by point to point.\n");
	for(i=0;i<G.arcnum;i++)
	{
		scanf("%d %d",&v1,&v2);
		v1--,v2--;
		//input line
		pi=(ArcNode*)malloc(sizeof(struct ArcNode));
		pi->adjvex=v2;
		pi->next=G.vertexs[v1].InputLine;
		G.vertexs[v1].InputLine=pi;
		//output line

		pi=(ArcNode*)malloc(sizeof(struct ArcNode));
		pi->adjvex=v1;
		pi->next=G.vertexs[v2].OutputLine;
		G.vertexs[v2].OutputLine=pi;
	}
}

void DeleteGraph()
{
	int i;
	ArcNode *pi;
	for(i=0;i<G.vexnum;i++)
	{
		//free input line
		pi=G.vertexs[i].InputLine;
		while(pi!=NULL)
		{
			G.vertexs[i].InputLine=pi->next;
			free(pi);
			pi=G.vertexs[i].InputLine;
		}
		
		//free output line
		pi=G.vertexs[i].OutputLine;
		while(pi!=NULL)
		{
			G.vertexs[i].OutputLine=pi->next;
			free(pi);
			pi=G.vertexs[i].OutputLine;
		}
	}
}

int main()
{
	CreatGraph();
	int i;
	int sum;
	ArcNode *pi;
	for(i=0;i<G.vexnum;i++)
	{
		sum=0;
		pi=G.vertexs[i].InputLine;
		while(pi!=NULL)
		{
			sum++;
			pi=pi->next;
		}
		printf("%d points Inputline is:%d\n",i+1,sum);
		
		pi=G.vertexs[i].OutputLine;
		sum=0;
		while(pi!=NULL)
		{
			sum++;
			pi=pi->next;
		}
		printf("%d points OutputLine is %d\n",i+1,sum);
	}
	DeleteGraph();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章