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++中还不是很先进,我想先写一个工作容器类。无论如何,谢谢你的帮助。