数据结构——图的邻接表建立

#include<stdio.h> 
#include<stdlib.h>
#define MaxVertexNum 100
typedef struct ArcNode//边表结点 
{
	int adjvex;//该弧指向的顶点的位置 
	struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode//顶点结点 
{
	int data;
	ArcNode *firstarc;
}VNode,AdjList[MaxVertexNum];
typedef struct
{
	AdjList vertices;//邻接表 
	int vexnum,arcnum;
	int kind;//图的类型(有向图,无向图) 
}ALGraph;
int LocateVex(ALGraph G,int u)//返回顶点在图中的位置 
{
	int i;
	for(i = 0; i < G.vexnum; ++i)
	{
		if(u==G.vertices[i].data)
			return i;
		return -1;
	}
}
int CreateGraph(ALGraph *G)
{
	ArcNode *p; 
	int i,j,k;
	int va,vb;//弧尾和弧头 
	printf("请输入图的类型:(有向图:0   无向图:2)\n");
	scanf("%d",&(*G).kind);
	printf("请输入图的顶点数和边数,中间以空格间隔:\n");
	scanf("%d%d",&(*G).vexnum,&(*G).arcnum);
	printf("请连续输入%d个顶点的值: ",(*G).vexnum);
	for(i=0;i<(*G).vexnum;++i)//建立顶点节点单链表 
	{
		scanf("%d",&(*G).vertices[i].data);
		(*G).vertices[i].firstarc=NULL;
	 }
	printf("请顺序输入每条边的弧尾和弧头,以空格作为间隔:\n");//建立边结点链表 
	 for(k=0;k<(*G).arcnum;++k)
	 { 
	 scanf("%d%d",&va,&vb);
//	 i=LocateVex(*G,va);//弧尾 
//	 j=LocateVex(*G,vb);//弧头 
	i=va-1;
	j=vb-1;
	 p=(ArcNode*)malloc(sizeof(ArcNode));
	 p->adjvex=j;
	 p->nextarc=(*G).vertices[i].firstarc;
	 (*G).vertices[i].firstarc=p;
	 if((*G).kind>=2)//如果是无向图 
	 {
	 	p=(ArcNode*)malloc(sizeof(ArcNode));
	 	p->adjvex=i;
	 	p->nextarc=(*G).vertices[j].firstarc;
	 	(*G).vertices[j].firstarc=p;
	 }
}
	 return 1;
}
void Display(ALGraph G)
{
	int i;
	ArcNode *p;
	switch(G.kind)
	{
		case 0:
			printf("这是一个有向图!\n");
			break;
		case 2:
			printf("这是一个无向图!\n");
			break;	
	}
	printf(" %d 个顶点分别为:\n",G.vexnum);
	for(i = 0; i < G.vexnum; ++i)
	{
		printf("%d\t",G.vertices[i].data);
	}
	printf("\n");
	printf(" %d 条边:\n",G.arcnum);
	if(G.kind==0)//当是有向图时 
	{ 
	for(i = 0; i < G.vexnum; ++i)
	{
		p=G.vertices[i].firstarc;
		while(p)
		{
			if(i<p->adjvex)
			{ 
			printf("%d-->%d\t",G.vertices[i].data,G.vertices[p->adjvex].data);
		}
					p=p->nextarc;
		}
		printf("\n"); 
	}
}
else if(G.kind==2)//是无向图时 
{
	for(i = 0; i < G.vexnum; ++i)
	{
		p=G.vertices[i].firstarc;
		while(p)
		{
			if(i<p->adjvex)
			{ 
			printf("%d-->%d\t",G.vertices[i].data,G.vertices[p->adjvex].data);
			printf("%d-->%d\t",G.vertices[p->adjvex].data,G.vertices[i].data);
		}
					p=p->nextarc;
		}
		printf("\n"); 
	}
}
}
void FindIndegree(ALGraph G,int indegree[])//计算顶点的入度 
{
	
}
int main()
{
	ALGraph G;
	CreateGraph(&G);
	Display(G);
 } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值