在双向链表中最后添加或插入

时间:2012-02-26 14:21:18

标签: c++ pointers linked-list doubly-linked-list

我试图在双向链表的末尾插入一个值,我成功地在头部或第一个节点插入值但第二个值没有插入

这里的问题是输入第二个值

class d_list
{
private:

    struct node
    {
        double data;
        node *next;
        node *previous;
    };

    node *first;
    node *last ;
public:
    d_list(void)
    {
        first = nullptr;
        last = nullptr;
    };
    void append(double);

};

void d_list::append(double num)
{
    node *ptr;
    node *toinsert;
    if(!first)
    {
        first = new node;
        first->previous= nullptr;
        first->data = num;
        last= new node;
        first->next= last->previous;
        last->previous = first->next;
        last->next= nullptr;

    }
    else
    {
        if(last->next == nullptr)
        {
            ptr = new node;
            ptr->next =last->previous;
            ptr->data=num;
            last->previous = ptr->next  ;
        }


        last->next= nullptr;
    }

}


int _tmain(int argc, _TCHAR* argv[])
{
    d_list aa;
    cout<<"going to append first"<<endl;
    aa.append(44);
    cout<<"going to append second"<<endl;
    aa.append(50.5);

    return 0;
}

5 个答案:

答案 0 :(得分:2)

...
if(last->next == nullptr)
{
  ptr = new node;
  ptr->next =last->previous; // <- is not correct
  ptr->data=num;
  last->previous = ptr->next  ; // <- does not do anything useful
  ...

您不会将新节点附加到列表中。

...
if(!last->next)
{
  ptr = new node;
  ptr->previous=last->previous;
  ptr->next =last;
  ptr->data=num;
  last->previous = ptr  ;
  ...

应该更好。顺便说一下:在析构函数中删除已分配的内存!

答案 1 :(得分:2)

我会在下面的代码中写下你的双链表:

    #include <iostream>
    using namespace std;
    class d_list
    {
    private:

        struct node
        {
            double data;
            node *next;
            node *previous;
        };

        node *first;
        // node *last ; no need for bidirectional list
    public:
        d_list(void)
        {
            first = nullptr;
            //last = nullptr;
        };
        void append(double);

    };

    void d_list::append(double num)
    {
        node *ptr = new node;
        ptr->data = num;
        node *toinsert;
        if(!first)
        {
            first = ptr;
            first->previous=first->next=first;
        }
        else
        {
            if(first->next == first)
            {
                ptr->next = ptr->previous = first;
                first->next = first->previous = ptr;
            }
            else{
                node *last = first->previous;
                ptr->next = first;
                ptr->previous = last;
                last->next = ptr;
                first->previous = ptr;
            }
        }
    }


    int _tmain(int argc, _TCHAR* argv[])
    {
        d_list aa;
        cout<<"going to append first"<<endl;
        aa.append(44);
        cout<<"going to append second"<<endl;
        aa.append(50.5);

        return 0;
    }

答案 2 :(得分:2)

您的代码中存在许多问题:

  • 您的node下一个和上一个成员从未在任何地方初始化,因此在使用时未定义。将构造函数添加到node或确保在分配后初始化它们。
  • 向空列表添加节点不正确。 first->next未定义,为什么要创建两个节点,包括第一个节点和最后一个节点?在包含一个元素的列表中first == last。第一个/最后一个的下一个/上一个的设置也没有任何意义。
  • 在格式良好的双链表中,last->next应始终为空,first->previous也应如此。
  • 将节点添加到非空列表中也是错误的。
  • 虽然你没有在示例中显示它,但你最终还是需要一个析构函数以及一个复制操作符和复制构造函数(三个规则)。目前你正在泄漏内存,如果你试图删除节点,你可能会导致双重免费崩溃。

我建议从代码中退一步,以确保您正确理解双向链表背后的概念。使用next / prev箭头在纸上绘制一个列表,看看在将节点添加到空/非空列表时如何更改它们以及如何删除和移动节点。一旦你弄清楚应该如何设置next / prev,那么将其转换为代码应该相对简单。

编辑以回答评论: 要添加新节点,您可以在技术上将其添加到任何位置,但通常会在最后添加(至少从我看到的内容)。有关在空和非空列表中添加新节点的完整且正确的代码,请参阅其他答案。

答案 3 :(得分:1)

如果您不使用声明,为什么要插入声明node *ptr;node *toinsert;?此外,显而易见的是,如果在末尾插入单个节点,则只应创建一个新元素(如果first为null,则调用new两次)。

答案 4 :(得分:1)

试试这段代码......

class d_list 
{


private:
      struct node
      {
         double data;
         node *next;
         node *previous;
     };
      node *first;
     node *last ;

 public:
     d_list(void)
     {
         first = nullptr;
         last = nullptr;
     };

     void append(double);
  }; 

 void d_list::append(double num)
 {
     node *ptr;
     node *toinsert;
     if(!first)
     {
         first = last = new node;
         first->previous= nullptr;
         first->next = nullptr;
         first->data = num;
     }
     else
     {
             ptr = new node;
             ptr->next =last->previous;
             ptr->data=num;
             last->previous = ptr->next  ;
     }
  }


 int _tmain(int argc, _TCHAR* argv[])
 {
     d_list aa;
     cout<<"going to append first"<<endl;
     aa.append(44);
     cout<<"going to append second"<<endl;
     aa.append(50.5);
      return 0;
 } 
相关问题