繁体   English   中英

尝试弄清楚为什么我的链接列表实现不起作用的指针的新手

[英]New to pointers trying to figure out why my implementation of a link list doesn't work

我是 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 :- value\n",value);
    printf("%p :- base\n",base);
    printf("%p :- *base\n",*base);
    printf("%p :- nodeptr\n",nodeptr);
    printf("%p :- *nodeptr\n",*nodeptr);
    printf("%p :- nodeaddress\n\n",&newnode);

    *nodeptr = &newnode;
}

int main(){
    struct node* base = NULL;

    addNode(12,&base);
    addNode(13,&base);

    return 0;
}

这是我从 printf 调试代码中得到的示例 output:

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是本地 object 并且当 function 返回时&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;
}

先进的

最后,我会首先重新组织列表并跟踪它的tail ,而不是head 尾巴会指向头部。 然后添加到结尾或开头可以在 O(1) 时间内发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM