簡體   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