链表程序只打印列表的最后两个节点

Linked list program only printing last two nodes of list

我编写了一个程序来创建和打印单个链表。我使用指向结构指针的结构指针来修改列表。当我打印列表时,它只打印最后添加的两个节点。

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

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

struct node * createnode(int num){
        struct node * n;
        n=(struct node*)malloc(sizeof(struct node));
        n->data=num;
        n->next=NULL;
        return n;
}
                                                  
void createlist(struct node **head,int num){
        struct node *temp=createnode(num);
        *head=temp;
        return;
}                                                 
void options(){
        printf("Enter your choice\n");
        printf("1.Add at end\n");
        printf("2.Add at beginning\n");
        printf("3.Add at location\n");
        printf("4.Print list\n");                 
}

void add_end(struct node **head){
        int info;
        printf("Value: ");
        scanf("%d",&info);
        if(*head==NULL){
                createlist(head,info);
                return;
        }
        struct node *temp=createnode(info);
        struct node **end=head;
        while((*end)->next!=NULL){
                (*end)=(*end)->next;
        }
        (*end)->next=temp;                        
}                 

void print2(struct node *head){
        struct node * temp=head;
        printf("\nList :");
        while(temp!=NULL){
                printf("%d ",temp->data);
                temp=temp->next;
        }
        printf("\n");
}

int main(){
        struct node *head=NULL;
        createlist(&head,5);

        int choice=0;
        options();
        scanf("%d",&choice);
        while(1){
                switch(choice){
                case 1:add_end(&head);
                       break;
                case 4:print2(head);
                       break;
                default:exit(0);
                }
                options();
                scanf("%d",&choice);
        }

        return 0;
}

每次,我在列表末尾附加 5 到 6 个节点,当我打印列表时,它只打印最后添加的节点。 不知道是add_end函数还是打印函数有问题

您的 add_line 例程错误地搜索了最后一个节点。 end 变量是一个指向指针的指针,因此它在某种意义上等同于 head 参数并且它不是一个临时值,它应该是。将最后几行更改为如下内容:

void add_end(struct node **head){
    ...
    struct node *end = *head;
    while (end->next) {
           end = end->next;
           // Original line overwrites the 'head':  (*end)=(*end)->next;
    }
    end->next=temp;                        
}