邻接表是图的常用储存结构之一,它很好的解决了邻接矩阵占用空间较大的问题。
邻接表用到了两个结构体,一个是顶点表,包括点的序号和连接此起点的第一条边。一个是边表,包括连接此边的终点和对应之前起点的下一条边。
初始化邻接表时,先将定点表赋值,并把指针指向NULL。再将输入的数据插入,插入到起点所对应的边表的最后一个。最后是每个点对应一个链表,头结点为起点,之后的结点为这个起点所连接的边。
通俗点说就是把每个点所连接的点组合。
#include<stdio.h>
#include<malloc.h>
#define max 10000
int edge[1000000][2]={0};
typedef struct _enode //边表
{
//int dis;
int vex;
struct _enode* nextedge;
}enode;
typedef struct _vnode //点表
{
int vex;
enode* firstedge;
}vnode;
typedef struct _pic
{
int vex_num;
int edge_num;
vnode node[max];
}pic;
void find_insert(enode* edge,enode* temp) //插入边
{
enode* p;
p=edge;
while(p->nextedge!=NULL)
p=p->nextedge;
p->nextedge=temp;
}
pic* create_pic() //创建表
{
int i=0,c1,c2;
enode* node_temp;
pic* picture;
picture=(pic*)malloc(sizeof(pic));
picture->edge_num=5;
picture->vex_num=3; //5条边,3个点
for(i=1;i<=picture->vex_num;i++)
{
picture->node[i].vex=i;
picture->node[i].firstedge=NULL;
}
for(i=1;i<=picture->edge_num;i++)
{
c1=edge[i][0];
c2=edge[i][1];
node_temp=(enode*)malloc(sizeof(struct _enode));
node_temp->vex=c2;
node_temp->nextedge=NULL; //开辟空间之后一定要给每一个元素赋值,NULL也要赋值
if(picture->node[c1].firstedge==NULL)
{
picture->node[c1].firstedge=node_temp;
}
else
{
find_insert(picture->node[c1].firstedge,node_temp);
}
}
return picture;
}
int main(void)
{
int i=0;
pic* picture;
for(i=1;i<=5;i++) //输入五条边
{
scanf("%d",&edge[i][0]);
scanf("%d",&edge[i][1]);
}
picture=create_pic();
for(i=1;i<=picture->vex_num;i++) //输出
{
enode* p;
p=(enode*)malloc(sizeof(enode));
if(picture->node[i].firstedge==NULL)
printf("error");
else
{
p=picture->node[i].firstedge;
printf("%d ",picture->node[i].vex);
while(p!=NULL)
{
printf("%d ",p->vex);
p=p->nextedge;
}
}
printf("\n");
}
return 0;
}
输入每条边两个端点的序号,输出每个点所连接的点。下图为运行结果。