2016-12-15 50 views
1

我已經寫了這段代碼,按位置插入到鏈表中。爲什麼插入函數總是附加在鏈表的末尾?

void insert(node *list, int data, int position) { 
    int c; 

    node *temp; 
    node *prev; 
    node *curr; 

    curr = list; 

    temp = malloc(sizeof(node)); 
    temp->num = data; 

    if (curr == NULL) { 
     curr = temp; 
     curr->next = NULL; 
    } else { 
     while (curr != NULL && c != position) { 
      prev = curr; 
      curr = curr->next; 
      c++; 
     } 
     if (c = 0) { 
      temp->next = curr; 
      curr = temp; 
     } else if (curr == NULL) { 
      prev->next = temp; 
     } else { 
      prev->next = temp; 
      temp->next = curr; 
     } 
    } 
} 

但是,我相信這個塊總是執行,不管是什麼,數據都會被附加到鏈表的末尾。

else if (curr == NULL) { 
     prev->next = temp; 

爲什麼curr總是空?如果位置小於列表中元素的數量,它不應該爲空......

+2

首先:'int c = 0;' – LPs

回答

0

您尚未將c變量初始化爲0。也條件 如果(C = 0)應該已經如果(C == 0)

TEMP->下一= NULL也應TEMP-> NUM =數據之後進行否則它將保持未初始化如果是

 else if (curr==NULL) { 
       prev->next=temp; 
     } 

這些都是我注意到的。

0

有你的代碼中的多個問題:

  • 局部變量c未初始化。在沒有事先初始化的情況下使用它會調用未定義的行你應該把它定義是這樣的:

    int c = 0; 
    
  • 測試if (c = 0)c0價值和總是失敗。使用==操盤手:

    if (c == 0) { 
        ... 
    
  • 您必須返回list並設置listcurr是元件插入在列表的開始(位置0),或者如果該列表是空的。

這裏是一個改進版本:

node *insert(node *list, int data, int position) { 
    node *temp = malloc(sizeof(node)); 
    if (temp == NULL) { 
     return NULL; 
    } 
    temp->num = data; 
    if (list == NULL || position <= 0) { 
     temp->next = list; 
     return temp; 
    } else { 
     node *curr = list; 
     while (position-- > 0 && curr->next != NULL) { 
      curr = curr->next; 
     } 
     temp->next = curr->next; 
     curr->next = curr; 
     return list; 
    } 
} 
+1

'void insert' --->'node * insert';) – LPs

+0

如何從void函數返回節點*或NULL? – user3283146

+1

@LP答案已更正。謝謝。 – chqrlie

0

你必須有一個局部變量:c

該變量具有自動存儲並且其起始值不確定。 您必須初始化它

int c = 0; 

否則其初始值可以在任何時刻功能寄存器舊值或內存垃圾被調用,所以

while (curr!=NULL && c != position) 

行爲是不確定的。


而且,如果一段時間後,檢查竊聽:平等關係運算符是==

if (c=0) 

必須

if (c==0) 

否則,你要分配0c,而不是測試其值。