删除第 I 个元素

Remove Ith element

本文关键字:元素 删除      更新时间:2023-10-16
void removeIelement(Dlist& d, int i) {
if (d.head == NULL) {
cout << "EMPTY" << endl;
return;
}
else {
int count = 1;
Node* cur = d.head;
while (cur != NULL) {
if (count == i) {
Node* temp = cur->next;
Node* temp2 = temp->next;
cur->next = temp->next;
temp2->prev = cur;
}
count++;           
cur = cur->next;
}
}
}

这是我删除双向链表中节点 i 的代码

我的双向链表是:

1 2 3 4 5 6 7 8 9 10

但是当我运行这个程序时,如果我输入i = 1,它将删除

1 3 4 5 6 7 8 9 10

与 i = 2 ....它将在元素 I (I+1( 之后删除

1 2 4 5 6 7 8 9 10

你能帮我修复这个功能吗?谢谢

您没有删除任何内容。您正在围绕 temp 进行链接,但由于它从未真正删除,因此您只是泄漏内存。你与cur匹配,这意味着你想要删除cur,但随后你将temp分配给cur->next。您正在围绕cur + 1进行链接,这就是为什么您总是取消链接(而不是删除((i + 1(st节点的原因。你也不需要任何临时工;该列表是双重链接的。利用这一点。在双向链表中擦除非常容易。在删除命令之后,您的函数也应立即return。它的工作已经完成。

这段代码没有考虑删除尾节点,因为我不知道你是否跟踪它。如果这样做,则还需要考虑该方案。

void removeIelement(Dlist& d, int i) {
if (d.head == NULL) {
cout << "EMPTY" << endl;
return;
}
else {
int count = 1;
Node* cur = d.head;
while (cur != NULL) {
if (count == i) {
cur->next->prev = cur->prev;  // Added
cur->prev->next = cur->next;  // Changed
if (cur == head) {            // Added
head = cur->next;         // Added
}                             // Added
delete cur;                   // Added
return;                       // Added
}
count++;           
cur = cur->next;
}
}
}

这可以通过在一张纸上绘制来解决。事先这样做可以完全消除这个问题。规划是编程最重要的方面之一。

双链表应该有 2 个属性,名为 begin 和 end,指向两个">"的地方,head->next 应该指向第一个元素,end->pre 应该指向最后一个元素,你的代码假设 head 作为第一个元素,当它试图删除第一个元素时,它会在 head 之后立即删除元素, 这是第一个元素之后的元素。又名第二个元素。

正确的代码可能如下所示:

void removeElement(Dlist& d, int id){
if(d.head->next==d.tail){
// the list is empty
cout << "empty list" <<endl;
}
else{
int count = 1; Node* cur = d.head->next;
while(cur->next != NULL)
if(count == id){
cur->prev->next=cur->next, cur->next->prev=cur->prev;
delete cur;
return; //removal successful
}
else
count++, cur = cur->next;
cout << "does not exist." << endl;
}
}

请注意,我没有测试代码。可能会有一些问题,但你明白了。