【问题标题】:Print reversely the elements of a list using recursion使用递归反向打印列表的元素
【发布时间】:2021-06-06 10:10:47
【问题描述】:

我想使用递归反向打印列表的元素,但我得到一个执行错误!

有人可以帮忙吗?

typedef struct node
{
    int val;
    struct node* next;
}node;
typedef struct list
{
    node* head;
}list;
void display(list L)
{
    if(L.head == NULL)    return;
    L.head= L.head->next;
    display(L);
    printf("%d\t",L.head->val);
}

【问题讨论】:

    标签: c recursion linked-list


    【解决方案1】:

    而不是使用:

    typedef struct list
    {
        node* head;
    }list;
    

    您可以简单地传递“节点 n”,然后使用 n->next 递归调用它,如下所示:

    void display(node *n){
        if(n != NULL){
           display(n->next);
           printf("%d\t",n->val);
        }
    }
    

    然后从外部调用该方法如下:

    display(node->head);
    

    display(node.head);
    

    取决于您如何分配结构“节点”。

    旁注:

    我实际上会将您的结构重命名为:

    typedef struct List
    {
        int val;
        struct List* next;
    }List;
    

    然后调用:

    void display(List *l){
        if(l != NULL){
           display(l->next);
           printf("%d\t",l->val);
        }
    }
    

    IMO 它更好地表达了手头的用例。

    一个完整的例子:

    #include <stdio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct List
    {
        int val;
        struct List* next;
    }List;
    
    void display(List *l){
        if(l != NULL){
           display(l->next);
           printf("%d\t",l->val);
        }
    }
    
    List *addElement(List *l, int val){
          if(l == NULL){
             List *node = malloc(sizeof(List));
             node->val = val;
             node->next = NULL;
             return node;
          }
          else 
             l->next = addElement(l->next, val);
          return l;
    }
    
    
    void freeList(List *l){
        if(l != NULL){
          freeList(l->next);
          free(l);
        }
    }
    
    int main(){
       List *l = NULL;
       l = addElement(l, 1);
       l = addElement(l, 2);
       l = addElement(l, 3);
       l = addElement(l, 4);
       l = addElement(l, 5); 
       display(l);
       freeList(l);
    }
    

    输出:

    5   4   3   2   1   
    

    【讨论】:

      【解决方案2】:
      void display(node *N){
          if(N != NULL){
             display(N->next);
             printf("%d\t",N->val);
          }
      }
      

      主要是:

      int main (void)
      {
          //...
          display (L.head);
      

      【讨论】:

      • 主要:display(L.head);display(L-&gt;head); 取决于 L 在本地声明为 listlist *。您不应该使用node hese,因为它是一个类型名称。即使可以,将列表称为node 也是不明智的。
      猜你喜欢
      • 2014-11-27
      • 2021-11-30
      • 2017-03-31
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多