图表代码有什么问题?

时间:2014-04-24 13:48:49

标签: c graph

#include<stdio.h>

struct llist {
int data;
struct llist *next;
};

typedef struct llist list;

struct graph {
    int V;
    list **adj;
};

typedef struct graph graph;

graph* create_graph(int V) {
    list **adj = (list**)malloc(sizeof(list*)*V);
    graph *a = (graph*)malloc(sizeof(graph));
    a->V = V;
    a->adj = adj;
    return a;
}

void insert_list(list **head, int v) {
    list *new_node, *temp_node, *last_node;
    new_node = (list*)malloc(sizeof(list));
    new_node->data = v;
    new_node->next = NULL;
    printf("\n hi %d", head);
    /*
     * head is empty, point the head to temp and return.
     */

    if (*head == NULL) {
        *head = new_node;
        return;
    }

    temp_node = *head;

    do{
        last_node = temp_node;
        temp_node = temp_node->next;
    }while(temp_node);
    last_node->next = new_node;
}

void addedge(graph *g, int u, int v) {

    insert_list(&(g->adj[u]), v);

}


int
main() {
    int V = 10;
    graph *a = create_graph(V);
    printf("\n graph created");
    addedge(a, 1,2);
    addedge(a,1,5);
    addedge(a,2,1);
    addedge(a,2,5);
    addedge(a,2,3);
    addedge(a,2,4);
    addedge(a,3,2);
    addedge(a,3,4);
    addedge(a,4,2);
    addedge(a,4,5);
    addedge(a,4,3);
    addedge(a,5,4);
    addedge(a,5,1);
    addedge(a,5,2);
    return 0;
}

在这段代码中,通过打印消息,我发现create_graph函数正确执行并返回图形。然后调用addge,在其中,if(* head == NULL)part总是返回false(不知道为什么,第一次它应该返回true)。然后它继续执行while while循环并继续执行直到无穷大并且代码终止。

我想要做的是我有一个名为graph的结构,带有整数变量V和链表变量adj的数组(表示邻接列表)。然后创建图形将初始化图形变量并返回它。

Addedge(V,u,v)将边v添加到u(意味着v与u相邻)。所以adj [0 .... V-1]是一个链表数组。因此,如果边1与2和3相邻,那么列表将看起来像1-> 2-> 3。

评论如果需要更多信息。我不知道为什么* head第一次不为null以及为什么while循环永远不会终止。

提前多多感谢。

1 个答案:

答案 0 :(得分:0)

通过追踪和错误,我发现了错误。

在函数创建图中,在初始化列表后,每个列表也必须初始化为NUll,否则它将有垃圾。

下面是正确的代码:

graph* create_graph(int V) {
    list **adj = (list**)malloc(sizeof(list*)*V);
    int i;
    for (i = 0; i < V; ++i) {
        adj[i] = NULL;
    }
    graph *a = (graph*)malloc(sizeof(graph));
    a->V = V;
    a->adj = adj;
    return a;
}