Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 列表反向打印_C_Recursion_Linked List - Fatal编程技术网

C 列表反向打印

C 列表反向打印,c,recursion,linked-list,C,Recursion,Linked List,列表中的每个节点都包含后续节点的地址和数据。这就是为什么递归工作得很好,就像下面的例子:它接受一个输入,比如123456,然后将其打印为列表6->5->4->3->2->1->NULL。 节点不保留其前一个邻居的地址。从这一考虑出发,问题是: 如何能够从上一个节点打印列表,以获得NULL->6->5->4->3->2->1 这个问题的答案实际上指向了一个稍微不同的问题。他们的目的是扭转清单本身。我不想更改列表中数据的顺序。您只需更改打印调用的顺序即可。如果先打印列表的其余部分,则顺序将颠倒 p

列表中的每个节点都包含后续节点的地址和数据。这就是为什么递归工作得很好,就像下面的例子:它接受一个输入,比如
123456
,然后将其打印为列表
6->5->4->3->2->1->NULL。

节点不保留其前一个邻居的地址。从这一考虑出发,问题是:

如何能够从上一个节点打印列表,以获得
NULL->6->5->4->3->2->1


这个问题的答案实际上指向了一个稍微不同的问题。他们的目的是扭转清单本身。我不想更改列表中数据的顺序。

您只需更改打印调用的顺序即可。如果先打印列表的其余部分,则顺序将颠倒

print_list(head -> next);
printf("%d -> ", head -> data);

这实际上是一个如何处理列表的问题。

您只需要交换printf语句和递归调用

void print_list(LINK head){ 
     if(head == NULL)
          printf("NULL\n"); 
     else{
          print_list(head -> next);
          printf("%d -> ", head -> data);
      }
 } 

然后,最后一个递归调用中的printf语句将首先执行,然后执行其他语句。

当列表变得非常大时,递归将没有帮助,因为最终将运行堆栈空间

如果要求可以反向打印列表,则必须调整数据结构(和算法)以实现该要求,而不会耗尽堆栈空间


简而言之,您必须实现一个双链接列表,即不仅有
next
成员,还有
prev
成员。

将printf语句推到堆栈上时,只需遍历到最后一个节点。一旦到达列表的末尾,堆栈将开始展开,您的打印函数将被调用

void print_list_reverse(LINK head){                                                                                                                                                                                                             
    if(head == NULL)                                                                                                                                                                                                                        
            printf("NULL -> ");                                                                                                                                                                                                             
    else{                                                                                                                                                                                                                                   
            print_list_reverse(head -> next);                                                                                                                                                                                               
            printf("%d -> ", head -> data);                                                                                                                                                                                                 
    }                                                                                                                                                                                                                                       

}

打印列表(head->next);printf(“->%d”,头部->数据)可能重复的注意事项:对于小作业,递归是可以的,但是当递归的数量可能很大时,您通常希望坚持使用过程解决方案。为什么?因为每个递归都是一个单独的函数调用,它为不同和单独的堆栈帧保留内存,以处理该函数的所有局部变量。如果你递归100000次,那就是100000个单独的函数调用。随着递归数量的不断增加,这一点真的会增加。为什么不在这个问题上使用迭代呢?如果只进行递归搜索,唯一有效的方法是反转列表(如果需要,创建一个新列表)并打印它。没有神奇的解决方案可以使它在不反转列表的情况下进行尾部递归。不一定-可以先还原列表,然后在还原列表后,打印出每个元素-所有这些都不需要递归。。。注:我并不是说它更好,我只是说:一个人不“必须”…@Aconcagua,的确如此。我的要求不够具体,应该包括“不修改列表[因为其他任务可能正在对其进行操作]”。
void print_list_reverse(LINK head){                                                                                                                                                                                                             
    if(head == NULL)                                                                                                                                                                                                                        
            printf("NULL -> ");                                                                                                                                                                                                             
    else{                                                                                                                                                                                                                                   
            print_list_reverse(head -> next);                                                                                                                                                                                               
            printf("%d -> ", head -> data);                                                                                                                                                                                                 
    }                                                                                                                                                                                                                                       

}