邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。
邻接表为了避免内存的浪费引入了链式存储,它的处理办法是:
1.用一个一维数组存储顶点,当然你也可以用单链表存储,
2.用单链表存储顶点的邻接点,可以将顶点改为结构体数组,结构体中存放邻接点的指针,邻接点也创建一个结构体,定义指针next存放该顶点的另一个邻接点,这样就可以把该顶点的所有邻接点串起来了。
代码展示:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXVERTEX 100 //最大顶点数
typedef struct ArcNode //边表节点
{
int adjvex; //邻接点域,存储该顶点对应的下标
int wigth; //用于存储权值
struct ArcNode *next; //链域,指向下一个邻接点
}ArcNode;
typedef struct VertexNode //顶点表节点
{
char data; //存储顶点数据的信息
ArcNode *firstarc; //边表头指针
}VertexNode, AdjList[MAXVERTEX];
typedef struct ALGraph
{
AdjList adjlist; //定义邻接表
int numvertex; //当前邻接表的顶点数
int numarc; //当前邻接表的边数
}ALGraph;
void CreateALGraph(ALGraph &G)
{
ArcNode *e;
printf("请输入顶点个数:");
scanf("%d",&G.numvertex);
getchar();
printf("请输入边的条数:");
scanf("%d",&G.numarc);
getchar();
for(int i=0; i<G.numvertex; i++)
{
printf("请输入顶点:");
scanf("%c",&G.adjlist[i].data);
getchar();
G.adjlist[i].firstarc = NULL;
}
for(int i=0; i<G.numarc; i++)
{
int m,n, w;
printf("请输入两边的顶点和边上的权重:");
scanf("%d %d %d",&m,&n,&w);
getchar();
e = new ArcNode;
e->adjvex = m;
e->wigth = w;
e->next = G.adjlist[n].firstarc;
G.adjlist[n].firstarc = e;
e = new ArcNode;
e->adjvex = n;
e->wigth = w;
e->next = G.adjlist[m].firstarc;
G.adjlist[m].firstarc = e;
}
}
void PrintALGraph(ALGraph G)
{
for(int i=0; i<G.numvertex; i++)
{
ArcNode *p = G.adjlist[i].firstarc;
printf("%c",G.adjlist[i].data);
while(p!=NULL)
{
printf("--权值为%d-->%c\t",p->wigth,G.adjlist[p->adjvex].data);
p = p->next;
}
printf("\n");
}
}
int main() {
ALGraph G;
CreateALGraph(G);
PrintALGraph(G);
return 0;
}