以递归方式打印包含其他列表(相同结构)的元素的列表

时间:2018-06-18 16:26:08

标签: c

这是我递归打印列表的方式:

if (mylist_ptr == NULL) {
        return ;
    }


    printf("%s: ", mylist_ptr->str);
    report(mylist_ptr->next);


    return ;

现在我想打印一个包含其他列表元素的列表,以相同的方式(递归)。 这就是我的列表的样子。

       |-->    `Link0`      `Link1`      `Link2`      `Link3`
       |     list1        list2        list3        list4
       |    next         next         next          NULL

newlist - |

以及最后一个链接之后的每个子列表,最后一个链接与NULL链接。还有结构:

struct link {
    char value[20] ;
    struct link* next ;    
} ;


typedef struct link Link;
typedef Link * List;


struct lstlst{
    List list;
    struct lstlst*next;
} ; 
typedef struct lstlst Listoflists;

我写了5行但是他们在我刷新之后迷路了因为我删除了我的帖子所以如果可以的话我会变得更短。

1 个答案:

答案 0 :(得分:0)

struct link的一个函数以递归方式打印它。然后我们进入层次结构,创建一个用于打印struct lstlst的递归函数,该函数调用用于打印struct link的递归函数。

#include <stdio.h>

struct link_s {
    char value[20];
    struct link_s *next;
};

struct lstlst_s {
    struct link_s list;
    struct lstlst_s *next;
};

static void link_print(const struct link_s *elem) {
    printf("%s\n", elem->value);
}
static void link_print_recursively(const struct link_s *head) 
{
    if (head == NULL) return;
    link_print(head);
    link_print_recursively(head->next);
}
static void lstlst_print(const struct lstlst_s *elem) 
{
    link_print_recursively(&elem->list);
}
static void lstlst_print_recursively(const struct lstlst_s *head) {
    if (head == NULL) return;
    lstlst_print(head);
    lstlst_print_recursively(head->next);
}

// C11 _Generic can support both struct types
#define generic_print_recursively(head)  _Generic((head), \
        const struct lstlst_s *: lstlst_print_recursively, \
        const struct link_s *: link_print_recursively)(head)

int main()
{
    const struct lstlst_s lstlst_head = { 
        .list = { 
            .value = "1 1",
            .next = &(struct link_s){
                .value = "1 2",
                NULL,
            }
        },
        .next = &(struct lstlst_s){
            .list = { 
                "2 1",
                &(struct link_s){
                    "2 2",
                    NULL,
                }
            },
        }
    };
    const struct link_s link_head = {
        "3 1",
        &(struct link_s){
            .value = "3 2",
            NULL,
        }
    };

    printf("One\n");
    lstlst_print_recursively(&lstlst_head);
    link_print_recursively(&link_head);
    printf("Two\n");
    generic_print_recursively(&lstlst_head);
    generic_print_recursively(&link_head);

    return 0;
}

@edit:我缩短了示例结构并为列表/结构类型的函数重载添加了一个简单的_Generic宏。