调试时,它告诉我L是nullptr。我无法弄清楚为什么它没有正确地返回列表。
这些是结构(我必须使用列表和节点):
typedef struct node node;
typedef struct List list;
struct node {
int data;
node *next;
};
struct List {
node *head;
};
创建列表的功能:
void BuildList(list *L) {
node *head = NULL, *temp = head;
int num;
printf("Input list's elements: \n");
do {
scanf("%d", &num);
if (num != -1) {
if (head == NULL) {
head = BuildNode(num);
temp = head;
}
else {
temp->next = BuildNode(num);
temp = temp->next;
}
}
} while (num != -1);
L = (list *) malloc(sizeof(list));
L->head = head;
}
BuildList的辅助功能:
node* BuildNode(int num1) {
node *node1 = (node *)malloc(sizeof(node));
node1->data = num1;
node1->next = NULL;
return node1;
}
打印功能:
void PrintList(list *L) {
node *head;
head = L->head;
printf("The list's elements are: ");
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
程序失败" head = L-> head;"在PrintList,声称它是一个nullptr。它的起源可证明是BuildList中的动态分配,最后。来自main的电话是:
list *head = NULL;
BuildList(&head);
PrintList(head);
替换PrintList(head)时;与PrintList(& head);它打印出一个空列表,没有失败。
答案 0 :(得分:2)
你正在传递一个指向函数的指针:
BuildList(list * L)
这意味着当你在函数内部分配它时,你不会在这个函数之外有这个指针,因为它在堆栈上。你可以做的是,在这个函数之外分配List,如:
list *head = malloc(sizeof(list)); /* It's a good habit to not cast malloc function */
BuildList(head); /* Remember to remove malloc from inside of build list */
PrintList(head);
或者将双指针传递给函数:
void BuildList(list **L) {
node *head = NULL, *temp = head;
.....
*L = malloc(sizeof(list));
(*L)->head = head;
}
list *head = NULL;
BuildList(&head);
PrintList(head);
答案 1 :(得分:0)
这里你需要发送指向列表l的指针的地址作为争论而不是列表的地址,因为我们希望在函数中完成的所有更改都会影响列表l,这只有在我们有列表的地址时才能实现在函数中,以便对列表的任何更改在内存中永久更改!
所以你只需要使用
void BuildList(list **lreference)
并在调用BuildList函数时将指针的地址发送到list。
list *l;
l = malloc(sizeof(list));
BuildFirst(&l);