void del_duplicated(struct node *first) {
struct node *current = listfirst, *prev = listfirst, *tmp;
if (current == NULL)
printf("Nothing to delete !\n");
while (current != NULL) {
/* Keeping traverse the list to find the duplicated elements. */
prev = current;
current = current->next;
/* for the first and second duplicated node such as 1 1 2 3 5 */
if (prev->data == listfirst->data && current->data == listfirst->data) {
listfirst = current->next;
printf("LIST FIRST NOW AT %d", listfirst->data);
}
/* The rest requirement such as 1 2 4 4 5 convert to 1 2 5 */
else if ((prev->next)->data == (current->next)->data) {
(prev->next) = (current->next)->next; /*this is point 2 to 5*/
tmp = current; /*delete the node*/
free(tmp);
tmp = current->next;
free(tmp);
}
}
}
我有一個鏈表問題,需要我從列表中刪除「2個重複節點」。 這就像1 1 2 3 5
轉換爲2 3 5
。 和1 2 4 4 5
將被轉換爲1 2 5
。從排序的鏈接列表中一次刪除「2個重複」元素
但我的程序崩潰,因爲指針指向一個陌生的地方,我不知道爲什麼。 (.exe已停止工作) 我認爲我的移動指針的邏輯確定,但是.... error like this 我的邏輯附加在我的源代碼的註釋中。
我是一名在臺灣學習計算機科學的新手。 請原諒我的壞英語。
編輯 1小時後。
我在我的兩位法官聲明中添加了BREAK,並且運行良好。 但我不知道爲什麼。所有的
void del_duplicated(struct node *first) {
struct node *current = listfirst, *prev = listfirst, *tmp, *tmp2;
if (current == NULL)
printf("Nothing to delete !\n");
while (current != NULL) {
/* Keeping traverse the list to find the duplicated elements. */
prev = current;
current = current->next;
//printf("prev %d,current %d\n", prev->data, current->data);
//system("pause");
/* for the first and second duplicated node such as 1 1 2 3 5 */
if (prev->data == listfirst->data && current->data == listfirst->data) {
listfirst = current->next;
system("pause");
break;
}
/* The rest requirement such as 1 2 4 4 5 convert to 1 2 5 */
else if (current->data == (current->next)->data) {
(prev->next) = (current->next)->next; /* this is point 2 to 5 */
tmp = current->next;
tmp2 = current; /* delete the node */
current = (current->next)->next;
free(tmp);
free(tmp2);
break;
}
}
}
你的英語非常好。你應該花一些時間**學習調試**。它將爲您節省無數個小時的「爲什麼這不起作用」 – bolov
如果您的列表沒有虛擬的第一個節點(這意味着您的第一個節點在第一個示例中保持值爲1),那麼您正在更改列表地址當你刪除你的第一個節點。您必須將列表的地址傳遞給您的函數才能執行此操作。例如'void del_duplicated(struct node ** first)'。否則,當你刪除第一個節點時,你在main()中沒有引用你的列表。 –
非常感謝:D我會!!!我剛剛學習C 4個月前〜 – Alfons