C++ 循环双链表-分段错误

C++ 循环双链表-分段错误,c++,list,doubly-linked-list,C++,List,Doubly Linked List,编辑: 好的,我已经解决并完成了我所有的原始问题。然而,现在,我在List.cpp的第54行gotoLast上发现了一个分段错误,我似乎无法理解为什么会出现分段错误 List.h: #ifndef _list_h #define _list_h struct ListNode { int data; int rank; ListNode *prev, *next; // ListNode (int x = 0, ListNode *n, ListNode *p); }; class L

编辑:
好的,我已经解决并完成了我所有的原始问题。然而,现在,我在List.cpp的第54行gotoLast上发现了一个分段错误,我似乎无法理解为什么会出现分段错误

List.h:

#ifndef _list_h
#define _list_h

struct ListNode
{
 int data;
 int rank;
 ListNode *prev, *next;
// ListNode (int x = 0, ListNode *n, ListNode *p);
};

class List {
private:
    ListNode *current;
    ListNode *head;
    ListNode *temp;
public:

    List( );
    int size( );
    int currentValue( );
    int currentRank( );
    void gotoFirst( );
    void gotoLast( );
    void retreat( );
    void advance( );
    void gotoRank(int r);
    bool isNull( );
    bool isFirst( );
    bool isLast( );
    void insertFirst(int x);
    void insertLast(int x);
    void insertBefore(int x);
    void insertAfter(int x);
    void replace(int x);
    int removeFirst( );
    int removeLast( );
    int remove( );
    int removeAndRetreat( );
    int removeAndAdvance( );
    void display( );
};

#endif
#include <iostream>
using namespace std;

#include "List.h"
int ncounter = 0;
int rank = 0;
/*ListNode (int x = 0, ListNode *n, ListNode *p)
{
    data = x;
    next = n;
    prev = p;
}
*/

