【发布时间】:2017-11-16 07:55:33
【问题描述】:
列表的每个节点与数据一起保存连续节点的地址。这就是递归运作良好的原因,如下例所示:它接受一个输入,例如123456,然后将其打印为列表6 -> 5 -> 4 -> 3 -> 2 -> 1 -> NULL.
/* Structure types ----------------------------------------------*/
typedef int data;
struct list_element {
int data;
struct list_element *next;
};
typedef struct list_element ELEM;
typedef ELEM *LINK;
/* Recursive list create and list print---------------*/
LINK create_list(int n) {
if (n == 0) {
return NULL;
}
else {
LINK head = (LINK) malloc(sizeof(ELEM));
head -> data = n % 10;
head -> next = create_list(n / 10);
return head;
}
}
void print_list(LINK head) {
if(head == NULL)
printf("NULL\n");
else {
printf("%d -> ", head -> data);
print_list(head -> next);
}
}
/* MAIN ---------------------------------------------------------*/
int main(int argc, char *argv[]) {
int n; LINK ls;
printf("\nType an integer:\n");
scanf("%d", &n);
ls = create_list(n);
print_list(ls);
return 0;
}
节点不保存其前一个邻居的地址。从这个考虑问题:
如何从它的 last 节点打印一个列表,以便拥有 NULL -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 ?
Reversing a linkedlist recursively in c 问题的答案实际上指向了一个稍微不同的问题。他们的目标是扭转名单本身。我不打算改变列表中数据的顺序。
【问题讨论】:
-
点赞
print_list(head -> next); printf(" -> %d", head -> data); -
注意:对于小型作业,递归很好,但当递归数量可能很大时,您通常会希望坚持程序解决方案。为什么?因为每个递归都是一个单独的函数调用,它为不同且单独的堆栈帧保留内存以处理该函数本地的所有变量。如果你递归 100,000 次,那就是 100,000 次单独的函数调用。随着递归数量的持续增长,这真的可以加起来。
-
为什么不在这个问题上使用迭代?如果您只搜索递归,那么好的也是唯一的方法是反转列表(如果需要,创建一个新列表)并打印它。没有神奇的解决方案可以在不反转列表的情况下使其尾递归。
标签: c recursion linked-list