2016-12-05 80 views
3

在此任務中遇到問題。我只是列表,檢查當前處理的元素是否在其中。如果是跳過它,否則添加到新列表。 我寫了三個函數來做到這一點。搜索特定元素的元素,下一個正在檢查元素的元素存在於新列表中,最後一個元素將所有元素放在一起。從鏈接列表中刪除重複項並將其保存到另一個列表中C

我試圖做到這一點有兩種方法:

  • 首先檢查發生在「老字號」名單,它的工作原理,但不是在所有(寫入新的列表按降序排列)也是我認爲對於特殊的例子它不會工作。
  • 第二次檢查當前創建列表中元素的出現,但這不起作用。

下面是代碼:

struct list *search_node(struct list *prt, char *to_search) { 
    is_empty(); 
    short is_found = -1; 
    while (prt != NULL && ((is_found = strcmp(prt->word, to_search) != 0))) { 
     prt = prt->next; 
    } 
    if (!is_found) 
     return prt; 
    else 
     return NULL; 
} 

bool is_on_list(struct list *ptr, char *str) { 
    if (search_node(ptr, str) != NULL) 
     return 1; 
    else 
     return 0; 
} 

struct list *without_repetiton(struct list *head) { 
    struct list *new_list = NULL; 
    struct list **new_el = &new_list; 
    struct list *prt1 = head, *check; 

    while (prt1 != NULL) { 
     //printf("test = %s\n", prt1 -> word); 
     check = new_list; 
     if (!is_on_list(prt1->next, prt1->word)) { // or (new_list, prt1 -> word) 
      *new_el = (struct list *)malloc(sizeof(struct list)); 
      memcpy(*new_el, prt1, sizeof(struct list)); 
      new_el = &((*new_el)->next); 
     } 
     prt1 = prt1->next; 
    } 
    return new_list; 
} 

有列表的結構:

struct list { 
    char *word; 
    struct list *next; 
    struct list *prev; 
}; 

我有兩個問題,第一,爲什麼第一種方法降序寫入列表,第二,爲什麼當我試圖搜索已經創建的列表中的單詞發生在不工作?

IO樣品:

當:is_on_list(prt1->next, prt1->word))
拳列表:一,一,二
第二列表:二,一
當:is_on_list(new_list, prt1->word))
第一個列表是相同的第二。

+2

注意,當您在列表中複製的節點,其中'memcpy'功能,你不會做*深*拷貝。也就是說,你只複製指針'word',而不是指向的數據。這意味着你之後將有兩個指針指向同一個內存。這可能會導致麻煩,如果您稍後嘗試修改一個列表的字符串,那麼這兩個列表都會有更新。或者當你(可能)試圖釋放內存並且可能執行兩次。此外,還有一種更簡單的方法來對這樣的結構進行淺拷貝:'** new_el = * prt1'。 –

+0

'((is_found = strcmp(prt-> word,to_search)!= 0))'是可疑的。 – joop

+0

有什麼問題?你能給出輸入和輸出樣本嗎? – eyalm

回答

1

您的代碼不正確地構建重複列表:簡化代碼,並用手鍊接,而不是使用memcpy()新的元素:

struct list *search_node(struct list *ptr, const char *to_search) { 
    while (ptr != NULL) { 
     if (!strcmp(ptr->word, to_search)) 
      return ptr; 
    } 
    return NULL; 
} 

bool is_on_list(struct list *ptr, const char *str) { 
    return search_node(ptr, str) != NULL; 
} 

struct list *without_repetiton(struct list *head) { 
    struct list *new_list = NULL; 
    struct list *tail = NULL; 

    for (struct list *ptr = head; ptr != NULL; ptr = ptr->next) { 
     if (!is_on_list(new_list, ptr->word)) { 
      struct list *node = malloc(sizeof(*node)); 
      node->next = NULL; 
      node->prev = tail; 
      node->str = strdup(ptr->word); 
      if (tail == NULL) { 
       new_list = tail = node; 
      } else { 
       tail->next = node; 
       tail = node; 
      } 
     } 
    } 
    return new_list;  
}