List::List( )
{
  //ListNode *head;
  //ListNode *temp;
  //ListNode *current;  
  head = NULL;
  current = NULL;
  temp = NULL;


 return;
}
int List::size( ) 
{
 return ncounter; 
}
int List::currentValue( )
{ 
 int v;
 if( current == NULL)
 {
     return 0;
 }
 else
 {
    v = current -> data;
     return v;
 } 

}
int List::currentRank( ) 
{
    return rank;
}
void List::gotoFirst( ) 
{   
 current = head;
 rank = 0;
}
void List::gotoLast( ) 
{   
 current = head -> prev;
 rank = ncounter-1;
}
void List::retreat( ) 
{
    current = current -> prev;
}
void List::advance( ) 
{ 
    current = current -> next;
}
void List::gotoRank(int r) 
{ 
    current = head;
    for ( int i=0; i != r; i++)
    {
        current = current -> next;
    }
    rank = r;
}
bool List::isNull( ) 
{ 
 if ( current == NULL)
    return true;
 else
    return false; 
}
bool List::isFirst( ) 
{ 
 if ( current == head)
 {
     return true; 
 }
 else
 {
     return false;
 }

}
bool List::isLast( )
{
 if ( current == head -> prev)
 {

     return true;
 }
 else 
 {
     return false; 
 }
}
void List::insertFirst(int x) 
{ 
    if ( head == NULL)
    {
        head = new ListNode;
        head -> data =  x;
        head -> next = head;
        head -> prev = head;
        ncounter++;
        rank = 0;
    }
    else
    {
        ListNode *temp = new ListNode;
        temp -> data = x;
        temp -> next = head;
        temp -> prev = head -> prev;
        head -> prev -> next= temp;
        head -> prev = temp;
        head = temp;
        rank++;
        ncounter++;
    }
}
void List::insertLast(int x)
{
    if (head == NULL)
    {
        head = new ListNode;
        head -> data = x;
        head -> next = head;
        head -> prev = head;
    }
    else
    {
        ListNode *temp = new ListNode;
        temp -> data = x;
        temp -> next = head;
        temp -> prev = head -> prev;
        head -> prev -> next = temp;
        head -> prev = temp;
        ncounter++;
    }   
}
void List::insertBefore(int x)
{ 
    ListNode *temp = new ListNode;
    temp -> data = x;
    temp -> next = current;
    temp -> prev = current -> prev;
    current -> prev -> next = temp;
    current -> prev = temp;
    rank++;
    ncounter++;
}
void List::insertAfter(int x)
{
    ListNode *temp = new ListNode;
    temp -> data = x;
    temp -> next = current -> next;
    current -> next -> prev = temp;
    current ->next = temp;
    temp -> prev = current;
    ncounter++;
}
void List::replace(int x)
{ 
    current -> data = x;
}
int List::removeFirst( )
{
    int tempx;
    if( current == head)
    {
        current = NULL;
    }
    if(head->next == head)
        {   tempx = head ->data;
        head = NULL;
        return tempx;
    }
    else
    {
        ListNode *temp = head;
        tempx = temp -> data;
        head = head ->next;
        temp -> prev -> next = head;
        head -> prev = temp -> prev;
        delete temp;
        ncounter--;
        rank--;
        return tempx; 
    }
}
int List::removeLast( )
{
    int tempx;
    if ( current == head -> prev)
    {
        current = NULL;
    }
    if(head->prev == head)
        {   tempx = head ->data;
        head = NULL;
        return tempx;
    }
    else
    {
        ListNode *temp = head -> prev;
        tempx = temp -> data;
        temp -> prev -> next = head;
        head -> prev = temp -> prev;
        delete temp;
        ncounter--;
        return tempx;
    }
}
int List::remove( ) 
{   
    int tempx;
    if(head->next == head)
        {   
        tempx = head -> data;
        head = NULL;
        return tempx;
    }
    else
    {
        ListNode *temp = current;
        tempx = current -> data;
        temp -> prev -> next = temp -> next;
        temp -> next -> prev = temp -> prev;
        current = NULL;
        delete temp;
        ncounter--;
        rank=0;
        return tempx;
    }
}
int List::removeAndRetreat( ) 
{
    ListNode *temp;
    int tempx;
    temp = current;
    current -> prev -> next = current -> next;
    current -> next -> prev = current -> prev;
    tempx = current -> data;
    current = current -> prev;
    delete temp;
    ncounter--;
    rank--;
        return tempx; 
}
int List::removeAndAdvance( ) 
{
    ListNode *temp;
    int tempx;
    temp = current;
    current -> prev -> next = current -> next;
    current -> next -> prev = current -> prev;
    tempx = current -> data;
    current = current -> next;
    delete temp;
    ncounter--;

    return tempx;  
}
void List::display( )
{ 
    if(head == NULL )
        cout <<"[ ]" << endl;
    else
    {   
        ListNode *temp = head;
        cout << "[ ";
        for ( int i = 0; i < ncounter; i++)
        {
            if (temp == current)
            {
                cout << "( " << current -> data << ") ";
            }
            else
            {   
                cout << temp -> data << " ";
                temp = temp -> next;

            }
        }
        cout << " ]";

     }
和我的列表。cpp:

#ifndef _list_h
#define _list_h

struct ListNode
{
 int data;
 int rank;
 ListNode *prev, *next;
// ListNode (int x = 0, ListNode *n, ListNode *p);
};

class List {
private:
    ListNode *current;
    ListNode *head;
    ListNode *temp;
public:

    List( );
    int size( );
    int currentValue( );
    int currentRank( );
    void gotoFirst( );
    void gotoLast( );
    void retreat( );
    void advance( );
    void gotoRank(int r);
    bool isNull( );
    bool isFirst( );
    bool isLast( );
    void insertFirst(int x);
    void insertLast(int x);
    void insertBefore(int x);
    void insertAfter(int x);
    void replace(int x);
    int removeFirst( );
    int removeLast( );
    int remove( );
    int removeAndRetreat( );
    int removeAndAdvance( );
    void display( );
};

#endif
#include <iostream>
using namespace std;

#include "List.h"
int ncounter = 0;
int rank = 0;
/*ListNode (int x = 0, ListNode *n, ListNode *p)
{
    data = x;
    next = n;
    prev = p;
}
*/

List::List( )
{
  //ListNode *head;
  //ListNode *temp;
  //ListNode *current;  
  head = NULL;
  current = NULL;
  temp = NULL;


 return;
}
int List::size( ) 
{
 return ncounter; 
}
int List::currentValue( )
{ 
 int v;
 if( current == NULL)
 {
     return 0;
 }
 else
 {
    v = current -> data;
     return v;
 } 

}
int List::currentRank( ) 
{
    return rank;
}
void List::gotoFirst( ) 
{   
 current = head;
 rank = 0;
}
void List::gotoLast( ) 
{   
 current = head -> prev;
 rank = ncounter-1;
}
void List::retreat( ) 
{
    current = current -> prev;
}
void List::advance( ) 
{ 
    current = current -> next;
}
void List::gotoRank(int r) 
{ 
    current = head;
    for ( int i=0; i != r; i++)
    {
        current = current -> next;
    }
    rank = r;
}
bool List::isNull( ) 
{ 
 if ( current == NULL)
    return true;
 else
    return false; 
}
bool List::isFirst( ) 
{ 
 if ( current == head)
 {
     return true; 
 }
 else
 {
     return false;
 }

}
bool List::isLast( )
{
 if ( current == head -> prev)
 {

     return true;
 }
 else 
 {
     return false; 
 }
}
void List::insertFirst(int x) 
{ 
    if ( head == NULL)
    {
        head = new ListNode;
        head -> data =  x;
        head -> next = head;
        head -> prev = head;
        ncounter++;
        rank = 0;
    }
    else
    {
        ListNode *temp = new ListNode;
        temp -> data = x;
        temp -> next = head;
        temp -> prev = head -> prev;
        head -> prev -> next= temp;
        head -> prev = temp;
        head = temp;
        rank++;
        ncounter++;
    }
}
void List::insertLast(int x)
{
    if (head == NULL)
    {
        head = new ListNode;
        head -> data = x;
        head -> next = head;
        head -> prev = head;
    }
    else
    {
        ListNode *temp = new ListNode;
        temp -> data = x;
        temp -> next = head;
        temp -> prev = head -> prev;
        head -> prev -> next = temp;
        head -> prev = temp;
        ncounter++;
    }   
}
void List::insertBefore(int x)
{ 
    ListNode *temp = new ListNode;
    temp -> data = x;
    temp -> next = current;
    temp -> prev = current -> prev;
    current -> prev -> next = temp;
    current -> prev = temp;
    rank++;
    ncounter++;
}
void List::insertAfter(int x)
{
    ListNode *temp = new ListNode;
    temp -> data = x;
    temp -> next = current -> next;
    current -> next -> prev = temp;
    current ->next = temp;
    temp -> prev = current;
    ncounter++;
}
void List::replace(int x)
{ 
    current -> data = x;
}
int List::removeFirst( )
{
    int tempx;
    if( current == head)
    {
        current = NULL;
    }
    if(head->next == head)
        {   tempx = head ->data;
        head = NULL;
        return tempx;
    }
    else
    {
        ListNode *temp = head;
        tempx = temp -> data;
        head = head ->next;
        temp -> prev -> next = head;
        head -> prev = temp -> prev;
        delete temp;
        ncounter--;
        rank--;
        return tempx; 
    }
}
int List::removeLast( )
{
    int tempx;
    if ( current == head -> prev)
    {
        current = NULL;
    }
    if(head->prev == head)
        {   tempx = head ->data;
        head = NULL;
        return tempx;
    }
    else
    {
        ListNode *temp = head -> prev;
        tempx = temp -> data;
        temp -> prev -> next = head;
        head -> prev = temp -> prev;
        delete temp;
        ncounter--;
        return tempx;
    }
}
int List::remove( ) 
{   
    int tempx;
    if(head->next == head)
        {   
        tempx = head -> data;
        head = NULL;
        return tempx;
    }
    else
    {
        ListNode *temp = current;
        tempx = current -> data;
        temp -> prev -> next = temp -> next;
        temp -> next -> prev = temp -> prev;
        current = NULL;
        delete temp;
        ncounter--;
        rank=0;
        return tempx;
    }
}
int List::removeAndRetreat( ) 
{
    ListNode *temp;
    int tempx;
    temp = current;
    current -> prev -> next = current -> next;
    current -> next -> prev = current -> prev;
    tempx = current -> data;
    current = current -> prev;
    delete temp;
    ncounter--;
    rank--;
        return tempx; 
}
int List::removeAndAdvance( ) 
{
    ListNode *temp;
    int tempx;
    temp = current;
    current -> prev -> next = current -> next;
    current -> next -> prev = current -> prev;
    tempx = current -> data;
    current = current -> next;
    delete temp;
    ncounter--;

    return tempx;  
}
void List::display( )
{ 
    if(head == NULL )
        cout <<"[ ]" << endl;
    else
    {   
        ListNode *temp = head;
        cout << "[ ";
        for ( int i = 0; i < ncounter; i++)
        {
            if (temp == current)
            {
                cout << "( " << current -> data << ") ";
            }
            else
            {   
                cout << temp -> data << " ";
                temp = temp -> next;

            }
        }
        cout << " ]";

     }
#包括
使用名称空间std;
#包括“List.h”
int n计数器=0;
int秩=0;
/*ListNode(int x=0,ListNode*n,ListNode*p)
{
数据=x;
next=n;
prev=p;
}
*/
列表::列表()
{
//ListNode*头;
//ListNode*temp;
//ListNode*当前;
head=NULL;
电流=零;
温度=零;
返回;
}
int List::size()
{
返回计数器;
}
int List::currentValue()
{ 
INTV;
如果(当前==NULL)
{
返回0;
}
其他的
{
v=当前->数据;
返回v;
} 
}
int List::currentRank()
{
返回等级;
}
无效列表::gotoFirst()
{   
电流=水头;
秩=0;
}
无效列表::gotoLast()
{   
当前=头->上一个;
秩=n计数器-1;
}
无效列表::撤退()
{
当前=当前->上一个;
}
无效列表::高级()
{ 
当前=当前->下一步;
}
无效列表::gotoRank(int r)
{ 
电流=水头;
for(int i=0;i!=r;i++)
{
当前=当前->下一步;
}
秩=r;
}
bool列表::isNull()
{ 
如果(当前==NULL)
返回true;
其他的
返回false;
}
bool列表::isFirst()
{ 
如果(当前==水头)
{
返回true;
}
其他的
{
返回false;
}
}
bool列表::isLast()
{
如果(当前==头部->上一个)
{
返回true;
}
其他的
{
返回false;
}
}
void List::insertFirst(int x)
{ 
if(head==NULL)
{
head=新列表节点;
头部->数据=x;
头部->下一步=头部;
头部->上一个=头部;
ncounter++;
秩=0;
}
其他的
{
ListNode*temp=新ListNode;
温度->数据=x;
温度->下一步=头部;
温度->上一个=压头->上一个;
头部->上一个->下一个=温度;
压头->上一个=温度;
压头=温度;
排名++;
ncounter++;
}
}
void List::insertLast(int x)
{
if(head==NULL)
{
head=新列表节点;
头部->数据=x;
头部->下一步=头部;
头部->上一个=头部;
}
其他的
{
ListNode*temp=新ListNode;
温度->数据=x;
温度->下一步=头部;
温度->上一个=压头->上一个;
头部->上一个->下一个=温度;
压头->上一个=温度;
ncounter++;
}   
}
void List::insertBefore(int x)
{ 
ListNode*temp=新ListNode;
温度->数据=x;
温度->下一步=当前;
临时->上一个=当前->上一个;
当前->上一个->下一个=温度;
当前->上一个=温度;
排名++;
ncounter++;
}
无效列表::insertAfter(int x)
{
ListNode*temp=新ListNode;
温度->数据=x;
临时->下一步=当前->下一步;
当前->下一个->上一个=温度;
当前->下一步=温度;
温度->上一个=当前;
ncounter++;
}
无效列表::替换(int x)
{ 
当前->数据=x;
}
int List::removeFirst()
{
int-tempx;
如果(当前==水头)
{
电流=零;
}
如果(头部->下一步==头部)
{tempx=head->data;
head=NULL;
返回tempx;
}
其他的
{
ListNode*temp=头部;
tempx=temp->data;
头部=头部->下一步;
临时->上一个->下一个=头部;
压头->上一个=温度->上一个;
删除临时文件;
计数器--;
排名--;
返回tempx;
}
}
int List::removeLast()
{
int-tempx;
如果(当前==头部->上一个)
{
电流=零;
}
如果(头->上一个==头)
{tempx=head->data;
head=NULL;
返回tempx;
}
其他的
{
ListNode*temp=head->prev;
tempx=temp->data;
临时->上一个->下一个=头部;
压头->上一个=温度->上一个;
删除临时文件;
计数器--;
返回tempx;
}
}
int List::remove()
{   
int-tempx;
如果(头部->下一步==头部)
{   
tempx=头部->数据;
head=NULL;
返回tempx;
}
其他的
{
ListNode*temp=当前;
tempx=当前->数据;
临时->上一个->下一个=临时->下一个;
临时->下一步->上一步=临时->上一步;
电流=零;
删除临时文件;
计数器--;
秩=0;
返回tempx;
}
}
int List::removeAndRetreat()
{
ListNode*temp;
int-tempx;
温度=电流;
当前->上一个->下一个=当前->下一个;
当前->下一个->上一个=当前->上一个;
tempx=当前->数据;
当前=当前->上一个;
删除临时文件;
计数器--;
排名--;
返回tempx;
}
int List::removeandvance()
{
ListNode*temp;
int-tempx;
温度=电流;
当前->上一个->下一个=当前->下一个;
当前->下一个->上一个=当前->上一个;
tempx=当前->数据;
当前=当前->下一步;
删除临时文件;
计数器--;
返回tempx;
}
无效列表::显示()
{ 
if(head==NULL)

coutinsertLast代码在CDDL中实际上要简单得多。您只需在第一个节点之前插入,因为这也是最后一个节点。

那么,看看我的insertFirst代码(如果正确的话),insertLast的代码是否相同?或者我是否遗漏了什么?@Sameer'Circular'链接列表应该意味着您的头节点和尾节点是同一个节点