【发布时间】:2017-12-23 23:53:27
【问题描述】:
我使用以下代码的目标是让用户输入一些整数,将这些整数存储在堆栈分配的 INT_NODE 类型的节点中,然后将所有这些节点链接在一起。最后,我想遍历列表并打印出每个节点处的元素(仅以下代码中的前 5 个)。但是,当我输入一些数字时,程序会打印出我输入的第一个数字,然后我输入的最后一个数字会重复 4 次。例如,如果我输入84 5 12 7 1 22 31[Enter],然后在下一行的开头按Ctrl+D 在这台Mac 上模拟EOF,我得到以下输出; 84 31 31 31 31。我无法弄清楚它为什么这样做。
我知道我可以使用malloc() 分配堆上的节点,并且我已经编写了一个函数来执行此操作。我只是想知道是否可以使用运行时堆栈来做到这一点。
在以下代码中,INT_NODE 类型在"SortingAlgs.h" 标头中定义如下;
typedef struct INT_NODE {
int element;
struct INT_NODE *next;
} INT_NODE;
#include <stdio.h>
#include <stdlib.h>
#include "SortingAlgs.h"
int main(void) {
INT_NODE head = {-999999999};
int num;
INT_NODE *pCurrentNode = &head;
if (scanf("%d", &num) != EOF) {
head.element = num;
while (scanf("%d", &num) != EOF) {
INT_NODE newNode;
newNode.element = num;
newNode.next = NULL;
pCurrentNode->next = &newNode;
pCurrentNode = pCurrentNode->next;
}
}
int i;
for (pCurrentNode = &head, i = 0; i < 5;
pCurrentNode = pCurrentNode->next, i++)
printf("%d ", pCurrentNode->element);
printf("\n");
return 0;
}
【问题讨论】:
-
谁会为此分配足够的内存?
-
要使用运行时堆栈,您需要 1) 通过
alloca进行非标准运行时分配或 2) 递归函数,其中每个递归级别将承载一个列表节点。就是这样。你现在拥有的东西是不可行的,只会导致未定义的行为。当然,您可以简单地将固定数量的节点预先分配为本地数组,并希望它足以满足您的列表...但我确定这不是您的意思。 -
INT_NODE newNode;:超出范围无效。 -
您每次在 while 循环中创建和销毁 yr 节点。必须在堆上做
-
请注意,您的打印循环停止的唯一原因是
i < 5术语。对于真正的链表,您将继续前进,直到到达具有空下一个指针的节点(最常见的情况)。如果您尝试这样做,您很可能会得到31的“永远”生产(直到您感到无聊并杀死您的程序)。这是你的问题的征兆。
标签: c linked-list