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))
第一個列表是相同的第二。
注意,當您在列表中複製的節點,其中'memcpy'功能,你不會做*深*拷貝。也就是說,你只複製指針'word',而不是指向的數據。這意味着你之後將有兩個指針指向同一個內存。這可能會導致麻煩,如果您稍後嘗試修改一個列表的字符串,那麼這兩個列表都會有更新。或者當你(可能)試圖釋放內存並且可能執行兩次。此外,還有一種更簡單的方法來對這樣的結構進行淺拷貝:'** new_el = * prt1'。 –
'((is_found = strcmp(prt-> word,to_search)!= 0))'是可疑的。 – joop
有什麼問題?你能給出輸入和輸出樣本嗎? – eyalm