图的邻接表存储(有向图和无向图)

图的邻接表存储(有向图和无向图)

测试数据

4 10
A B C D
0 B
0 C
0 D
1 A
1 C
1 D
2 A
2 B
3 A
3 B

代码
#include<iostream>
#include<malloc.h>
using namespace std;
#define MaxVertexNum 100

typedef int InfoType;
typedef char VertexType; 
typedef struct node{
	char adjvertex; //临界点域,一般存放顶点对应的序号或在表头向量中的坐标
	InfoType info;//网的边权值
	struct node *next; //指向下一个邻接点 
}EdgeNode;//表结点 

typedef struct VNode{
	VertexType vertex;//顶点域
	EdgeNode *firstedge;//边表头指针 
}VertexNode;//顶点结点 

typedef struct{
	VertexNode adjlist[MaxVertexNum]; //邻接表
	int vertexNum,edgeNum;//顶点数和边数 
}ALGragh; 

//邻接表法创建一个图 
void CreateGragh(ALGragh *G)
{
	int i,j,k;
	EdgeNode *p;
	printf("请输入图的顶点数和边数:");	
	cin>>G->vertexNum>>G->edgeNum;
	printf("请输入图的各个顶点的信息(A,B…):");
	for(i<0;i<G->vertexNum;i++)//建立顶点表 
	{
		cin>>G->adjlist[i].vertex;
		G->adjlist[i].firstedge=NULL;	
	} 
	printf("请输入各条边的信息(例:1 2表示在A顶点和B顶点之间有一条边):\n");
	for(k=0;k<G->edgeNum;k++)//头插法建立边表 
	{
		char headIndex;
		int tailIndex; 
		cin>>tailIndex>>headIndex;
		p=(EdgeNode*)malloc(sizeof(EdgeNode));
		p->adjvertex=headIndex;	
		p->next=G->adjlist[tailIndex].firstedge;
		G->adjlist[tailIndex].firstedge=p; 
	} 
} 

//打印邻接表法创建的表 
void DisplayALGragh(ALGragh G)
{
	int i;
	printf("图的邻接矩阵如下:\n"); 
	for(i=0;i<G.vertexNum;i++)
	{
		printf("%c  ",G.adjlist[i].vertex);
		EdgeNode *p=G.adjlist[i].firstedge; 
		while(p!=NULL)
		{
			printf("->%c ",p->adjvertex);
			p=p->next; 
		}
		printf("\n");
	}
} 
//顶点x的第一个邻接点 
char FirstNeighbor(ALGragh G,char x)
{
	int i,j;
	EdgeNode *p;
	for(i=0;i<G.vertexNum;i++)
		if(x==G.adjlist[i].vertex)
			break;
	if(G.adjlist[i].firstedge)
		return G.adjlist[i].firstedge->adjvertex;
	else
		return -1;
}
//顶点x的第一个邻接点  
int main()
{
	ALGragh G;
	CreateGragh(&G);
	DisplayALGragh(G);
	if(FirstNeighbor(G,'A'))
		printf("顶点A的第一个邻接点为%c\n",FirstNeighbor(G,'A')); 
	else
		printf("顶点A没有邻接点!\n");
	return 0;
}
运行截图在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

commonbelive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值