我试图在双向链表的末尾插入一个值,我成功地在头部或第一个节点插入值但第二个值没有插入
这里的问题是输入第二个值
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;
}
答案 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;
}