遍历单链表为什么不起作用?

Traversing single linked list not working why?

我开始学习数据结构,我试着编写一个关于单链表的简单程序。

The problem is that when i call my display function (transversing the list) it doesn't give me an output? What is wrong with my code and how do i fix this?

这是我的程序:

int main(){

int n;
        
printf(" Input the number of nodes : ");
scanf("%d", &n);

create(n);

printf("\n Data entered in the list : \n");
display();

}

void create(int n)
{   
struct node *head=NULL;
int data, i;

head = (struct node *)malloc(sizeof(struct node));

if(head == NULL)                         
{
    printf(" Memory can not be allocated.");
}
else 
{
    printf(" Input data for node 1 : ");
    scanf("%d", &data);
    head->data = data;      
    head->next = NULL; 

    for(i=1; i<n; i++) // Creating n nodes 
    {
       struct node *current = (struct node *)malloc(sizeof(struct node)); // addnode
        if(current == NULL)
        {
            printf(" Memory can not be allocated.");
            break;
        }
        else
        {
            printf(" Input data for node %d : ", i);
            scanf(" %d", &data);

            current->data = data;      
            current->next = NULL;    
            head->next = current;
            
            head = head->next; 
        }
    }
}

}

我的遍历函数:

 void display(struct node *head)
 {
 struct node* ptr = head;

 if(head == NULL)
 {
    printf(" List is empty.");
 }
 else
 {
    while(ptr != NULL)
    {
        printf(" Data = %d\n", ptr->data);     
        ptr = ptr->next;                     
    }
 }
 } 

问题是 create()

中的行
head->next = current;
head = head->next; 

此操作将 head 设置为 current。请注意 current->next 为 NULL。结果,除了最后一个元素外,列表的全部内容都丢失了。

只需将这些行替换为:

current->next = head;
head = current;

这会将 current 节点放在列表的顶部。 记得从 create().

return head
    #include <stdio.h>
    #include <stdlib.h>
    struct node {
        int data;
        struct node * next;
    };

    struct node * create(int n) {   
        struct node *head=NULL;
        int data, i;
        struct node * ptmp = NULL;
        head = (struct node *)malloc(sizeof(struct node));
        if(head == NULL) {
            printf(" Memory can not be allocated.");
        } else {
            printf(" Input data for node 1 : ");
            scanf("%d", &data);
            head->data = data;      
            head->next = NULL; 
            ptmp = head;
            for(i=1; i<n; i++) {
                struct node *current = (struct node *)malloc(sizeof(struct node)); // addnode
                if(current == NULL) {
                    printf(" Memory can not be allocated.");
                    break;
                } else {
                    printf(" Input data for node %d : ", i);
                    scanf(" %d", &data);
    #if 0

                    // insert first
                    current->data = data;      
                    current->next = head;    
                    head = current;

    #else

                    // insrt last
                    current->data = data;
                    current->next = NULL;
                    ptmp->next=current;
                    ptmp = current;

     #endif

                }
            }
        }
        return head;
    }

    void display(struct node *head)
    {
        struct node* ptr = head;
        if(head == NULL) {
            printf(" List is empty.");
        } else {
            while(ptr != NULL) {
                printf(" Data = %d\n", ptr->data);     
                ptr = ptr->next;                     
            }
        }
    }

    int main() {

        int n = 0;
        printf(" Input the number of nodes : ");
        scanf("%d", &n);
            if (n<=0 || n > 6400) {
                printf("Invalid input : %d (Enter value in range 0-6400)\n", n);
                return 0;
            }
        struct node * head = create(n);
        printf("\n Data entered in the list : \n");
        display(head);
    }