str);-6ren">
gpt4 book ai didi

c - 递归打印包含其他列表(相同结构)元素的列表

转载 作者:行者123 更新时间:2023-11-30 20:31:27 25 4
gpt4 key购买 nike

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

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

新列表-|

最后一个链接之后的每个子列表,最后一个链接与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 行,但在我刷新后它们就丢失了,因为我删除了我的帖子,所以如果可以的话,我会更短一点。

最佳答案

一个用于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 宏,用于列表/结构类型上的函数重载。

关于c - 递归打印包含其他列表(相同结构)元素的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50913778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com