在我深入研究代码之前,对您的实际问题的简短回答:
...为什么返回的列表为 NULL ...
没有返回列表,您既不使用传递return
结果,也不设置 out 参数的值。
在您编辑的代码中:
void createList(struct nodo_ **Lista){
struct nodo_ *Aux_List = list_D;
aux_List = malloc(sizeof(struct nodo_));
您首先设置Aux_List
为 的当前值,Lista
您知道它尚未初始化,因为您正在尝试对其进行初始化。然后你丢弃aux_List
那个值,用 . 返回的新地址覆盖malloc
。您永远不会将任何内容存储到*Lista
中,这将是此函数按声明工作的唯一方法。
正如 Ed 建议的那样,你的 typedef 隐藏了很多有用的信息,所以让我们扩展它
struct nodo {
char* dato;
struct nodo *next;
};
/*Def list */
void createList(struct nodo* list_D);
现在,您可以看到这createList
是错误的:您可以传入列表的头节点(无论如何这都没用),但它无法将新分配的列表返回给调用者。
坦率地说createList
,无论如何,你的原语都不是有用的,所以我要先从一个合理的基础开始:
struct nodo *alloc_nodo(char *dato, struct nodo *next)
{
struct nodo *n = malloc(sizeof(*n));
n->dato = dato;
n->next = next;
return n;
}
现在,在我们重新编写你的createList
使用之前,让我们看看它现在做了什么:
void createList(struct nodo *list_D)
{
struct nodo *aux_List = list_D;
aux_List = malloc(sizeof(struct nodo_));
/* ^ so, we take the input argument and immediately discard it */
char* path_a = "Hello";
char* path_B = "Minasan";
/* Store */
aux_List->dato = path_a;
aux_List = Aux_List->next;
/* ^ note that we haven't initialized aux_List->next yet,
so this is a random pointer value */
aux_List = malloc(sizeof(struct nodo_));
/* again, we set aux_List to something,
but immediately overwrite and discard it */
aux_List->dato = path_b;
aux_List->next = NULL;
}
因此,它忽略了它的输入,不返回输出,并泄漏了两个未相互连接的部分初始化的节点。我相信您想要实现更多类似的目标:
struct nodo* create_my_list()
{
struct nodo *tail = alloc_nodo("Minasan", NULL);
/* the end (tail) of the linked list has a NULL next pointer */
struct nodo *head = alloc_nodo("Hello", tail);
/* the head of the linked list points to the next node */
return head;
/* like a snake, you hold a singly-linked list by the head */
}
如果我们现在写main
来使用这个函数,它看起来像:
int main()
{
struct nodo *head = create_my_list();
struct nodo *n;
for (n = head; n != NULL; n = n->next)
{
printf("The date is %s\n ", n->dato);
}
}