C++ 双链接列表:删除节点
我试图删除双链接列表中的一个节点,但这里的问题是,当我有一个列表:7-6-5-4-3-2-1,并尝试删除3,我得到7-6-5-4-3,我无法找出错误。请帮忙C++ 双链接列表:删除节点,c++,pointers,data-structures,linked-list,nodes,C++,Pointers,Data Structures,Linked List,Nodes,我试图删除双链接列表中的一个节点,但这里的问题是,当我有一个列表:7-6-5-4-3-2-1,并尝试删除3,我得到7-6-5-4-3,我无法找出错误。请帮忙 void RemoveItem(int itm) { if (Head->item == itm) { Head = Head -> Next; cout<<"\nItem is at 1st node & removed\n";flag=
void RemoveItem(int itm)
{
if (Head->item == itm) {
Head = Head -> Next;
cout<<"\nItem is at 1st node & removed\n";flag=1;
}
else if (Head->Next == NULL) {
cout<<" \n This is 1-node list & item not in it\n";
}
else {
node *current, *del = Head;
while(del->Next != NULL && del->item != itm) {
del = del->Next;
}
current = del;
current->Next = del->Next;
del->Next->previous = current;
delete(del);
del->Next = NULL;
flag = 1;
}
}
void removietem(int itm)
{
如果(表头->项目==itm){
头部=头部->下一步;
coutNext;
}
电流=del;
当前->下一步=删除->下一步;
删除->下一步->上一步=当前;
删除(del);
del->Next=NULL;
flag=1;
}
}
要删除迭代到删除节点的节点,请设置:
伪代码:
del.prev.next = del.next
及
这毫无意义:
current = del;
current->Next = del->Next;
因为它和
del->Next = del->Next;
试试这样的
// some global int flag = 0
// some global node* Head pointing to head of list
void RemoveItem(int itm) {
if (Head->item == itm) {
node* del = Head;
Head = Head -> Next;
delete(del);
cout<<"\nItem is at 1st node & removed\n";
flag=1;
return;
}
if (Head->Next == NULL) {
cout<<" \n This is 1-node list & item not in it\n";
return;
}
node* current = Head;
node* del = Head;
while(del->Next != NULL && del->item != itm) {
del = del->Next;
}
// reached with del->Next == NULL || del->item == itm
current = del->previous;
if (del->Next == NULL) {
// at end of list
if (del->item != item) {
// item not found
// todo: signal error
return;
}
current->Next = NULL;
} else {
del->Next->previous = current;
current->Next = del->Next;
}
delete(del);
flag = 1;
}
//某些全局int标志=0
//某些全局节点*头指向列表的头
无效删除项(int itm){
如果(表头->项目==itm){
节点*del=头部;
头部=头部->下一步;
删除(del);
coutNext;
}
//使用del->Next==NULL | | del->item==itm到达
当前=删除->上一个;
如果(删除->下一步==NULL){
//在列表的末尾
如果(删除->项目!=项目){
//找不到项目
//todo:信号错误
返回;
}
当前->下一步=空;
}否则{
删除->下一步->上一步=当前;
当前->下一步=删除->下一步;
}
删除(del);
flag=1;
}
注意:我修复了许多bug,并试图将其保持在您的逻辑范围内。我本来会写得不一样。@AliZahr去掉所有其他的东西,包括将current设置为delete,然后使用这个逻辑。我做过,但现在我进入了无限循环:/while(del->Next!=NULL&&del->item!=itm){del=del->Next;}del->Next->previous=del->->previous;删除->上一个->下一个=删除->下一个;删除(del)@AliZahr外卖&删除->物品!=itm和使用计数器
// some global int flag = 0
// some global node* Head pointing to head of list
void RemoveItem(int itm) {
if (Head->item == itm) {
node* del = Head;
Head = Head -> Next;
delete(del);
cout<<"\nItem is at 1st node & removed\n";
flag=1;
return;
}
if (Head->Next == NULL) {
cout<<" \n This is 1-node list & item not in it\n";
return;
}
node* current = Head;
node* del = Head;
while(del->Next != NULL && del->item != itm) {
del = del->Next;
}
// reached with del->Next == NULL || del->item == itm
current = del->previous;
if (del->Next == NULL) {
// at end of list
if (del->item != item) {
// item not found
// todo: signal error
return;
}
current->Next = NULL;
} else {
del->Next->previous = current;
current->Next = del->Next;
}
delete(del);
flag = 1;
}