C++ C+中的分段错误+;在打印链表元素时
请帮忙。当我试图打印此链接列表中的元素时,我遇到了分段错误。 我首先声明一个类和一个函数来插入和显示列表中的元素,这些都是它的函数。 代码:C++ C+中的分段错误+;在打印链表元素时,c++,class,linked-list,singly-linked-list,definition,C++,Class,Linked List,Singly Linked List,Definition,请帮忙。当我试图打印此链接列表中的元素时,我遇到了分段错误。 我首先声明一个类和一个函数来插入和显示列表中的元素,这些都是它的函数。 代码: #包括 使用名称空间std; 结构节点{ int数据; 节点*下一步; }; ll班{ 节点*头,*尾; 公众: 无效推送(整数x){ node*temp=新节点; 温度->数据=x; temp->next=NULL; if(head==NULL){ 压头=温度; 尾=温度; } 否则{ 尾部->下一步=温度; 尾=温度; } } 无效显示(){ 节点*n
#包括
使用名称空间std;
结构节点{
int数据;
节点*下一步;
};
ll班{
节点*头,*尾;
公众:
无效推送(整数x){
node*temp=新节点;
温度->数据=x;
temp->next=NULL;
if(head==NULL){
压头=温度;
尾=温度;
}
否则{
尾部->下一步=温度;
尾=温度;
}
}
无效显示(){
节点*n=头部;
while(n!=NULL){
cout问题是在创建列表时,您没有将head
设置为NULL
。同样的问题也适用于tail
。这是构造函数的工作
class ll {
node *head,*tail;
public:
ll() { head = tail = NULL; }
void push(int x) {
...
数据成员头和数据成员尾都不是由nullptr初始化的,因此程序具有未定义的行为
您可以在类定义中写入
class ll{
node *head = nullptr, *tail = nullptr;
//...
请记住,结构节点应该是类ll
的成员
class ll{
struct node{
int data;
node *next;
} *head = nullptr,*tail = nullptr;
public:
void push( int x ){
node *temp = new node { x, nullptr };
if( head == NULL ){
head = tail = temp;
}
else {
tail = tail->next = temp;
}
}
//...
class ll{
struct node{
int data;
node *next;
} *head,*tail;
public:
ll() : head( nullptr ), tail( nullptr ) {}
// ...
class ll{
struct node{
int data;
node *next;
} *head,*tail;
public:
ll() : head( nullptr ), tail( nullptr ) {}
~ll() { /* must be defined */ }
ll( const LL & ) = delete;
ll & operator =( const ll & ) = delete;
// ...
您可以在默认构造函数中初始化数据成员,而不是在类定义中初始化数据成员,例如
class ll{
struct node{
int data;
node *next;
} *head = nullptr,*tail = nullptr;
public:
void push( int x ){
node *temp = new node { x, nullptr };
if( head == NULL ){
head = tail = temp;
}
else {
tail = tail->next = temp;
}
}
//...
class ll{
struct node{
int data;
node *next;
} *head,*tail;
public:
ll() : head( nullptr ), tail( nullptr ) {}
// ...
class ll{
struct node{
int data;
node *next;
} *head,*tail;
public:
ll() : head( nullptr ), tail( nullptr ) {}
~ll() { /* must be defined */ }
ll( const LL & ) = delete;
ll & operator =( const ll & ) = delete;
// ...
另外,您至少需要定义析构函数,或者显式定义复制构造函数和复制赋值构造函数,或者将它们定义为已删除
class ll{
struct node{
int data;
node *next;
} *head = nullptr,*tail = nullptr;
public:
void push( int x ){
node *temp = new node { x, nullptr };
if( head == NULL ){
head = tail = temp;
}
else {
tail = tail->next = temp;
}
}
//...
class ll{
struct node{
int data;
node *next;
} *head,*tail;
public:
ll() : head( nullptr ), tail( nullptr ) {}
// ...
class ll{
struct node{
int data;
node *next;
} *head,*tail;
public:
ll() : head( nullptr ), tail( nullptr ) {}
~ll() { /* must be defined */ }
ll( const LL & ) = delete;
ll & operator =( const ll & ) = delete;
// ...
<代码>节点*>;< /COD>不会初始化头到空。有时C++实现将是零变量,但这是不应该依赖的特性。在C++中使用<代码> null <代码>是不好的实践,这也不使用初始化列表,并且它将更为透明。values@LonesomeParadiseOP使用了NULL
和needs首先要了解构造函数,初始化列表将在稍后介绍。我在这个网站上的理念是,对于完全初学者,最好一次只关注一件事。@john Ok,但OP在他们的代码中实际上没有使用构造函数,因此这两者都引入了他们可能不熟悉的东西(构造函数)并展示了一种使用它们的方法,这是一种不好的做法,也是无效的