標題相當自我解釋。下面是我爲這個目的編寫的功能:刪除鏈接列表中具有特定值的所有節點
void wipeLoneCells()
{
cell *tmp;
tail = head;
while (1)
{
if (head == tail && !tail->flag)
{
head = head->next;
free(tail);
tail = head;
continue;
}
tmp = tail->next;
/***/ if (tmp->next == NULL && !tmp->flag)
{
tail->next = NULL;
free(tmp);
break;
}
else if (!tmp->flag)
{
tail->next = tmp->next;
free(tmp);
continue;
}
tail = tail->next;
}
}
名單的頭和尾是全球性的,而列表是通過這個函數被調用頭指向第一個節點和尾指向時建最後(其下一個是NULL)。我幾乎可以肯定,我的鏈接列表是正確構建的,因爲我可以毫無錯誤地打印它們。有時候,這個函數完美地工作,有時它會在標有星號的行上導致訪問衝突。我知道這並不是完全錯誤的,因爲當我沒有產生錯誤時,我得到了我想要的結果,儘管我經常得到錯誤,所以一定有一些我忽略的東西。預先感謝您的任何幫助。
編輯:這裏是固定碼:
void wipeLoneCells()
{
cell *tmp;
tail = head;
while (1)
{
if (head == tail && !tail->flag)
{
head = head->next;
free(tail);
tail = head;
continue;
}
tmp = tail->next;
if (tmp->next == NULL && !tmp->flag)
{
tail->next = NULL;
free(tmp);
break;
}
else if (tmp->next == NULL)
{
tail = tmp;
break;
}
else if (!tmp->flag)
{
tail->next = tmp->next;
free(tmp);
continue;
}
tail = tail->next;
}
}
你能告訴我們'細胞'的定義嗎? – fge 2011-12-23 12:12:25
提示:如果您使用筆和紙手寫並在該基礎上手動執行步驟和寫入代碼,則鏈接列表問題更容易解決。 – 2011-12-23 12:46:44