邻接表存图

// 在(e<<1/2n(n-1))或者边信息较多的情况下,邻接表储存方式具有优越性
// 邻接表建立有向图
#include<stdio.h>
#define maxn 20
int 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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值