Ich versuche, den Knoten nach Punktzahl zu sortieren. Ich weiß nicht, welchen Fehler ich habe

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

struct student{
char firstname[20];
char lastname[20];
double grade;
char zipcode[10];
struct student *next;
};

void display(struct student *first)
{
while (first != NULL)
{
    printf("\nFirst name: %s", first->firstname);
    printf("\tLast name: %s", first->lastname);
    printf("\tGrade: %.2f", first->grade);
    printf("\t ZipCode: %s", first->zipcode);
    first = first->next;
}
}


/*void add_Record(struct student *first)
{
char r[20];
struct student *t;
t = first;

while (t != NULL)
{
    if (t == NULL)
    {
        first = (struct student*)malloc(sizeof(struct student));
        printf("\nEnter the first name of the student:");
        scanf("%s", first->firstname);
        printf("\nEnter the last name of the student:");
        scanf("%s", first->lastname);
        printf("\nEnter the score of the student:");
        scanf("%lf", &first->grade);
        printf("\nEnter the zipcode of the student:");
        scanf("%s", first->zipcode);
    }
}
}

void del()
{
struct student *back, *t, *k;
char r[10];
int flag = 0;
printf("\nEnter the last name of student  you want to delete:");
scanf("%s", r);
if (strcmpi(r, first->lastname) == 0)
{
    first = first->next;
    flag = 1;
}
else
{
    back = first;
    k = first->next;
    while (k != NULL)
    {
        if (strcmpi(r, k->lastname) == 0)
        {
            back->next = k->next;
            flag = 1;
            break;
        }
    }
}
if (flag == 0)
    printf("\nThe element not found!!!");
}
*/

void search(struct student *first)
{
char r[10];
int flag = 0;
printf("\nEnter the zipcode you want to search:");
scanf("%s", r);
struct student *t;
t = first;
while (t != NULL)
{
    if (strcmp(r, t->zipcode) == 0)
    {
        printf("\nFirst name: %s", t->firstname);
        printf("\tLast name: %s", t->lastname);
        printf("\tGrade: %.2f", t->grade);
        printf("\t ZipCode: %s", t->zipcode);
        flag = 1;
        break;
    }t = t->next;
}
if (flag == 0)
    printf("\nThe zipcode not in database!!");
}

void sort(struct student *first)
{
struct student *temp;
temp = NULL;
while (first != NULL)
{
    if (first-> grade > first->next->grade)
    {
        strcpy(temp->firstname, first->firstname);
        strcpy(temp->lastname, first->lastname);
        temp->grade = first->grade;
        strcpy(temp->zipcode, first->zipcode);
        strcpy(first->firstname, first->next->firstname);
        strcpy(first->lastname, first->next->lastname);
        first->grade = first->next->grade;
        strcpy(first->zipcode, first->next->zipcode);
        strcpy(first->next->firstname, temp->firstname);
        strcpy(first->next->lastname, temp->lastname);
        first->next->grade = temp->grade;
        strcpy(first->next->zipcode, temp->zipcode);
        break;
    }
}
printf("\nThe sorted record by score are: \n");
display(first);
}

int main(void)
{
struct student *first = NULL, *last = NULL;
struct student *temp;
int n;
printf("\nEnter the number of student:");
scanf("%d", &n);
int i;
for (i = 0; i < n; i++)
{
    temp = (struct student*)malloc(sizeof(struct student));
    printf("\nEnter the first name of the student:");
    scanf("%s", temp->firstname);
    printf("\nEnter the last name of the student:");
    scanf("%s", temp->lastname);
    printf("\nEnter the grade of the student:");
    scanf("%lf", &temp->grade);
    printf("\nEnter the zipcode of the student:");
    scanf("%s", temp->zipcode);
    temp->next = first;
    first = temp;
}
int o;
o = 1;
while (o != 0)
{
    printf("\nMENU\n");
    printf("\nEnter 1 for displaying database.");
    printf("\nEnter 2 for inserting an record.");
    printf("\nEnter 3 for deleting a record by lastname.");
    printf("\nEnter 4 for searching a record by zipcode.");
    printf("\nEnter 5 for sorting record by score.");
    printf("\nEnter 0 for exit!");
    printf("\nEnter the choice:");
    scanf("%d", &o);
    switch (o)
    {
    case 1:display(first); break;
        /*case 2:insertafter(*first); break;
    case 3:del(); break;*/
    case 4:search(first); break;
    case 5: sort(first); break;
    case 0:exit(0); break;
    default:printf("\nYou have entered a wrong choice!!!");
    }
}
}

Das Problem ist, wie sortiere ich die Ergebnisse nach Punktzahl. Mein Code scheint richtig zu sein, funktioniert aber nicht. Ich habe eine temporäre Struktur erstellt und versucht, Werte auszutauschen, aber das funktioniert nicht. Mache ich die Schleife falsch? Oder ist mein gesamter Code falsch?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage