Próbuję posortować węzeł według wyniku. Nie wiem, jaki mam błąd

#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!!!");
    }
}
}

Problem polega na tym, jak sortować wyniki według wyniku. Mój kod wydaje się słuszny, ale nie działa. Zrobiłem strukturę tymczasową i próbowałem zamienić wartości, ale to nie działa. Czy robię pętlę źle? Albo cały mój kod jest zły?

questionAnswers(1)

yourAnswerToTheQuestion