2016-04-24 108 views
0

我將項目添加到一個鏈表,而不允許任何重複:將項目添加到鏈接列表,而不允許重複

列表

typedef struct node 
{ 
    double info; 
    struct node *next; 
} NODE; 

我的功能:

void addToEnd(NODE **lista, double info) 
    { 
     NODE *novi = (NODE *) malloc(sizeof(NODE)); 
     novi->info = info; 
     novi->next = NULL; 

     if (*lista == NULL) 
      *lista = novi; 
     else 
     { 
      NODE *tmp = *lista; 
      while (tmp->next) 
      { 
      if(tmp->info == info) 
      {free(new); return;} 
      tmp = tmp->next; 
      } 
      tmp->next = novi; 
     } 
    } 

它確實如果數字不只是彼此相加,例如添加5.5 1.0 5.5可以正常工作,但是5.5 5.5 1.0會同時添加5.5,是雙舍入錯誤還是代碼邏輯有缺陷?

+1

它泄漏內存如果檢測到重複。 – wildplasser

+0

我修好了,但它不是我的問題 – AleksXPO

+1

s/novi/new/g ... – wildplasser

回答

2
  • 不分配,直到你確信你實際需要的內存
  • 避免特殊情況。目標是找到鏈中的第一個(也是唯一的)空指針。這可以是*lista(如果列表恰好是空的),或者一些->next指針。

void addToEnd(NODE **lista, double info) 
{ 
    NODE *new ; 

    for ( ; *lista; lista = &(*lista)->next) { 
     if((*lista)->info == info) return; 
    } 
    new = malloc(sizeof *new); 
    new->info = info; 
    new->next = NULL; 
    *lista = new; 
} 

,或者甚至更緊湊的(你不需要new指針,因爲你可以使用->next指針):

void addToEnd(NODE **lista, double info) 
{ 
    for ( ; *lista; lista = &(*lista)->next) { 
     if((*lista)->info == info) return; 
    } 
    *lista = malloc(sizeof **lista); 
    (*lista)->info = info; 
    (*lista)->next = NULL; 
} 
+0

非常感謝:D! – AleksXPO

+0

有一件事,只是爲了確保在for循環結束後lista指向一個隨機內存位置或一個空指針?這部分讓我感到困惑 – AleksXPO

+1

循環條件是'* lista'(邏輯上與'* lista!= NULL'相同),所以:在循環之後,'* lista'被**保證**指向一個NULL指針。 – wildplasser