[英]Double Linked List - Node Deletion
編寫程序以使用雙鏈表。 它的類完美地工作,一切都正確存儲,節點正在被添加,顯示和搜索。 問題是刪除。 類和deleteNode方法的代碼如下,對於我的生活,我似乎無法弄清楚為什么它沒有刪除正確的節點。
例如,假設我在鏈接列表的末尾插入一個數據“Morgan Captain 666-666-6666”的節點,當我顯示它和所有內容時,一切都會出現。 我對這些方法沒有任何問題。 但是當我嘗試刪除編號為“666-666-6666”的節點時,我出現了“數字不存在”消息。
我已經繪制了我的鏈表圖表,對我來說這是有道理的,但在代碼中顯然不是這樣。 有什么指針嗎?
編輯:我已經在列表的末尾有一個案例可以工作,但是沒有為列表的開頭和中間條目做任何事情。 頭節點也被作為所有不必要函數的參數取出。 更新后的代碼如下。
編輯2:似乎最后一種情況對從讀入函數添加到內存的節點不起作用。 更新。
類和結構:
struct node{
node* next;
node* prev;
string lastname;
string firstname;
string phnum;
};
class linkedList
{
node* n; // indicator of current node
node* head; // head node, does change as needed
public:
linkedList();
~linkedList();
void choice(char choice);
void makeList(node* &head);
void addNode();
void deleteNode();
void searchName();
void searchNum();
void displayList();
void writeFile();
};
deleteNode方法:
void linkedList::deleteNode()
{
string num;
node *p, *f; // To link any nodes back together after deletion.
n = head;
// Displays list of nodes to reference. Function deletes based on phone number string comparison.
displayList();
cout << "Please enter the phone number from the list above, as displayed, that you would like to delete: ";
cin >> num;
while (n != NULL)
{
// If a number matches
if (n->phnum == num)
{
// If it's the head node - DOES NOT WORK
if (n == head)
{
head = head->next;
head->prev = NULL;
delete n;
cout << "This name and number has been deleted." << endl << endl;
return;
}
// if it's a middle node - DOES NOT WORK
else if (n->next != NULL)
{
p = n->prev;
f = n->next;
p->next = f;
f->prev = p;
delete n;
cout << "This name and number has been deleted." << endl << endl;
return;
}
// If it's an end node - WORKS FOR ADDED NODES, NOT DEFAULT ONES
else
{
n->prev->next = NULL;
delete n;
cout << "This name and number has been deleted." << endl << endl;
return;
}
}
//If there is no matching number
else
n = n->next;
}
cout << "This number does not exist in our system." << endl << endl;
return;
}
您只處理了正確刪除“中間”元素的一般情況。 您必須考慮要刪除第一個或最后一個元素的情況,確定識別這些情況的“if”條件,並使用不同的刪除代碼來適應。 一個提示是,正如你所做的那樣,將* head傳遞給刪除例程將不會在所有情況下都有效。 我不會更明確,所以你可以繼續學習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.