Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 双链接列表:删除节点_C++_Pointers_Data Structures_Linked List_Nodes - Fatal编程技术网

C++ 双链接列表:删除节点

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=

我试图删除双链接列表中的一个节点,但这里的问题是,当我有一个列表: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=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;
 }