添加功能不是任何新节点或显示功能显示 none 但仅显示第一个节点信息

add function is not any new node or display function is showing none but the first node info only

enter code here在main函数中我调用了add函数和display函数来查看所有当前节点及其存储的数据到链表中。但每次它只显示第一个节点值而不是其他节点。我在我的代码中找不到任何错误。任何人都可以帮助...

这是我的代码:-

struct student* add(struct student*);
struct student* search(struct student*);
struct student* modify(struct student*);
void display(struct student* head);
struct student
{
    int roll;
    char name[50];
    float percentage;
    struct student *address;
};
int nodes=0;//nodes variable keeps the data of the total no of nodes present in to the inked list.
int main()
{
    struct student *head;
    int choice;
    char mychoice='y';
    head=NULL;
    do
    {
        printf("Enter 1 to add a node.\nEnter 2 to display all existing record.\nEnter 3 to search a record.\nEnter 4 to modify an existing record.\nEnter your choice: ");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                head=add(head);
                display(head);
                //break;
            case 2:
                display(head);
                break;
            case 3:
                head=search(head);
                break;
            case 4:
                head=modify(head);
                break;
            default:
                printf("Enter any of the correct input.\n");
                break;
        }
        printf("\nDo you want to continue? [Y/N]");
            scanf(" %c",&mychoice);
    }while(mychoice=='y'||mychoice=='Y');
    return 0;
}

struct student* add(struct student* head)
{
    struct student *node,*temp;
    node=(struct student*)malloc(sizeof(struct student));
    temp=head;
    printf("Enter the name of the student: ");
    scanf("%s",&(node->name));
    printf("Enter the roll of the student: ");
    scanf("%d",&(node->roll));
    printf("Enter the percentage: ");
    scanf("%f",&(node->percentage));
    node->address=NULL;
    if(head==NULL) // Implies an empty list.
        head=node;
    else
    {
        temp=head;
        while(temp!=NULL)//Traversing to the last node.
            temp=temp->address;
        temp=node;
    }
    nodes++;
    return head;
}

struct student* search(struct student* head)
{
    int m;
    printf("Enter the no of node you wanna search: ");
    scanf("%d",&m);
    if(m>nodes)
        printf("%dth node does not exist.",m);
    else
        {
            for(i=0;i<m;i++)// Traversing node to node to go to the mth node.
                temp=temp->address;
            printf("\nThe name of the student is: %s\nThe roll no of the student is: %d \nThe percentage of the student is: %5.2f \n\n",temp->name,temp->roll,temp->percentage);            
        }
    return head;
}

struct student* modify(struct student* head)
{
    int m,i;
    struct student *temp;
    temp=head;
    printf("Enter the index no of node you wanna change: ");
    scanf("%d",&m);
    if(m>nodes)
        printf("%dth node does not exist.",m);
    else
        {
            for(i=0;i<m;i++)// Traversing node to node to go to the mth node.
                temp=temp->address;
            printf("Enter the new name of the student: ");
            scanf("%s",&(temp->name));
            printf("Enter the new roll of the student: ");
            scanf("%d",&(temp->roll));
            printf("Enter the new percentage: ");
            scanf("%f",&(temp->percentage));
        }
    return head;
}

void display(struct student* head)
{
    struct student *temp;
    temp=head;
    while(temp!=NULL)
    {
        printf("\nThe name of the student is: %s\nThe roll no of the student is: %d \nThe percentage of the student is: %5.2f \n\n",temp->name,temp->roll,temp->percentage);
        temp=temp->address;
    }
}

对于 add 函数,您的问题在这里:

    temp=head;
    while(temp!=NULL)//Traversing to the last node.
        temp=temp->address;
    temp=node;

你永远不会让当前最后一个节点指向新节点。您所做的是将新节点分配给 temp,然后分配给 return。当您 return temp 超出范围并且新节点丢失时。

要插入新节点,您需要更新最后一个节点的 address。在伪代码中你需要做:

// Pseudo code to insert a new tail node
current_last_node->address = new_node;

尝试这样的事情:

    temp=head;
    while(temp->address!=NULL)//Traversing to the last node.
        temp=temp->address;
    temp->address=node;

顺便说一句:为 address 调用指向列表下一个元素的指针是不正常的。约定是使用名称 next.

其他两条评论:

1) 由于您想添加到列表的末尾,因此使用 tail 指针以获得更好的性能通常是个好主意。

2) 您应该将 headnodestail 收集到一个结构中。

类似于:

struct student_list
{
    struct student *head;
    struct student *tail;
    int nodes;
};

int main()
{
    struct student_list list = {NULL, NULL, 0};
    add(&list);
    ...
    ...
}

那么 add 函数将是:

void add(struct student_list* list)
{
    struct student *node;
    node=malloc(sizeof *node);

    // Read data into node

    node->address=NULL;

    if(list->head==NULL) // Implies an empty list.
    {
        list->head=node;
    }
    else
    {
        list->tail->address=node;
    }
    list->tail=node;
    list->nodes++;
}

现在函数中没有循环,所以添加元素是 O(1),即更好的性能。