从单链列表的末尾到末尾进行迭代,而不会反向

时间:2018-10-19 14:50:24

标签: c list recursion

说我有一个单链接列表,其中包含从文件中收集的单词,我希望从该文件中可以从头到尾以及从头到尾打印这些单词。第一个选项的执行编码如下:

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打印。

现在,我的疑问是:正如我说的那样,我也希望能够从头到尾遍历整个列表,并且在保留列表原样的同时,做到无可逆转。我知道代码应该与某种递归实现相对应,但是直到现在,我一直在尝试无济于事。谁能对此有所启示?

2 个答案:

答案 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以避免堆栈溢出。