移除第 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
你能帮我修复这个功能吗?谢谢
一个双向链表应该有两个属性begin和end,指向两个“empty”的地方,head->next应该指向第一个元素,end- >pre 应该指向最后一个元素,你的代码假定 head 作为第一个元素,当它试图删除第一个元素时,它会删除 head 之后的元素,即第一个元素之后的元素。 A.K.A第二个元素。
正确的代码可能是这样的:
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;
}
}
请注意,我没有测试代码。可能会有一些问题,但你明白了。
您没有删除任何内容。您正在围绕 temp 进行链接,但由于它从未真正被删除,因此您只是泄漏了内存。您与 cur 匹配,这意味着您想要删除 cur,但随后您将 temp 分配给 cur->next。您正在围绕 cur + 1 进行链接,这就是为什么您总是取消链接(而不是删除)第 (i + 1) 个节点的原因。您也不需要任何临时工;该列表是双向链接的。利用这一点。在双向链表中擦除非常容易。在删除命令之后,您的函数也应该立即 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;
}
}
}
只要把它画在一张纸上就可以解决这个问题。事先这样做会完全消除这个问题。规划是编程中最重要的方面之一。
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
你能帮我修复这个功能吗?谢谢
一个双向链表应该有两个属性begin和end,指向两个“empty”的地方,head->next应该指向第一个元素,end- >pre 应该指向最后一个元素,你的代码假定 head 作为第一个元素,当它试图删除第一个元素时,它会删除 head 之后的元素,即第一个元素之后的元素。 A.K.A第二个元素。
正确的代码可能是这样的:
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;
}
}
请注意,我没有测试代码。可能会有一些问题,但你明白了。
您没有删除任何内容。您正在围绕 temp 进行链接,但由于它从未真正被删除,因此您只是泄漏了内存。您与 cur 匹配,这意味着您想要删除 cur,但随后您将 temp 分配给 cur->next。您正在围绕 cur + 1 进行链接,这就是为什么您总是取消链接(而不是删除)第 (i + 1) 个节点的原因。您也不需要任何临时工;该列表是双向链接的。利用这一点。在双向链表中擦除非常容易。在删除命令之后,您的函数也应该立即 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;
}
}
}
只要把它画在一张纸上就可以解决这个问题。事先这样做会完全消除这个问题。规划是编程中最重要的方面之一。