C - 链表 - 以相反的方式链接

C - Linked list - Linked in the reversed way

#include <stdio.h>

#include<stdlib.h>

typedef struct node {
    int data;
    int help;
    struct node* next;
} Node;

void print_list(Node* head);
void CreateList(Node** head , int data);
void reverse(Node** head_ref);



int main() {
    int i, c, a;
    Node* list = NULL;

    printf("How many numbers do you want? ");
    scanf("%d",&c);
    for (i = 1; i <= c; i++) {
        printf("Enter number %d: ", i);
        scanf("%d", &a);
        CreateList(&list, a);
    }

    printf("Given linked list\n");
    print_list(list);

    reverse(&list);

    printf("\nReversed Linked list \n");
    print_list(list);

    return 0;
}

void print_list(Node* head) {
    while (head != NULL) {
        printf("%d -> ", head->data);
        head = head->next;
    }

    if (head == NULL)
        printf("NULL");

    return;
}

void CreateList(Node** head , int data) {
    Node *temp = (Node*) malloc(sizeof(Node));;

    temp->data = data;
    temp->next = *head;
    *head = temp;
}

void reverse(Node** head_ref) {
    Node* prev   = NULL;
    Node* current = *head_ref;
    Node* next;

    while (current != NULL) {
        next  = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    *head_ref = prev;
}

输入:1 2 3 4 5 6

我的想法是这样的:

我真的很努力,但还是找不到正常创建列表的方法,有什么可能的解决方案吗?

您的 create_list() 函数在链的开头插入新节点,向下推 现有的其他节点。相反,您可以 append 在链的末尾,例如:


void add_at_end(Node** head ,int data)
{
    Node *temp;

      // Find the end of the chain
    while (*head) { head = & (*head)->next ; }

    temp = malloc(sizeof *temp);
    temp->next = NULL;
    temp->data = data;
      // append
    *head = temp;
}