C++ C++;双链表打印

C++ C++;双链表打印,c++,doubly-linked-list,C++,Doubly Linked List,我在学习双链表课程时遇到了一些困难,这是我大学项目的一部分。该类的代码如下所示: class container { public: class node { public: node * prev; node * next; int value; }; container(int v); node *start; // first element of the list node *finish; //

我在学习双链表课程时遇到了一些困难,这是我大学项目的一部分。该类的代码如下所示:

class container
{
public:
    class node
    {
        public:
        node * prev;
        node * next;
        int value;
    };

container(int v);

node *start; // first element of the list
node *finish; // last element of the list
void insert_start(node *start, int val);
void print_container(); 
}
void container::print_container()
{
    node *tmp;
    tmp = start;
    while(tmp!=nullptr)
    {
        cout << tmp->value << endl;
        tmp=tmp->next;
    }
}
class container
{
    private:
        class node
        {
            public:
            node * prev;
            node * next;
            int value;
        };

        node *start; // first element of the list
        node *finish; // last element of the list

    public:
        container(int v);

        void insert_start(int val);
        void print_container();
};
函数insert\u start应将元素添加到列表的开头。代码如下:

void container :: insert_start(node *start, int val)
{
    if(start!=NULL)
    {
        cout << "in insert_start" << endl;
        cout << "number added:" << val << endl;

        node *element = new node;

        element->value=val;
        element->next=start;
        start=element;
        start->prev=NULL;
    }
    else
    {
        cout << "List is empty" << endl;
    }
}
void容器::插入\u开始(节点*开始,int val)
{
如果(开始!=NULL)
{
cout在此代码中:

void container :: insert_start(node *start, int val)
{
    if(start!=NULL)
最后一行应该引用哪个
start
?是检查参数值还是公共类值

此外,如果列表为空,则可能需要执行打印消息以外的操作。列表必须以某种方式开始


(增编)

至少有两种方法可以防止此问题。我将同时展示三种方法:

void container :: insert_start(node *node_to_insert, int val)
{
    if (this->start != NULL)  // is list not empty?
看起来几乎一样,对吧

  • 现在,正式参数名称表示其含义。该名称表示要将指向的节点添加到列表中
  • 对象实例值是通过
    this
    关键字访问的。这在语法上消除了同名变量范围的歧义,并真正帮助程序员轻松地发现什么是什么
  • 该注释澄清了该语句的高层意图,这使得任何检查代码的人都可以轻松地识别可能的差异
  • 参数名称不再与对象成员名称匹配。虽然名称相互平行通常很有用(
    p_x,p_y,p_z
    对于初始化成员变量的三个参数值
    x,y,z
    ),但为了简单明了,它们确实应该保持不同

首先,不要将节点作为参数传入—您不需要这样做。容器类已经可以看到开始和结束节点,传入它们只会让事情变得混乱

其次,您应该将这些设置为私有,以便使用该类的任何人都必须使用insert\u start或insert\u FINICE函数

新类将如下所示:

class container
{
public:
    class node
    {
        public:
        node * prev;
        node * next;
        int value;
    };

container(int v);

node *start; // first element of the list
node *finish; // last element of the list
void insert_start(node *start, int val);
void print_container(); 
}
void container::print_container()
{
    node *tmp;
    tmp = start;
    while(tmp!=nullptr)
    {
        cout << tmp->value << endl;
        tmp=tmp->next;
    }
}
class container
{
    private:
        class node
        {
            public:
            node * prev;
            node * next;
            int value;
        };

        node *start; // first element of the list
        node *finish; // last element of the list

    public:
        container(int v);

        void insert_start(int val);
        void print_container();
};
第三,确保为每个方向设置链接。例如,在insert_start函数中:

node *element = new node;

element->value = val;
element->next = start;
element->prev = NULL;
start->prev = element; //This part was missing
start = element;

如果不将原始节点引用回新节点,则将其视为普通的单链接列表。如果希望双链接列表提供遍历灵活性,则需要正确设置链接。

Public class value。我希望node*开始对类容器中的所有函数可见,而不会使ac复杂化对这个节点来说,也许有更好、更安全和更好的方法,但是我在C++中还不是很先进,我想先写一个工作容器类。无论如何,谢谢你的帮助。