我一直在做我自己的练习,以便在C++中变得更好(用我写的链表来搞乱)。我想要做的是通过扭转指针来颠倒列表,而不是仅仅将数据“反向打印”(这是相对直接的)。使用指针指针数组来操作它指向的指针(C++)
我有一个指向指针的数组,每个指向链表中的一个节点。但这不是一个关于链表动态的问题(我知道),还有更多关于指针魔术师的问题。
一个node
看起来是这样的,
template<class T>
struct node {
T data;
node *next;
node(T value) : data(value), next(nullptr) {}
};
,问题中的代码,
node<T> **reverseArr[listLength];
node<T> *parser = root;
for (auto i : reverseArr) {
i = &parser;
parser = parser->next;
}
root = *(reverseArr[listLength - 1]);
for (int ppi = listLength - 1; ppi >= 0; --ppi) {
if (ppi == 0) {
(*reverseArr[ppi])->next = nullptr;
//std::cout << "ppi is zero!" << "\t";
}
else {
(*reverseArr[ppi])->next = (*reverseArr[ppi - 1]);
//std::cout << "ppi, 'tis not zero!" << "\t";
}
}
我的逻辑:
- 新
root
是列表的最后一个元素, - 遍历数组
- 将当前节点的
next
指针设置为前一个节点,方法是将当前节点的nextNode设置为循环中的下一个节点。
发生了什么事:
- 如果我离开的评论调试打印语句,什么都没有。函数的调用,但链表仍然保持不变(不反转)
- 如果我取消注释调试打印,程序seg-faults(这对我来说没有太多意义,但似乎表明我的代码存在缺陷)
我怀疑有一些东西我错过了,一双清新的眼睛可能会抓住。我是否也许错误地处理了这个数组(没有考虑到指针或其他东西的衰变)?
欢迎来到Stack Overflow。请花些时间阅读[The Tour](http:// stackoverflow。com/tour),并参考[帮助中心](http://stackoverflow.com/help/asking)中的内容以及您可以在此处询问的内容。 –
解决这些问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,你应该[编辑]你的问题,以包含一个[Minimal,Complete,and Verifiable](http://stackoverflow.com/help/mcve)例子来重现你的问题,以及你在调试器中所做的观察。 –
感谢您的反馈。我会尽快编辑问题(以更好地反映准则)。 – Zaeche