邻接表的创建与输出(C语言)

    xiaoxiao2021-03-25  137

    邻接表是图的常用储存结构之一,它很好的解决了邻接矩阵占用空间较大的问题。

    邻接表用到了两个结构体,一个是顶点表,包括点的序号和连接此起点的第一条边。一个是边表,包括连接此边的终点和对应之前起点的下一条边。

    初始化邻接表时,先将定点表赋值,并把指针指向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; }输入每条边两个端点的序号,输出每个点所连接的点。下图为运行结果。

    转载请注明原文地址: https://ju.6miu.com/read-13045.html

    最新回复(0)