2013-01-18 45 views
-1

我有一個結構中刪除第一個元素:下,在列表

struct Node { 
    int value; 
    struct Node *next; 
}; 

typedef struct Node List; 

而且我實現了將項目添加到列表中,但我有問題,從列表中刪除元素時,它的第一給定列表上元件,我的功能:

void removeItem(List *ptr, int i) 
{ 
    List *current = ptr; 
    List *prev = NULL; 
while (current != NULL) 
{ 
    if (current->value == i) 
    { 
        //it's first element 
     if (prev == NULL) 
     { 
      List *replace = ptr->next; 
      free(current); 
      ptr = replace; 
      current = replace; 
     } 
     else 
     { 
      prev->next = current->next; 
      free(current); 
      current = prev->next; 
     } 
    } 
    else 
    { 
     prev = current; 
     current = current->next; 
    } 
} 
} 

當我的列表是這樣的:

1,2,3,4,5

使用的removeItem後(列表1)它是:

0,2,3,4,5

不應該存在。

另一個問題是,我也應該實現這些功能時,類型定義是不同的:

typedef struct Node *List; 

但後來我的東西不是一個結構得到噸「錯誤的參數類型」 /「請求會員‘價值’或聯合「錯誤。我能找到一些如何處理這個問題的例子嗎?

+2

'PTR =取代;'具有該功能的範圍沒有任何影響。 – 2013-01-18 18:57:33

+0

Right但是ptr = ptr-> next;具有相同的效果(1替換爲0) – Michael

+0

我的意思是'ptr = <這裏的其他任何東西,不管它是什麼>;'沒有效果,因爲'ptr'是變量的局部。閱讀C中的示波器,我感到很累。 – 2013-01-18 19:04:13

回答

2

您的問題是您傳入的變量(list)未被您的刪除代碼修改。因此,當您刪除List中的第一個Node時,您將留下的引用,該引用不再位於List中。

原因是這樣的:

當你調用removeItem(list, 1),你正在傳遞的list值。在這種情況下,它是類型爲List的數據地址。在removeItem函數內部,該值由ptr變量攜帶。當您輸入該功能時,ptr變量是您的List的地址,您可以使用它進行工作。在行ptr = replace中,您所做的只是更改ptr所持有的值。它不會影響調用removeItem的範圍內的list的值。

最簡單的做法是讓removeList返回一個指向結果列表頭部的指針。對於大多數電話,它將與傳入的ptr相同;只有當被刪除的Node位於List的開頭時,結果指針纔會不同。

或者,你可以改變removeList所以它需要一個指向指針List,那麼你就稱呼其爲removeList(&list, 1),這將讓你在list直接修改值。

1

這loooks就像一個家庭作業的問題,所以我不想直接回答,但有兩條線索:

  • 如果你的目標是在函數調用什麼列表點更改爲removeItem()removeItem()第一個參數的類型需要是什麼?

  • 如果我告訴過,在某些實現中,指針變量將指出該變量指向的空間作爲調試幫助,這將有助於您理解所獲得的輸出嗎?

當你得到這個工作時,請隨時張貼你自己的問題的答案。

0

所有的答案是有幫助的,這是一個最終的功能:

void removeItem(List *ptr, int i) 
{ 
    while ((*ptr) != NULL) 
    { 
     if ((*ptr)->value == i) 
     { 
      List tmp = *ptr; 
      *ptr = (*ptr)->next; 
      free(tmp); 
     } 
     else 
     { 
      ptr = &((*ptr)->next); 
     } 
    } 
} 

作品,因爲它應該:

List ptr = malloc(sizeof(List)); 

//add items to list: 
//1, 1, 2, 3, 4, 4, 5, 5, 

removeItem(&ptr, 5); 
removeItem(&ptr, 2); 
removeItem(&ptr, 1); 

//print and clean 
//3, 4, 4,