我有一个奇怪的问题。我有这段代码,但它不起作用。奇怪的部分是,在函数内部,列表发生了变化(printf 命令指示这一点),但是当调用此函数时,列表中不会添加任何内容(我的列表不为空)。
void pushToList(node* list, int val) {
node* newNode = (node*) malloc(sizeof(node));
newNode->value=val;
newNode->next = list;
list = newNode;
printf("here, list->value = %d n", list->value);
printf("here, list->next->value = %d n", list->next->value);
}
// ----------------------------------
// if (list==NULL) {
// newNode->next = NULL;
// list = newNode;
// } else {
// newNode->next = list;
// list = newNode;
// }
例如,我在我的主函数中调用这个函数,如下所示:
node* node1;
pushToList(node1, 1111);
这是我在一个单独的头文件中的结构和 typedef(我已经包含在我的函数文件中):
#ifndef STACKELEMENT_H
#define STACKELEMENT_H
struct stackElement {
int value;
struct stackElement* next;
};
typedef struct stackElement node;
#endif /* STACKELEMENT_H */
另一个奇怪的行为是我有以下函数来附加项目,并且此函数仅在我的列表不为空时才有效:
int appendtoList(node* head, int val) {
node* current = head;
node* newNode = (node*) malloc(sizeof (node));
if(newNode == NULL){
fprintf(stderr, "Unable to allocate memory for the new noden");
exit(-1);
}
newNode->value = val;
newNode->next = NULL;
while (current->next) {
current = current->next;
}
current->next = newNode;
// if (head->next == NULL) {
// head->next = newNode;
// } else {
// while (current->next != NULL) {
// current = current->next;
// }
// current->next = newNode;
// }
//
return 0;
}
在函数中使用node**list作为参数类型。
当您将指向结构节点 *x 等函数的指针传递给 最大空隙(结构节点*p); 指针按值 AND 传递如果你想真正操作 x 指向的内容,请使用结构节点**作为参数类型并将 &x 传递给函数。
同样的逻辑应该适用于你的问题。
问题出在返回类型上,即变量的作用域,在本例中是指针变量。 Mbratch也指出了这一点,非常感谢,但实际上在阅读Mbratch的评论之前,我突然想起了讲义中关于"在其生命周期之外访问对象"的观点,我认为这与"调用"不同按值/按引用调用"问题。对于可能遇到此问题并可能感到困惑的人,只是一些澄清:由于我们在函数 pushToList 内为结构体 newNode NODE 分配内存(即使使用动态内存分配命令),当函数结束时分配给此变量的内存将被释放/销毁并且控件返回到被调用方函数(在本例中为 main())。因此,您应该将函数的返回类型设置为 node*(指向节点结构的指针),并在函数中返回标头。喜欢这个:
node* pushToList(node* head, int val) {
node* newNode = (node*) malloc(sizeof(node));
newNode->value=val;
newNode->next = head;
head = newNode;
return head;
}
在 appendToList 函数中,除了这个错误之外,正如 mbracth 指出的那样,我通过检查 head->next(尽管是隐式的)而不是 head 本身(查看它是否为 NULL)来犯另一个错误:如果 head 是 NULL,则无法访问 head->next。事实上,在堆栈溢出的其他一些帖子中标记为正确答案的两个答案误导了我这个错误。无论如何,这是正确的方法:
if (head == NULL) {
head = newNode;
} else {
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}