我有一个列表和一个向它添加元素的递归函数。我认为那部分是好的。
typedef struct list
{
char c;
struct list *next;
} Element;
typedef Element *List;
List myList = NULL;
void add(List &list, char c)
{
if (list == NULL)
{
list = new Element;
list->next = NULL;
list->c = c;
}
else add(list->next, c);
}
但是在尝试将文件(或者更确切地说是所有字符)放入我的列表时出现堆栈溢出错误。
string line; //keeps strings coming from getline()
while (getline(input, line))
{
for (int i = 0; i < line.length(); i++)
add(myList, line[i]);
add(myList, '\n’);
}
(输入为ifstream类型)
我正在尝试编程的是代码格式化程序(我在大学编程课程的项目,我们都必须使用链接列表)。
答案 0 :(得分:0)
递归add(list, c)
应为add(list->next, c)
您可以通过保留指向最后一个元素的指针来缓解此问题:List tail
。你可以通过从函数中返回来维护它:
List add(List& list, const char c) {
if (list == NULL) {
list = new Element;
list->next = NULL;
list->c = c;
return list;
} else {
return add(list->next, c);
}
}
此功能必须准备好。第一个调用应该如下所示:tail = add(myList, c)
如果你这样做,所有后续调用只需要一个堆栈帧:tail = add(tail, c)