说我有一个单链接列表,其中包含从文件中收集的单词,我希望从该文件中可以从头到尾以及从头到尾打印这些单词。第一个选项的执行编码如下:
void writeWords(t_list *lp, FILE *fp, int total_num_words) {
t_list *aux;
aux = lp;
while(aux != NULL){
writeOneWord((t_word*) getItemList(aux), fp, total_num_words);
aux = getNextListElement(aux);
}
}
也就是说,列表按正常顺序进行迭代,每个节点的内容由writeOneWord
打印。
现在,我的疑问是:正如我说的那样,我也希望能够从头到尾遍历整个列表,并且在保留列表原样的同时,做到无可逆转。我知道代码应该与某种递归实现相对应,但是直到现在,我一直在尝试无济于事。谁能对此有所启示?
答案 0 :(得分:1)
您肯定要为此使用递归函数。
具有函数调用本身,传入列表中的下一个项目,然后在递归调用返回后的之后打印该项目。这样,列表的末尾将被首先打印。
void writeWords(t_list *lp, FILE *fp, int total_num_words) {
if (lp != NULL) {
writeWords(getNextListElement(lp), fp, total_num_words);
writeOneWord((t_word*) getItemList(lp), fp, total_num_words);
}
}
答案 1 :(得分:1)
您应该使用双向链表。但这是一种解决方法:
void writeWordsBackwards(t_list *lp, FILE *fp, int total_num_words) {
size_t i = 0;
t_list words[total_num_words];
for (size_t i = 0; lp && i < total_num_words; i += 1) {
words[i] = lp;
lp = getNextListElement(lp);
}
while (i >= 0) {
writeOneWord((t_word*) getItemList(words[i]), fp, total_num_words);
i -= 1;
}
}
与递归方法不同,它使用较少的堆栈空间。但是它仍然需要无限制的堆栈空间。最好使用malloc
以避免堆栈溢出。