邻接表存图

来源:互联网 发布:单片机c语言讲解 编辑:程序博客网 时间:2024/06/04 00:54
// 在(e<<1/2n(n-1))或者边信息较多的情况下,邻接表储存方式具有优越性// 邻接表建立有向图#include<stdio.h>#define maxn 20int Gra[maxn][maxn];struct arcnode{    int adjvex;    // 可以开一个指针域,储存边信息    int info;    arcnode* next_arc;};struct vnode{    int data;    arcnode* firstarc;};int main(){    int vnum;    int w; // 边的权值    scanf("%d",&vnum);    for(int i=0;i<vnum;i++)    {         for(int j=0;j<vnum;j++)         {            scanf("%d",&Gra[i][j]);         }    }    vnode* vset = new vnode[vnum];    for(int i=0;i<vnum;i++){ (vset+i)->data = i ; (vset+i)->firstarc =NULL;}// 初始化顶点    for(int i=0;i<vnum;i++)    {         for(int j=0;j<vnum;j++)         {             if(Gra[i][j]!=-1&&Gra[i][j])             {                 arcnode* p = new arcnode;                 p->adjvex = j;                 p->info = Gra[i][j];                 p->next_arc = NULL;                // printf(" !!! \n");                 arcnode* q = (vset+i)->firstarc;                 if(q == NULL)// 将第一条边加进去;                 {                     (vset+i)->firstarc = p; // 将新开辟的边结点赋值给顶点的第一条边                 }else{                     while(q->next_arc){ q = q->next_arc;} // 找到最后一个加入的边                     q->next_arc = p;                 }             }         }    }    for(int i=0;i<vnum;i++)    {        printf("%d\n",(vset+i)->data);        arcnode* p = (vset+i)->firstarc;        while(p)        {            printf("%d   %d\n",p->adjvex,p->info);            p = p->next_arc;        }        printf("\n");    }    return 0;}

原创粉丝点击