删除第 I 个元素
Remove Ith element
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;
}
}
请注意,我没有测试代码。可能会有一些问题,但你明白了。
相关文章:
- C++如何通过用户输入删除列表元素
- 使用函数"remove"删除重复元素
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 从矢量中删除元素后出现隔离错误
- 删除映射和分割错误中的一个过去结束元素
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- 从矢量中删除空元素
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 删除指针数组 (C++) 中的元素
- 删除列表 c++ 中的最后 3 个元素
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 从std::multiset的第i个元素删除到末尾
- 删除 [] 是否等于每个元素删除.C++
- std::列出元素删除后节点的内存回收