以相反顺序打印链表:程序不输出任何内容

Print a linked list in reverse order: program not outputting anything

我正在尝试使用递归以相反的顺序打印链表。 IE。 : 如果我将 1,2,3,4,5 添加到链表中,程序应该输出 5,4,3,2,1。 这是代码:

#include <stdio.h>
#include <stdlib.h>

struct Node{
    int data;
    struct Node* next;
};

void Print(struct Node* n)
{
    if(n->next == NULL)
    {
        return;
    }
    Print(n->next);
    printf("%d",n->data);
    
}

void Insert(struct Node** head_ref,int data)
{
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = data;
    new_node->next = NULL;
    if((*head_ref)==NULL)
    {
        (*head_ref) = new_node;
    }
    else
    {
        struct Node* temp = (*head_ref);
        while(temp!=NULL)
        {
            temp = temp->next;
        }
        temp->next = new_node;
    }
}

int main()
{
    struct Node* head = NULL;
    Insert(&head,1);
    Insert(&head,2);
    Insert(&head,3);
    Insert(&head,4);
    
    Print(head);
}

我也试过将头指针声明为全局变量,但仍然没有输出任何内容。任何帮助,将不胜感激。 此外,如果您认为我的代码中缺少某些内容或我没有正确理解某些内容,请尽可能向我指出一些可以让我学习概念的资源。

谢谢

两个错误:

查找最后一个节点的循环条件错误。

是:

while(temp!=NULL)

虽然应该是:

while(temp->next!=NULL)

否则,更新时间:

while (temp != NULL) { ... }
temp->next = new_node; // segmentation fault

会爆炸,因为temp在那个地方NULL

第二个错误:

当打印早期检查是否到达尾部时应该是:

if(n == NULL) // not `if (n->next == NULL)`

否则尾部不会被打印出来。

在这些修复之后程序打印:

1234

如果你想颠倒顺序只需交换 printf 和递归 Print() 调用:

    Print(n->next);
    printf("%d",n->data);