《啊哈!算法》邻接表,数组版,模板

代码如下: 

/*
4 5
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7
*/
#include<stdio.h>
int main()
{
    const int MAXV=10;
    int n,m,i;
    int u[6],v[6],w[6];//大于等于m+1
    int first[5],next[6];//大于等于n+1,大于等于m+1
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)
        first[i]=-1;

    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&u[i],&v[i],&w[i]);
        next[i]=first[u[i]];//先记录下来当前点存的边
        first[u[i]]=i;//更新当前点记录的边
    }
    int k;
//遍历输出
    for(i=1;i<=n;i++)
    {
        k=first[i];//k是当前的边的编号,next[k]是上一条边的编号
        while(k!=-1)
        {
            printf("%d %d %d\n",u[k],v[k],w[k]);
            k=next[k];
        }
    }
    return 0;
}


 一点讲解:

  1. 首先要明白first[]next[]的含义: first[]的下标代表next[]的下标代表边的编号
  2. u[i],v[i],w[i],代表边节点。
  3. first[]存储当前点的最新的边,next[]存储的内容是当前点的上一条边。
  4. 遍历的时候能看出来,输出的结果类似于尾插法(这种方法也是模拟的尾插法)。
  5. 输出的时候:k是当前的边的编号,next[k]是上一条边的编号。
  6. 附上一个比较好的博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值