#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循环永远不会终止。
提前多多感谢。
答案 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;
}