是否可以在C+;中的堆栈上创建链接列表+;? 我几周前刚开始学习C++。所以现在我有一个学校作业问题,要求我实现一个链表,而不使用“new”或任何与动态分配内存有关的东西(并且不能使用STL中的任何ADT)。教授说任何事情都可以在堆栈上完成,但是如何做到呢?从周五开始我就一直在做这件事,但仍然坚持下去,毫无运气
上面写着:保存一堆正在读取的文件名。对堆栈使用以下数据结构:是否可以在C+;中的堆栈上创建链接列表+;? 我几周前刚开始学习C++。所以现在我有一个学校作业问题,要求我实现一个链表,而不使用“new”或任何与动态分配内存有关的东西(并且不能使用STL中的任何ADT)。教授说任何事情都可以在堆栈上完成,但是如何做到呢?从周五开始我就一直在做这件事,但仍然坚持下去,毫无运气,c++,linked-list,stack,C++,Linked List,Stack,上面写着:保存一堆正在读取的文件名。对堆栈使用以下数据结构: struct Node { string fileName; Node *link; }; 我试图避免使用new,但当我将列表头传递到递归方法调用时,它总是给我“分段错误”或“总线错误”。关于如何解决这个问题,有什么想法吗?想想数组。如果需要,可能不止一个。没有太多信息: 递归实现是必需的吗?当您进行递归调用时,会得到一个新堆栈。 也许你可以使用迭代的方法 调用函数后,该函数的堆栈分配是固定的 获得更多堆栈内存分配的唯一方法是
struct Node {
string fileName;
Node *link;
};
我试图避免使用new,但当我将列表头传递到递归方法调用时,它总是给我“分段错误”或“总线错误”。关于如何解决这个问题,有什么想法吗?想想数组。如果需要,可能不止一个。没有太多信息: 递归实现是必需的吗?当您进行递归调用时,会得到一个新堆栈。
也许你可以使用迭代的方法 调用函数后,该函数的堆栈分配是固定的 获得更多堆栈内存分配的唯一方法是调用另一个函数。然后可以调用另一个函数。然后可以调用另一个函数。或者它们可能都是相同的函数
每个函数调用都有自己的固定大小堆栈,但函数调用图本身是这些堆栈的可变大小堆栈。如果您知道需要存储多少文件名,可以使用一个结构节点数组并从中构建列表 使用迭代一种可能的替代方法是在函数中有一个struct Node对象,并在递归调用中传递指向该对象的指针,在递归调用中,将该指针用于该函数堆栈框架中节点对象的下一个链接
请注意,在后一种情况下,列表仅在最深的递归上有效,当递归调用返回到调用方时,列表将再次被分解。我创建了一个小示例,您可能会发现它很有启发性。我在堆栈上创建一个单独链接的元素列表。注意列表是如何反向创建的,递归是如何用来“分配”所需的ITME数量的。还要注意列表是如何作为参数传递给的。希望这有帮助,祝你好运
#include <cstdio>
using namespace std;
struct Node {
Node* next_;
int value_;
};
// Creates a linked list of nodes containing raising values.
void intList(Node* prevNode, int restValue) {
if (restValue) {
// A node on the stack, which is linked to list created so far.
Node node;
node.next_ = prevNode;
node.value_ = restValue;
// Create a next node or print this list if rest runs to zero.
intList(&node, restValue - 1);
}
else {
// Depest recursion level, whole list is complete.
for (Node* iter = prevNode; iter; iter = iter->next_)
printf("item %d\n", iter->value_);
}
}
int main() {
intList(NULL, 10);
}
#包括
使用名称空间std;
结构节点{
节点*下一个节点;
int值;
};
//创建包含提升值的节点的链接列表。
void intList(节点*prevNode,int restValue){
if(restValue){
//堆栈上的节点,链接到迄今为止创建的列表。
节点;
node.next=prevNode;
node.value=restValue;
//如果rest运行为零,则创建下一个节点或打印此列表。
intList(&node,restValue-1);
}
否则{
//依赖递归级别,整个列表已完成。
对于(节点*iter=prevNode;iter;iter=iter->next_u2;)
printf(“项目%d\n”,iter->value_u2;);
}
}
int main(){
intList(NULL,10);
}
堆和堆栈之间的区别主要在于(不仅是为了解决这个问题,而且主要是为了解决这个问题)内存的分配位置和释放方式。当您想在堆上分配一个节点时,您可以说newnode
,系统将为您提供内存,跟踪哪些块被使用,哪些块是空闲的,并提供在不再需要块时释放块的方法
但您也可以在堆栈上的数组中拥有一个节点池。(自动变量是堆栈变量。)您可以从该池中“分配”,跟踪阵列中哪些节点已使用,哪些节点是空闲的,并将未使用的节点标记为不再需要的空闲节点。但是,由于数组的大小在编译时是固定的,这意味着您的列表有一个最大长度 要“在堆栈上创建链表”,通常需要使用alloca之类的函数来获取更多的堆栈内存。然而,这听起来不像你被要求做的
听起来你应该在堆栈上保留一个堆栈,而不是一个任意的链表。作为提示,您要执行的操作的一般语法如下:
void push(struct Node *oldHead, String elem) {
struct Node newHead;
head.fileName = elem;
head.next = oldHead.
struct Node *head = &newHead
// then you need to continue what you're doing in this function, since
// returning will effectively pop the stack.
<> P>有一些(非平凡的)技术来完成这些垃圾收集的列表,但这超出了你所做的范围。 < P>你应该去和你的教授谈谈,并澄清这些要求,因为从你的描述来看,这对于一个新的C++程序员来说似乎是一个非常奇怪的任务。只需要在栈上实现一个带链表的链表,这是最奇怪的。 < P>可以使用操作符<强> >(C++)的C++ >强>地址来检索堆栈上的对象的指针,而不是用<强>新< /强> < /p>动态分配内存。 由于以这种方式生成链表除了作为家庭作业外,其他用途都值得怀疑,所以我不确定这是否是实际需要的。如果没有代码示例,很难准确说出问题所在。使用
alloca()
而不是malloc()
函数在调用函数的堆栈帧上动态分配内存,而不是堆。您不必担心释放内存,因为当函数返回时它会自动释放
这里的人不愿意从头开始为你写家庭作业。既然你已经有了一些代码,你应该把它缩减到一个最小的例子,然后贴出来,问你哪里出错了。你能贴出作业全文吗?您正在谈论的文件名不清楚。查看代码也会很有用。另外,您确定没有简单地要求您保留一个预先分配的节点数组,然后在它们之间创建链接吗?您可以发布一些代码吗?递归调用?你应该在链表上实现什么操作?仅仅用一个堆栈是不可能删除任意列表成员的。在我看来,这是一个很大的问题