簡體   English   中英

為什么我的鏈表標頭指向標頭之前的2個項目

[英]Why does my linked list head point to 2 items before the head

所以我試圖以非全局形式練習我的C雙指針鏈接列表,並且我感到困惑,為什么s(實際上是頭)先指向null,然后再指向一些隨機地址,即使我認為我將其移至列表中的第一個節點。

這是我的代碼:

typedef struct nodeStruct{
    int               item;
    struct nodeStruct *next;
} Statistician;

void add(Statistician **s, int x);
void displayData(Statistician **s);

int main(int argc, char *argv[]) {
    Statistician *s = NULL;

    add(&s, 3); 
    add(&s, 4);
    add(&s, 5);
    add(&s, 6);
    add(&s, 7);
    add(&s, 8);
    add(&s, 9);
    displayData(&s);

    return 0;
}
void add(Statistician **s, int x){
    Statistician *temp = malloc(sizeof(Statistician));

    temp->item = x;
    temp->next = NULL;

    if(s == NULL){
        s = &temp;
    }
    else{
        Statistician *travel = s;

        while(travel->next!=NULL){
        travel = travel->next;
    }

    travel->next = temp;
   }
 }

 void displayData(Statistician **s){
    Statistician *temp = s;

    printf("List is: ");

    while(temp!=NULL){
    printf("%d ", temp->item);
    temp = temp->next;
    }
 }

我從代碼中獲得此輸出,並且也收到以下警告: List is: 0 43586480 3 4 5 6 7 8 9 [警告]在代碼行中從不兼容的指針類型初始化(默認情況下啟用)[默認]統計信息* travel = s

在打印數據之前,我總是可以將displaydata移動兩次,這樣我不想看到的第一個數據就不會消失,但是我想知道為什么它會那樣工作。 我也可以忽略這些錯誤,但我想學習如何解決。

[警告]從不兼容的指針類型初始化(默認情況下啟用),此行代碼統計師* travel = s

這表示您正在分配不兼容的指針類型。

if(s == NULL){
    s = &temp;
}

這里s並不指向您的head*s是。 所以應該

if(*s == NULL){
*s = temp;
}

然后

Statistician *travel = s;

再次應該

Statistician *travel = *s;

然后在displayData()

void displayData(Statistician **s){
Statistician *temp = *s;

該代碼邏輯錯誤。 你沒有用s正確。 就像那樣。 您之前的操作沒有做任何重要的事情。 您對局部變量進行了一些錯誤的更改,並將單個指針值分配給了一個雙指針。

void add(Statistician **s, int x){
    Statistician *temp = malloc(sizeof(Statistician));

    temp->item = x;
    temp->next = NULL;

    if(*s == NULL){
        *s = temp; //<---change 
    }
    else{
        Statistician *travel = *s; //<--change

        while(travel->next!=NULL){
        travel = travel->next;
       }

    travel->next = temp;
   }
 }

您需要通過檢查其retyurn值來檢查malloc調用是否失敗。 當呼叫失敗時,這將使您免於未定義的行為。

另外displayData函數也是錯誤的。 這將是

 void displayData(Statistician **s){
    Statistician *temp = *s; //<---change

    printf("List is: ");

    while(temp!=NULL){
    printf("%d ", temp->item);
    temp = temp->next;
    }
 }

之前,您有未定義的行為來訪問您甚至未分配的內存,或者您沒有權限。 這在您的代碼中調用了Undefined行為。

清除想法:

在這里,當您傳遞&s則意味着正在發送s地址,類型為Statistician**的局部變量將保存該地址。 現在,如果不取消引用它,則只需使用本地變量中包含的s的地址即可。 這不是您想要的。 您需要更改要傳遞的地址。 因此,您可以通過取消引用*s = temp實現它,就像這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM