C++ 分段故障通用双链表

C++ 分段故障通用双链表,c++,data-structures,segmentation-fault,C++,Data Structures,Segmentation Fault,我正在尝试实现一个通用的双链接列表。添加节点作为头部的成员函数给出分段错误(核心转储)。我认为错误在“d_list.h”中add_u..head()函数的else块中。 我想不出错误在哪里 问题:如何在代码中发现分段错误 d_list.h \ifndef节点 #定义节点 #包括 #包括“node.h” 样板 d类清单{ 私人: 内部l_尺寸; 节点*头; 节点*尾部; 公众: //默认构造函数 d_列表(){ 水头=零PTR; tail=nullptr; } Node*gethead(){ret

我正在尝试实现一个通用的双链接列表。添加节点作为头部的成员函数给出分段错误(核心转储)。我认为错误在“d_list.h”中add_u..head()函数的else块中。 我想不出错误在哪里

问题:如何在代码中发现分段错误

d_list.h

\ifndef节点
#定义节点
#包括
#包括“node.h”
样板
d类清单{
私人:
内部l_尺寸;
节点*头;
节点*尾部;
公众:
//默认构造函数
d_列表(){
水头=零PTR;
tail=nullptr;
}
Node*gethead(){return head;}
Node*gettail(){return tail;}
int get_list_size(){
返回此->l_大小;
}
无效添加节点作为头(T数据){
节点*当前_节点=新节点(数据);
如果(此->头部=空PTR){
此->头部=当前_节点;
此->尾=当前_节点;
当前_节点->下一步=nullptr;
当前_节点->上一个=nullptr;
此->l_大小=l_大小+1;
}否则,如果(此->头部!=nullptr){
此->头部->上一个=当前_节点;
当前_节点->上一个=nullptr;
此->头部=当前_节点;
此->l_大小=l_大小+1;
}
}
void removefromfront(){
节点*温度=此->头部;
本->头=本->头->下一步;
此->l_size=l_size-1;
}
};
#恩迪夫
node.h

模板
类节点{
私人:
T数据;
公众:
节点*先前;
节点*下一步;
Node()=默认值;
节点(T m_数据){
数据=m_数据;
先前=空PTR;
next=nullptr;
};
};
main.cpp

#包括
#包括“d_list.h”
使用名称空间std;
int main(){
d_名单d1;

cout在add_node_as_head函数中,您正在使用赋值运算符(this->head=nullptr)


相反,您应该使用等于运算符(this->head==nullptr)。

您是否尝试过使用调试器检查它?@BigTemp是的,编辑了我的问题我缺少了“==”运算符。我添加了一个名为removefromfront()的新函数但在移除打印头后,打印头返回0。我还更新了d_list.h。更新的代码请在d_list.h中查找函数removefront()
    #ifndef NODE_H
    #define NODE_H
    
    
    #include<iostream>
    #include "node.h"
    template<class T>
    class d_list{
        private:
          int l_size;
          Node<T>* head;
          Node<T>* tail;
    
        public:
           //default constructor
           d_list(){
              head=nullptr;
              tail=nullptr;
           }
           
           Node<T>* gethead(){return head;}
           Node<T>* gettail(){return tail;}
           
           int get_list_size(){
              return this->l_size;
           }
    
           void add_node_as_head(T data){
              Node<T>* current_node= new Node<T>(data);
              if(this->head=nullptr){
                 
                 this->head=current_node;
                 this->tail=current_node;
                 current_node->next=nullptr;
                 current_node->previous=nullptr;
                 this->l_size=l_size+1;
                 
           }else if(this->head!=nullptr){
               
               this->head->previous=current_node;
               
               current_node->previous=nullptr;
               this->head=current_node;
               this->l_size=l_size+1;
               
           }
       }
  void removefromfront(){
     Node<T>* temp = this->head;
     this->head=this->head->next;
    
     this->l_size= l_size-1;
  }
    };
    
    #endif
template<class T>
class Node{
  private:
     
     T data;
  public:
     Node<T>* previous;
     Node<T>* next;
     Node()=default;
     Node(T m_data){
        data=m_data;
        previous=nullptr;
        next=nullptr;
     };
     

};
    #include<iostream>
#include "d_list.h"
using namespace std;

int main(){

   d_list<int> d1;

   cout<<d1.gethead()<<"Head Initially";
   cout<<"\n";
   d1.add_node_as_head(5);
   cout<<d1.gethead()<<"Head after adding 1st element\n";
   cout<<d1.gettail()<<"Tail after adding 1st element\n";

   d1.add_node_as_head(6);
   cout<<d1.gethead()<<"Head after adding 2nd element\n";
   cout<<d1.gettail()<<"Tail after adding 2nd element\n";
   
   d1.add_node_as_tail(7);
   cout<<d1.gethead()<<"Head after adding element as Tail\n";
   cout<<d1.gettail()<<"Tail after adding element as Tail\n";

   cout<<d1.get_list_size()<<"Size after adding three elements\n";
   d1.removefromfront();
   cout<<d1.gethead()<<"Head After Removing from front\n";
   cout<<d1.gettail()<<"Tail After Removing from front \n";

   cout<<d1.get_list_size()<<"\n";
    return 0;
}
Thread 1 received signal SIGSEGV, Segmentation fault.
0x000000000041598e in d_list<int>::add_node_as_head (this=0x7bfe30, data=5) at d_list.h:40
40      nullptr){
(gdb)