列表反向打印

Wor*_*ice 0 c recursion linked-list

列表的每个节点与数据一起保存后继节点的地址。这就是为什么递归可以很好地工作的原因,例如下面的示例:它接受输入,例如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;
}
Run Code Online (Sandbox Code Playgroud)

节点不保留其先前邻居的地址。从这个考虑出发,问题是:

为了有可能如何从其最后一个节点打印列表NULL -> 6 -> 5 -> 4 -> 3 -> 2 -> 1

问题的答案实际上是在c中递归逆转链表,这实际上是一个略有不同的问题。他们旨在扭转名单本身。我的目标不是更改列表中数据的顺序。

小智 5

您只需更改打印调用的顺序即可。如果您先打印列表的其余部分,则顺序将被颠倒。

print_list(head -> next);
printf("%d -> ", head -> data);
Run Code Online (Sandbox Code Playgroud)

这实际上是您如何查看列表的问题。