C中用于无向(未加权)图的邻接表

时间:2020-10-09 17:41:51

标签: c linked-list graph-algorithm undirected-graph

这是我的代码:

#define V 5

typedef struct edge* link;

//structure for reprenting edges
typedef struct edge{
    int dst;        //number of destination node
    //int weight;   //for weigthed graphs
    link next;      //link to next edge
} edge_t;

link new_edge(int dst, link next) {
    link edge = (link) malloc(sizeof(edge_t));

    edge->dst = dst;
    edge->next = next;
    return edge;
}

int main() {

    link edge;
    link adj[V];
    //the array contains V pointers to lists of edges
    //each list for each node of my graph

    int i;
    int j;

    //all lists are empty at beginning
    for (i = 0; i < V; i ++) {
        adj[i] = NULL;
    }

    printf("input the edges:\n");
    
    while (scanf("%d %d", &i, &j) == 2) {
        adj[i] = new_edge(j, adj[i]);
        //in the list for node i
        //put the edge to node j
        adj[j] = new_edge(i, adj[j]); //if it is undirect
        //in the list for node j
        //put the edge to node i
    }
    
    printf("adjacency list is: \n");
    //cycle over the nodes
    for (i=0; i<V; i++) {
        if (adj[i] == NULL) {
            printf("%d is null list\n", i);
        }
        //print all the edges for that node
        for (edge = adj[i]; edge != NULL; edge = edge -> next) {
            printf("edge %d -> %d\n", i, edge->dst);
        }
    }
}

输入:
0 1
0 2
1 3
停止
输出:
邻接表是:
边缘0-> 2
边缘0-> 1
边缘1-> 3
边缘1-> 0
边缘2-> 0
边缘3-> 1
4为空列表

此图显示了我的 new_edge 函数的工作方式,蓝色区域(在图片中)正在更改,因此我可以遍历列表,所以我的问题是为什么蓝色区域等于NULL ?,导致它指向列表中的最后一项,我认为它不会为NULL(PS我遍历该列表以打印出来时确认为null)。

enter image description here

1 个答案:

答案 0 :(得分:2)

adj的元素是指向节点而不是节点的指针。 另一方面,节点中的next指向的是节点,而不是指向节点的指针。 因此,next不会指向adj的元素。

这是代码的实际工作方式:

how your code actually work

如您所见,指针不会循环返回,并且您的蓝色区域(添加了节点的adj元素)不等于NULL

相关问题