c++链式前向星代码分析(逐句分析)

c++链式前向星代码分析(代码逐句分析)

链式前向星是一种比较好用的存有向图的方法,相比邻接矩阵与邻接表,链式前向星有着更大的优势。但是相比于前两种存图方式,链式前向星的代码难度是比较大的,笔者在学习时也花了不少时间。而看了很多博客虽然写的很好,但如果面对真正的纯小白(比如我),还是有点难以理解的。

上代码!!!!

#include
using namespace std;

struct Edge  //每一个edge代表一条边,数组序号代表编号
{
	int next;  //上一个同起点的边的序号
	int to;  //这条边指向的点
	int w;  //这条边的长度
};

Edge edge[101];  //先定义个101条边

int head[101];  //head[i],代表以i为起点的边的最大序号是head[i],随着数组的输入而更新

int cnt = 1;   //工具变量,记录边的序号,顺便(真的是顺便,这个功能非必要)记录了有几条边,add函数用一次自加一次

void add(int u, int v, int w)  //输入从u到v的长度为w的边
{
    edge[cnt].w = w;  //第cnt条边长为w
    edge[cnt].to = v;  //第cnt条边指向点v
    edge[cnt].next = head[u];  //上一条以u为起点的最大序号的边的序号是head[u],每一条边都记录下了上一个同起点的边的序号,用next
    head[u] = cnt++;  //现在以u为起点的最大序号的边的序号是cnt了
}

int main()
{
    for (int i = 0; i < 101; i++)  //把所有head初始化为-1,代表以i为起点的序号最小的边的next值为-1
        head[i] = -1;

    int m, n;  //m个点,n条边
    cin >> m >> n;

    for (int i = 1; i <= n; i++)  //边的输入
    {
        int u, v,w;
        cin >> u >> v>>w;
        add(u, v, w);
    }

    for (int i = 1; i <= m; i++)  //输出每个以i为起点的所有线
    {
        for (int j = head[i]; j != -1; j=edge[j].next)  //从以i为起点的最大序号边开始,通过每条边的next递推从而依次按边的序号从大到小输出边,到j=-1就说明输出完了
        {
            cout <<"这一条边是  "<< i << " --->" << edge[j].to << "  长度为" << edge[j].w << endl;
        }
    }
    return 0;
}

例如,如果输入

5 7
1 5 3
2 5 4
3 5 1
3 2 4
3 6 6
4 2 1
5 4 2

程序将会输出

这一条边是  1 --->5  长度为3
这一条边是  2 --->5  长度为4
这一条边是  3 --->6  长度为6
这一条边是  3 --->2  长度为4
这一条边是  3 --->5  长度为1
这一条边是  4 --->2  长度为1
这一条边是  5 --->4  长度为2

这样链式前向星的问题就这样解决啦,是不是很简单(不是

作者:Avalon Demerzel,是个正在不断努力学习的小白,如果觉得博客不错,就来个三连吧(点个赞也行)。让我们一起进步。

你可能感兴趣的:(笔记,c++,图论,算法)