【发布时间】:2017-11-06 21:55:10
【问题描述】:
我一直在自己做这个练习,以便在 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是列表的最后一个元素, - 反向遍历数组,
- 通过将当前节点的nextNode 设置为循环中的下一个节点,将当前节点的
next指针设置为前一个。
发生了什么:
- 如果我将调试打印语句保留为注释,则什么也没有。函数被调用,但链表保持不变(不反转)
- 如果我取消注释调试打印,程序段错误(这对我来说没有多大意义,但似乎表明我的代码存在缺陷)
我怀疑我错过了什么,一双新的眼睛可能会抓住它。我是不是对数组处理不当(没有考虑到指针或其他东西的衰减)?
【问题讨论】:
-
欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
-
调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 edit 您的问题包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
-
感谢您的反馈。我会尽快编辑问题(以更好地反映指南)。
标签: c++ arrays pointers pointer-to-pointer