需要一些关于C ++中的类的建议,双链表

时间:2016-06-27 02:33:15

标签: c++ list pointers

我试图打印列表中的所有元素,但是输出错误。

代码获得2,0和10,当我调用过程" travel_in"它只显示0,2。

对我的del_start()有一些疑问,它会删除0而不是2 ..

我做错了什么?

使用Cygwin在Windows 64bits中编译

输出

2 0 10 0 2

这是代码

# include < iostream >

# include < stdio.h >
using namespace std;

template <class clali>
class double_list
{
    protected:
        clali node1;
    clali *listad;
public:
    double_list()//constructor
    {
        listad=NULL;
    }
    void insert_strt(clali node1)
    {
        clali *temp;
        temp=new clali;
        *temp=node1;

        //check if list is not empty
        if (listad==NULL)
        {
            listad=temp;
            listad->next=NULL;
            listad->before=NULL;
        }
        else
        {
            temp->next=listad;
            listad->before=temp;
            temp->before=NULL;
            listad=temp;    
        }
    }

    int vertam()
    {
        int res=0;
    clali *temp;
    temp=listad;
    if (temp==NULL)
    {
        cout<<"Empty list!"<<endl;
        res=0;
    }
    else
        while(temp!=NULL)
        {
            res++;
            temp=temp->next;
        }
    return res;
    }


    void insert_mid(clali node1, int pos)
    {
        int i;
        clali *temp,*temp2;
        temp2=new clali;
        temp=listad;
        if(pos<vertam)
    {
        for(i=1;i<pos;i++)
        temp=temp->next;
        *temp2=node1;
        temp2->next=temp->next;
        temp->before=listad;
        temp->next=temp2;

    }
    else
    cout<<"Cant show the data!"<<endl;
    }

    clali del_start()
    {
        clali a,*temp;
        a=*listad;
        temp=listad;
        listad=listad->next;
        delete temp;
        return a;
    }

    void insert_end(clali node1)
    {
        clali *temp,*temp2;
        temp=listad;
    while(temp->next!=NULL)
    {
        temp=temp->next;
    }
    temp2=new clali;
    *temp2=node1;
    temp->next=temp2;
    temp2->before=temp;
    temp2->next=NULL;

    }
    clali  clear_end()
    {
        clali b,*temp,*temp2;
        int j=1;
        temp=listad;
        do
        {
            temp=temp->next;
            cout<<"Element : "<<j<<endl;
            j++;
        }while(temp->next!=NULL);
        b=*temp;
        temp2=temp->before;
        temp2->next=NULL;
       // delete temp;
        return b;
    }
    void travel_in()
    {
        clali *temp;
        temp=listad;
        while(temp->next!=NULL)
        {
        cout<<temp->data<<endl;
        temp=temp->next;
        }
    }


};

struct integer
{
int data;
integer*next,*before;
};
typedef struct integer Integer;
int main()
{
    Integer node;
    node.next=NULL;
    node.before=NULL;
    double_list<Integer>  test_list;

    test_list.insert_strt(node);
    node.data=2;
    cout<<node.data<<endl;
    test_list.insert_end(node);
    node.data=0;
    cout<<node.data<<endl;
    test_list.insert_end(node);
    node.data=10;
    cout<<node.data<<endl;
test_list.del_start();
    test_list.travel_in();

}

2 个答案:

答案 0 :(得分:0)

我至少看到一个明显的错误。初始分析表明listad类成员是指向双向链表中第一个元素的指针。在这种情况下,以下内容显然是错误的(为了易读性而重新格式化,请正确缩进代码):

void insert_mid(clali node1, int pos)
{
    int i;
    clali *temp,*temp2;
    temp2=new clali;

显然,这个类方法的目的是将新节点插入链表的中间。

temp2是新节点。

    temp=listad;

    if(pos<vertam)
    {
        for(i=1;i<pos;i++)
            temp=temp->next;

temp似乎是列表中间的插入位置。

        temp->before=listad;

由于某些不明原因,此代码尝试将列表中间的现有节点的before指针设置为列表的头部。这毫无意义,而且是错误的。

答案 1 :(得分:0)

让我们一步一步地进入main()

当您第一次调用insert_strt()时,参数node具有成员data的垃圾值。因此,Integer的{​​{1}}对象会在data的开头插入test_list。然后分别在列表末尾插入Integer 2和0的data个对象。

稍后,您从clali删除第一个test_list对象,该对象在其data字段中删除具有垃圾值的对象。因此,删除后,您将拥有data值为2的对象,并且列表中的顺序为0。

最后,您使用travel_in()打印列表,但它没有按照您的想法执行。它实际上做的是,如果列表至少有一个元素,那么它将打印列表中除最后一个元素之外的所有元素。如果列表为空,则会导致分段错误(while循环的条件为temp将为NULL)。所以它将打印:2(但你的列表有2和0)。

您可以按如下方式编写travel_in()

void travel_in()
{
  clali *temp = listad;
  while(temp != NULL)
  {
    cout << temp->data << " ";
    temp = temp->next;
  }
  cout << endl;
}

顺便说一下,评论/删除cout函数中的main()语句。他们可能会让你感到困惑。