我的双重链接列表出了问题。如何使输入唯一(我不希望它重复) 例如,我可以输入1然后再次1我将有一个1和1的列表。我需要以某种方式禁止这个:)所以列表只能包含不重复的数字。
#include <cstdlib>
#include <iostream>
using namespace std;
struct node
{
int data;
node* next;
node* prev;
};
class Node
{
public:
Node();
~Node();
void setKopa();
void printForward();
private:
node* head;
node* tail;
node* n;
};
Node::Node()
{
setKopa();
}
Node::~Node()
{
delete n;
}
void Node::setKopa()
{
int lenght;
do
{
cout << "Input list lenght (how many elements): ";
cin >> lenght;
if(lenght<2)
cout << "Error list has to have atleast 2 elements!" <<endl;
}
while(lenght<2);
int fill;
cout << "Input "<< lenght <<" elements: "<<endl;
for (int i=0; i<lenght; i++)
{
cin>>fill;
n = new node;
n->data = fill;
if (i==0)
{
n->prev = NULL;
head = n;
tail = n;
}
else if (i+1==lenght)
{
n->prev = tail;
tail->next = n;
tail = n;
tail->next = NULL;
}
else
{
n->prev = tail;
tail->next = n;
tail = n;
}
}
}
void Node::printForward()
{
node* temp = head;
while(temp != NULL)
{
cout << temp->data << " ";
temp = temp-> next;
}
cout << endl;
}
int main()
{
Node a;
a.printForward();
system("pause");
return 0;
}
答案 0 :(得分:1)
当您阅读输入时,请浏览列表以查看输入是否已存在。
有了这个(简单)的答案,我想解决一些关于你的代码的其他事情。首先是你有一个内存泄漏,你永远不会删除列表。第二个是你不需要类成员变量n
,它也可能是setKopa
循环中的局部变量。
你添加新节点的方式也很奇怪。在我看来,它应该更通用,而不是使用循环计数器来检查要做什么。我建议你创建一个成员函数来添加新节点,将整数数据作为参数。这样,您可以调用此函数在任何位置添加节点,而不仅仅是setKopa
函数。事实上,我认为该列表根本不应该处理该输入,而应该是从main
调用并且调用addNode
函数的独立函数。
node
结构也不需要在全局命名空间中,它可以是Node
类中的私有结构。说到Node
类,不应该真的被称为List
吗?
因此,如果我建议,你可能想做这样的事情:
#include <iostream>
class List
{
public:
List()
: head(nullptr), tail(nullptr)
{}
~List();
void addNode(const int data);
void printAll() const;
private:
struct node
{
node()
: next(nullptr), prev(nullptr)
{}
node* next;
node* prev;
int data;
};
node* head;
node* tail;
};
List::~List()
{
for (node* next, *cur = head; cur; cur = next)
{
next = cur->next;
delete cur;
}
}
void List::addNode(const int data)
{
node* n = new node;
n->data = data;
if (tail == nullptr)
{
// First node in list
head = tail = n;
}
else
{
n->prev = tail;
tail->next = n;
tail = n;
}
}
void List::printAll() const
{
std::cout << "{ ";
for (node* cur = head; cur != nullptr; cur = cur->next)
std::cout << cur->data << ' ';
std::cout << "}\n";
}
int main()
{
List list;
for (int i = 0; i < 10; ++i)
list.addNode(i);
list.printAll();
}
上面的代码应该打印
{ 0 1 2 3 4 5 6 7 8 9 }
用您自己的节点添加循环替换。