图(邻接表写法)

#include<stdio.h>
#include<stdlib.h>
#define max 20
typedef struct ArcNode                  /*ArcNode存放邻接表中的信息,包括顶点的位置和权值,和连接下一个顶点的指针*/ 
{
	int adjvex;
	struct ArcNode *nextarc;
	int info;
 } ArcNode;                      
typedef struct VertexNode          /*VertexNode存放顶点的信息和指向第一个邻接顶点的指针*/ 
{
	char data;
	ArcNode *firstarc;
}VertexNode;
typedef struct{                          /*AdjList存放图的顶点个数,边的个数以及顶点构成的数组*/ 
	VertexNode vertex[max];
	int vexnum,arcnum;
}AdjList;
AdjList *G=(AdjList *)malloc(sizeof(AdjList));;        /*建立图G*/ 
int locatevertex(AdjList *G,char x)                    /*定位顶点在邻接表中的位置*/            
{
	for(int i=0;i<G->vexnum;i++)
	{
		if(G->vertex[i].data==x)                   
		return i;
	} 
	return -1;
}
int creategraph(AdjList *G)
{
	int i,j,k,power;
	char v1,v2;
	printf("请输入顶点数和边数:\n");
	scanf("%d%d",&G->vexnum,&G->arcnum);
	fflush(stdin);
	printf("请输入顶点:\n");
	for(i=0;i<G->vexnum;i++)
	{
		fflush(stdin);
		scanf("%c",&G->vertex[i].data);                 /*将顶点存在数组中*/ 
		G->vertex[i].firstarc=NULL;
	 } 
	 printf("请输入边和权值:\n");
	 for(i=0;i<G->arcnum;i++)
	 {
	 	fflush(stdin);
	 	scanf("%c %c%d",&v1,&v2,&power);
	 	j=locatevertex(G,v1);                           /*找到v1,v2的位置*/
	 	k=locatevertex(G,v2);
	 	ArcNode *arc=(ArcNode *)malloc(sizeof(ArcNode));     /*建立新结点将v2接在v1的链表后面*/    
	 	arc->adjvex=k;
	 	arc->info=power;
	 	arc->nextarc=G->vertex[j].firstarc;
	 	G->vertex[j].firstarc=arc;
	 	
	 	arc=(ArcNode *)malloc(sizeof(ArcNode));           /*建立新结点将v1接在v2的链表后面*/    
	 	arc->adjvex=j;
	 	arc->info=power;
	 	arc->nextarc=G->vertex[k].firstarc;
	 	G->vertex[k].firstarc=arc;
	 	
	}	
}
void print(AdjList *G)                      /*打印邻接表*/ 
{
	ArcNode *p;
	p=(ArcNode *)malloc(sizeof(ArcNode));
	for(int i=0;i<G->vexnum;i++)
	{
		printf("%c",G->vertex[i].data);
		p=G->vertex[i].firstarc;
		while(p)
		{
			printf("->%c(%d)",G->vertex[p->adjvex].data,p->info);
			p=p->nextarc;
		}
		printf("\n");
	}
}
int main()
{
	creategraph(G); 
	printf("图的邻接表为:\n"); 
	print(G);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值