这个图形代码有什么错误? #包括 结构主义者{ int数据; struct-llist*next; }; 类型定义结构列表; 结构图{ INTV; 列表**调整; }; 类型定义结构图; 图*创建图(int V){ 列表**调整=(列表**)malloc(sizeof(列表*)*V); 图*a=(图*)malloc(sizeof(图)); a->V=V; a->adj=adj; 返回a; } 无效插入列表(列表**标题,内部v){ 列出*新节点、*临时节点、*最后节点; 新节点=(列表*)malloc(sizeof(列表)); 新建_节点->数据=v; 新建节点->下一步=空; printf(“\n高%d”,头部); /* *头部为空,将头部指向temp并返回。 */ 如果(*head==NULL){ *head=新的_节点; 返回; } 温度节点=*头部; 做{ 最后一个节点=临时节点; 临时节点=临时节点->下一步; }while(临时节点); 最后一个\u节点->下一个=新的\u节点; } 无效加差(图*g,整数u,整数v){ 插入_列表(&(g->adj[u]),v); } int main(){ int V=10; 图*a=创建图(V); printf(“\n已创建图形”); 增编(a,1,2); 增编(a,1,5); 增编(a,2,1); 增编(a,2,5); 增编(a,2,3); 增编(a,2,4); 增编(a,3,2); 增编(a,3,4); 增编(a,4,2); 增编(a,4,5); 增编(a,4,3); 增编(a,5,4); 增编(a,5,1); 增编(a,5,2); 返回0; }

这个图形代码有什么错误? #包括 结构主义者{ int数据; struct-llist*next; }; 类型定义结构列表; 结构图{ INTV; 列表**调整; }; 类型定义结构图; 图*创建图(int V){ 列表**调整=(列表**)malloc(sizeof(列表*)*V); 图*a=(图*)malloc(sizeof(图)); a->V=V; a->adj=adj; 返回a; } 无效插入列表(列表**标题,内部v){ 列出*新节点、*临时节点、*最后节点; 新节点=(列表*)malloc(sizeof(列表)); 新建_节点->数据=v; 新建节点->下一步=空; printf(“\n高%d”,头部); /* *头部为空,将头部指向temp并返回。 */ 如果(*head==NULL){ *head=新的_节点; 返回; } 温度节点=*头部; 做{ 最后一个节点=临时节点; 临时节点=临时节点->下一步; }while(临时节点); 最后一个\u节点->下一个=新的\u节点; } 无效加差(图*g,整数u,整数v){ 插入_列表(&(g->adj[u]),v); } int main(){ int V=10; 图*a=创建图(V); printf(“\n已创建图形”); 增编(a,1,2); 增编(a,1,5); 增编(a,2,1); 增编(a,2,5); 增编(a,2,3); 增编(a,2,4); 增编(a,3,2); 增编(a,3,4); 增编(a,4,2); 增编(a,4,5); 增编(a,4,3); 增编(a,5,4); 增编(a,5,1); 增编(a,5,2); 返回0; },c,graph,C,Graph,在这段代码中,通过打印消息,我发现is create_graph函数正确执行并返回一个图。然后调用addedge,如果(*head==NULL)部分总是返回false(不知道为什么,第一次应该返回true)。然后它在DoWhile循环中继续执行,并一直执行到无穷大,代码终止 我想做的是我有一个叫做graph的结构,它有一个整数变量V和一个链表变量adj(表示邻接列表)数组。然后creategraph将初始化一个graph变量并返回它 Addedge(V,u,V)将边V添加到u(表示V与u相邻)。

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

我想做的是我有一个叫做graph的结构,它有一个整数变量V和一个链表变量adj(表示邻接列表)数组。然后creategraph将初始化一个graph变量并返回它

Addedge(V,u,V)将边V添加到u(表示V与u相邻)。所以adj[0…V-1]是一个链表数组。所以,若边1与2和3相邻,那个么列表将看起来像1->2->3

如果需要更多信息,请发表评论。我不知道为什么*head第一次不为null,为什么while循环从不终止


事先非常感谢。

经过反复试验,我发现了错误

在函数CREATEGRAPH中,初始化列表后,每个单独的列表也必须初始化为NUll,否则它将有垃圾内容

下面是正确的代码:

#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;
}
graph*创建图(intv){
列表**调整=(列表**)malloc(sizeof(列表*)*V);
int i;
对于(i=0;iV=V;
a->adj=adj;
返回a;
}

在使用任何指针之前,将所有指针初始化为NULL。我认为这将解决您的问题problem@Nullpointer如果这使得问题消失了,那么它只表明代码中存在bug。通过实际修复而不是将它们隐藏在地毯下,来消除这些bug…@Lundin,但通常情况下,初始化指针失败是一开始的bug。。。
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;
}