作者:vfjgjgv | 来源:互联网 | 2023-02-01 12:19
列表的每个节点与数据一起保存后继节点的地址。这就是为什么递归可以很好地工作的原因,例如下面的示例:它接受输入,例如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;
}
节点不保留其先前邻居的地址。从这个考虑出发,问题是:
为了有可能如何从其最后一个节点打印列表NULL -> 6 -> 5 -> 4 -> 3 -> 2 -> 1
?
问题的答案实际上是在c中递归逆转链表,这实际上是一个略有不同的问题。他们旨在扭转名单本身。我的目标不是更改列表中数据的顺序。
1> 小智..:
您只需更改打印调用的顺序即可。如果您先打印列表的其余部分,则顺序将被颠倒。
print_list(head -> next);
printf("%d -> ", head -> data);
这实际上是您如何查看列表的问题。