我将列表中的某些元素复制到新元素中时遇到问题。它必须在一个条件下完成:可以复制的元素必须来自输入的范围。问题是每个元素都被复制到新列表中。有什么建议?我想要指出,我的英语并不完美,但我希望你能得到它。谢谢:))
struct Node
{
Node* next;
int data;
};
struct List
{
Node* head;
Lista();
void push(int);
void addafter(int, int);
void delchosen(int);
void pop();
void print();
int count();
Node* find(int);
void pushback(int);
void popback();
void minmax(int&, int&);
List* range(int, int);
};
List::List()
{
head = NULL;
}
void List::push(int value)
{
Node *p = new Node;
p->data = value;
p->next = head;
head = p;
}
List* List::range(int x, int y)
{
Node* e = head;
List* newlist = new List;
while(e)
{
if(e->data > x && e->data <y)
{
newlist->push(e->data);
}
e = e->next;
}
return newlist;
}
int main()
{
List l;
srand(time(NULL));
const int size = 30;
int* arr = new int [size];
for(int i=0; i<size; i++)
{
arr[i]=rand()%20+1;
l.push(arr[i]);
}
l.range(3, 10);
return 0;
}
没想到它是必要的,但我只是编辑了代码。除了这种复制之外,每个功能都可以正常工作。
答案 0 :(得分:1)
您永远不会使用新列表。这可能会误导你。例如,您可以在调试器中打印或监视旧列表,该列表仍包含所有值。有时所有的程序员都会遇到这种情况,从新生到老胡子长老。
否则代码应该有效:
auto newList = l.range(3, 10);
newList->print();
奖励:一般代码审核。
如果您使用确定性值而不是随机内容填充列表,则调试和测试代码可能会更容易:
for (int i = 0; i < size; i++) {
l.push(i);
}
您很可能不需要在堆上分配newlist
。使用堆栈分配:
List List::range(int x, int y) const {
...
List newlist;
...
newlist.push(...);
...
return newlist;
}
虽然自我教育和各种黑客攻击很有趣,但你应该避免在严肃的代码中使用自制链接列表。在C ++中,我们倾向于使用标准库工具。类似的东西:
#include <iostream>
#include <iterator>
#include <list>
int main() {
// Construct original list from brace-initializer list
std::list<int> original{ 1, 2, 3, 4, 5, 6, 7 };
// Get the beginning of the new list by advancing
// beginning of the original list by 2 elements
auto begin = original.cbegin();
std::advance(begin, 2);
// Get the end of the new list by advancing
// beginning of the original list by 5 elements
auto end = original.cbegin();
std::advance(end, 5);
// Construct sublist from iterator range
std::list<int> sublist(begin, end);
// Print new list
for (auto&& e : sublist)
std::cout << e << ' '; // prints "3 4 5"
}