Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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++ 如何正确删除双链表中的节点? void SinglyLinkedList::removeBike(int c) { 节点*电流=头部; 对于(int i=0;i下一步; } 如果(当前->下一步!=NULL&当前->上一步!=NULL){ 当前->上一个->下一个=当前->下一个; 当前->下一个->上一个=当前->上一个; 删除当前;//删除节点 } else if(当前->下一步==NULL){ 当前->上一个->下一个=当前; 删除当前文件; } else if(当前->上一个==NULL){ 当前->下一个->上一个=当前; 删除当前文件; } 其他的 不,绝对不是那么简单_C++_List_Pointers_Nodes - Fatal编程技术网

C++ 如何正确删除双链表中的节点? void SinglyLinkedList::removeBike(int c) { 节点*电流=头部; 对于(int i=0;i下一步; } 如果(当前->下一步!=NULL&当前->上一步!=NULL){ 当前->上一个->下一个=当前->下一个; 当前->下一个->上一个=当前->上一个; 删除当前;//删除节点 } else if(当前->下一步==NULL){ 当前->上一个->下一个=当前; 删除当前文件; } else if(当前->上一个==NULL){ 当前->下一个->上一个=当前; 删除当前文件; } 其他的 不,绝对不是那么简单

C++ 如何正确删除双链表中的节点? void SinglyLinkedList::removeBike(int c) { 节点*电流=头部; 对于(int i=0;i下一步; } 如果(当前->下一步!=NULL&当前->上一步!=NULL){ 当前->上一个->下一个=当前->下一个; 当前->下一个->上一个=当前->上一个; 删除当前;//删除节点 } else if(当前->下一步==NULL){ 当前->上一个->下一个=当前; 删除当前文件; } else if(当前->上一个==NULL){ 当前->下一个->上一个=当前; 删除当前文件; } 其他的 不,绝对不是那么简单,c++,list,pointers,nodes,C++,List,Pointers,Nodes,首先,如果c参数超过了列表的大小,那么当当前指针命中最后一个节点上的空指针并经过它时,您将使用空指针取消引用 然后,如果c为0或列表中最后一个元素的索引,则它的prev或next指针相应地将为null,并且您还将使用null指针取消引用 void SinglyLinkedList::removeBike(int c) { Node* current = head; for(int i = 0; i < c; i++){ // traverse to desir

首先,如果
c
参数超过了列表的大小,那么当当前
指针命中最后一个节点上的空指针并经过它时,您将使用空指针取消引用

然后,如果
c
为0或列表中最后一个元素的索引,则它的
prev
next
指针相应地将为null,并且您还将使用null指针取消引用

void SinglyLinkedList::removeBike(int c)
{
   Node* current = head;

   for(int i = 0; i < c; i++){         // traverse to desired node
       current = current -> next;
   } 

   if(current -> next != NULL && current -> prev != NULL){
        current -> prev -> next = current -> next;
        current -> next -> prev = current -> prev;
        delete current;                     //delete node
   }
   else if(current -> next == NULL){
      current -> prev -> next = current;
      delete current;
   }
   else if(current -> prev == NULL){
       current -> next -> prev = current;
       delete current;
   }    
   else 
       cout << "How did you make it this far?";

}
如果
current
是列表中的第一个元素,
current->prev
将明显为空。如果
current
是列表中的最后一个元素,
current->next
将明显为空。猜猜当您尝试取消引用空指针时会发生什么

结论:

A) 检查函数的输入参数是否有效

B) 当要删除的节点是双链接列表中的第一个或最后一个节点时,提供特殊处理

编辑:根据流行的请求,有人想知道我将如何解决此问题:

current -> prev -> next = current -> next;
current -> next -> prev = current -> prev;
void SinglyLinkedList::removeBike(int c)
{
节点*电流=头部;
对于(int i=0;i下一步;
} 
如果(!当前)
return;//或者抛出异常。或者返回bool false,可能是。
如果(当前->上一个)
当前->上一个->下一个=当前->下一个;
其他的
头部=当前->下一步;
如果(当前->下一步)
当前->下一个->上一个=当前->上一个;
其他的
tail=current->prev;//假设这附近有一条尾巴。。。
删除当前;//删除节点
//也许“返回真实”;这里。。。
}

我所见过的计算链表的最佳方法是在一张纸上画出节点,然后一步一步地画出链接中所需的所有更改。
for(int I=0;I
应该是
for(int I=0;I
&¤t!=NULL对我来说效果更好……然后,在循环结束后,当你遇到NULL电流时,你必须弄清楚该怎么办。@Josh停止编辑你的问题,尝试修复代码。不要创建使当前答案无效的移动目标。这没有用。在第一行的第一行,它会打断我语句。完成编辑。啊,不知道我是怎么搞砸的。我甚至没有想到第一个或最后一个是想要的。哇。感谢你的输入!如果我做了之后还有其他问题,我会编辑的。不,不需要记下这个。这是一个有效的问题。@SamVarshavchik一个完全固定的
SingleLinkedList的代码示例::removeBike()
函数至少会很好。“根据流行的请求”到目前为止我还没有意识到我是一个如此受欢迎的人:-P,但是THX。尽管挑剔
//可能是“return true”;这里…
函数返回类型实际上是
void
。@πάνταῥεῖ 我认为
返回true
是一个建议,您将更改函数签名。我也同意,很高兴知道它是否已被删除。
void SinglyLinkedList::removeBike(int c)
{
   Node* current = head;

   for(int i = 0; i < c; i++){
       if (!current)
           break;
       current = current -> next;
   } 

   if (!current)
           return; // Or throw an exception. Or return a bool false, maybe.

   if (current->prev)
       current -> prev -> next = current -> next;
   else
       head=current->next;

   if (current->next)
       current -> next -> prev = current -> prev;
   else
       tail=current->prev;  // Assuming that there's a tail, somewhere around here...
   delete current;                      //delete node

   // Maybe "return true;" here...
}