如果用户输入5,则显示链表的最后5个元素,反之亦然



我被困在我的单位作业....

我有一个有20个元素的链表,我必须从user那里取值,如果user输入5,那么打印链表的最后5个元素

void traverse(List list) {
Node *savedCurrentNode = list.currentNode;
list.currentNode = list.headNode;

for(int i = 1; list.next() == true; i++)
{
std::cout << "Element " << i << " " << list.get() << endl;
}

list.currentNode = savedCurrentNode;
}

我正在尝试这个,但是这个方法打印我的链表的所有元素

对于这么少的代码,回顾一下:

// Why are you passing the list by value? That is wasteful.
void traverse(List list) {
// I don't see you taking a value anywhere; surely you know how to do that
// What is happening here? Can't you just assign the head to something
// directly?
Node *savedCurrentNode = list.currentNode;
list.currentNode = list.headNode;

// Like you said, this traverses the entire list, it's also poorly
// formed. You literally don't need i.
// for (; list.next(); /* However your list increments here */)
for(int i = 1; list.next() == true; i++)
{
std::cout << "Element " << i << " " << list.get() << endl;
}

// What is the purpose of this?
list.currentNode = savedCurrentNode;
}

对于编写链表的人来说,这段代码似乎存在根本缺陷。我对处理链表的人的期望是他们不再是初学者,但我在代码中没有看到这一点,也没有看到列表类的隐含结构。list类很奇怪可以这么说。

为了说清楚,我的期望源于我在课程中布置链表作业的地方。它也比这个列表更习惯。

有了这些,这个任务就很简单了if你花时间把这个项目想清楚了。大多数学生跳过了计划步骤,给自己制造了不必要的麻烦。

知道你需要列表的总大小,为什么不让它成为成员数据呢?任何向列表中添加的函数都会相应地增加值。任何从列表中减去的函数都会相应地减少。这样你就可以随时知道列表的大小。

知道列表的大小是最重要的。然后,您需要进行必要的算术,以便在列表中前进以满足您的要求。现在你可以打印了。

#include <iostream>
class SList {
public:
SList() = default;
//
// Rule of 5 intentionally left out
//
void push_front(int val) {
m_head = new Node{val, m_head};
++m_size;  // The magic happens here
}
std::size_t size() const { return m_size; }
void traverse_last(int numElements, std::ostream& sout = std::cout) const {
int placement = m_size;
Node* walker = m_head;
// Move our walker node the appropriate amount of steps
while (walker && placement > numElements) {
walker = walker->next;
--placement;
}
// Now that we're in position, we can print
while (walker) {
sout << walker->data << ' ';
walker = walker->next;
}
sout << 'n';
}
private:
struct Node {
int data;
Node* next = nullptr;
};
Node* m_head = nullptr;
std::size_t m_size = 0ULL;
};
int main() {
SList test;
for (int i = 5; i > 0; --i) {
test.push_front(i);
}
std::cout << "Size: " << test.size() << 'n';
for (int i = 1; i <= 5; ++i) {
test.traverse_last(i);
}
test.traverse_last(10);
}

输出:

❯ ./a.out 
Size: 5
5 
4 5 
3 4 5 
2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
void traverse(List list, int printFrom)
{
Node *savedCurrentNode = list.currentNode;
list.currentNode = list.headNode;

for(int i=1; list.next(); i++)
{
if(i > printFrom)
{
cout << "Element " << (i - printFrom) << " " << list.get() << endl; 
}
}

list.currentNode = savedCurrentNode;
}

解决了我的问题,这里printFrom是一个变量,它的值是跳过的元素的数量,比如如果我的链表有20个大小,用户想看到最后5个,那么printFrom存储15个,跳过15个值,并打印最后5个

相关内容

  • 没有找到相关文章

最新更新