是否可以在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()
函数在调用函数的堆栈帧上动态分配内存,而不是堆。您不必担心释放内存,因为当函数返回时它会自动释放


这里的人不愿意从头开始为你写家庭作业。既然你已经有了一些代码,你应该把它缩减到一个最小的例子,然后贴出来,问你哪里出错了。你能贴出作业全文吗?您正在谈论的文件名不清楚。查看代码也会很有用。另外,您确定没有简单地要求您保留一个预先分配的节点数组,然后在它们之间创建链接吗?您可以发布一些代码吗?递归调用?你应该在链表上实现什么操作?仅仅用一个堆栈是不可能删除任意列表成员的。在我看来,这是一个很大的问题