c语言 - 指针的新手试图弄清楚为什么我的链接列表实现不起作用



我是一个全新的C编程和试图找出指针。我想我应该从写一个简单的链表程序开始。addNote的想法是沿着指针链迭代,直到我找到一个指向NULL的指针,而不是一个结构节点,然后改变指针指向我要添加的新节点。我发现这将需要指针指向指针,至少看起来应该。我可以让它添加第一个节点,但当我第二次调用它时,我惊讶的是,我创建的新结构体的地址与前一个相同?!这一点我不明白。还是说这里有很多更基本的错误?哈哈,很有可能,因为我以前从未使用过指针和C语言。谢谢你的帮助!

#include <stdio.h>
struct node{
int value;
struct node* next;
};
void addNode(int value, struct node** base){
struct node newnode;
newnode.value = value;
newnode.next = NULL;
struct node** nodeptr = base;

while(*nodeptr != NULL){
nodeptr = &(*nodeptr)->next;
}
printf("%d :- valuen",value);
printf("%p :- basen",base);
printf("%p :- *basen",*base);
printf("%p :- nodeptrn",nodeptr);
printf("%p :- *nodeptrn",*nodeptr);
printf("%p :- nodeaddressnn",&newnode);
*nodeptr = &newnode;
}
int main(){
struct node* base = NULL;
addNode(12,&base);
addNode(13,&base);
return 0;
}
下面是我从printf调试代码中得到的示例输出:
12 :- value
0000007D6EBFF818 :- base
0000000000000000 :- *base
0000007D6EBFF818 :- nodeptr
0000000000000000 :- *nodeptr
0000007D6EBFF7C0 :- nodeaddress
13 :- value
0000007D6EBFF818 :- base
0000007D6EBFF7C0 :- *base
0000007D6EBFF7C8 :- nodeptr
0000000000000000 :- *nodeptr
0000007D6EBFF7C0 :- nodeaddress

我不希望新节点的地址是相同的第二次我调用addNode,因为它创建了一个新的结构节点?

*nodeptr = &newnode;执行时,先前节点永远不会更新其.next

*nodeptr = &newnode;本身是不好的,因为newnode是一个局部对象,&newnode在函数返回时无效。

而是分配一个节点并将其放在列表中。

// This simple example adds `value` to the front of the list.
void addNode(int value, struct node** base){
struct node *new_node = malloc(sizeof new_node[0]);
if (new_node == NULL) {
Handle_OutOfMemeory();  // Perhaps quit the program?
}
new_node->value = value;
new_node->next = *base;
*base = new_node;
}

为了添加到结尾,我将首先重新组织列表并跟踪其尾部,而不是头部。尾巴会指向头。然后在0(1)时间内添加结束或开始。

最新更新