图的邻接表存储(有向图和无向图)
测试数据
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;
}