C语言链表排序+对文件中数据的处理

希望可以写一个函数,实现对文件中数据的排序。
具体点:文件之中储存的是借书人的信息,一行当中,第一个数据是证号(int型),后边依次是姓名,日期,书名
希望写一个 SortReader 函数,按照证号(第一个int 型数据)将数据从小到大排列起来
下边是我的主要代码,但是排序不正确

#include<stdio.h>


#include<string.h>
#define LEN1 sizeof(struct reader)//有关读者信息的结构体
struct reader
{
    int jnum; 
    char jnam[20],time[20],tsnam[20];
    //jnum表示证号
    //jnam表示姓名
    //time表示借阅时间
    //tsnam表示借书的书名 
    struct reader *next;
};
void SortReader()
{
    //把原来的数据读入进链表 
    int n=0,end=tjdzzs();//end表示读者文件中数据个数,比如文件中数据有3行,那么end就是3 
    struct reader *head;
    struct reader *p1,*p2;
    p1=p2=(struct reader *)malloc(LEN1);
    head=NULL;
    FILE *pt;
    pt=fopen("reader.txt","r");
    if(pt==NULL)
    {
        printf("打开文件失败!按任意键返回上一级!\n");
        getch();
        jmain();
        fclose(pt);
    }
    else
    {
        fscanf(pt,"%d%s%s%s",&p1->jnum,p1->jnam,p1->time,p1->tsnam);//从文本中读取数据 
        while(n<end)//将原来文本文件中的数据赋值到链表之中 
        {
            n++;
            if(n==1)
            {
                head=p1;
            }
            else
            {
                p2->next=p1;
            }
            p2=p1;
            p1=(struct reader *)malloc(LEN1);
            fscanf(pt,"%d %s %s %s",&p1->jnum,p1->jnam,p1->time,p1->tsnam);
        }
        p2->next=NULL;
    }
    fclose(pt);
    //对链表进行选择排序
    if(head!=NULL)
    p2=head;
    else
    {
        printf("链表不存在!按任意键返回上级!\n");
        getch();
        jmain();
    }
    int i,j;//选择排序所需要的变量 
    for(i=0;i<end-1;i++)
    {
        struct reader *temp;//用 temp 来记录 p2 的值 
        temp=p2;
        p1=p2->next;
        for(j=i+1;j<end;j++)
        {
            if(temp->jnum > p1->jnum)
            {
                temp=p1;
            }
        }
        //说明存在比 p2->jnum 还小的证号 
        if(temp!=p2)
        {
            struct reader middle;
            //中间结构体变量 
            middle.jnum=p2->jnum;
            strcpy(middle.jnam,p2->jnam);
            strcpy(middle.time,p2->time);
            strcpy(middle.tsnam,p2->tsnam);
            
            p2->jnum=temp->jnum;
            strcpy(p2->jnam,temp->jnam);
            strcpy(p2->time,temp->time);
            strcpy(p2->tsnam,temp->tsnam);
            
            temp->jnum=middle.jnum;
            strcpy(temp->jnam,middle.jnam);
            strcpy(temp->time,middle.time);
            strcpy(temp->tsnam,middle.tsnam);
            //正常的交换结构体之间的数据 
        }
        p2=p2->next;
    }
    //排序结束,将排序好的链表输入到文件之中
    pt=fopen("reader.txt","w");
    if(pt==NULL)
    {
        printf("读者文件不存在!按任意键返回上级!\n");
        getch();
        jmain();
        fclose(pt);
    }
    p1=head;
    while(p1!=NULL)
    {
        fprintf(pt,"%d %s %s %s \n",p1->jnum,p1->jnam,p1->time,p1->tsnam);
        p1=p1->next;     
    } 
    free(head);
    fclose(pt);
}
int main()
{
  
}

这是文件中的数据

1 王子炫 2021/7/19 老人与海
3 邢狗 2021/7/19 老人与海
5 杨宇航 2021/7/19 王子炫吃屎
9 王子炫 2021/7/19 老人与海
50 狗队 2021/7/20 老人与海
50 狗队 2021/7/20 老人与海
70 杨宇航 2021/7/20 老人与海
90 翔狗狗 2021/7/20 老人与海
300 杨黎骏 2021/7/19 小王子
400 狗队 2021/7/19 老人与海
55 狗队 2021/7/20 老人与海
500 杨宇航 2021/7/20 小王子
600 杨宇航 2021/7/20 老人与海
700 王子炫 2021/7/20 老人与海
800 王子炫 2021/7/19 老人与海
44 狗队 2021/7/20 老人与海
800 翔狗 2021/7/20 小王子
888 狗队 2021/7/20 老人与海
900 徐文儒 2021/7/19 王子炫吃屎
900 逼牛 2021/7/20 老人与海
1000 狗队 2021/7/20 老人与海

学生成绩排序,参考:


#include "stdio.h"

#define N 2
struct student{
    int id;
    char name[20];
    int kaoqun;
    int biaoxian;
    int zuoye;
    int biji;
    int sum;
}stud[N],t;

int main()
{
    int i,j;
    for(i=0;i<N;i++){
        printf("请输入第%d个学生信息\n",i+1);
        scanf("%d %s",&stud[i].id,&stud[i].name);
        fflush(stdin);
        scanf("%d %d %d %d",&stud[i].kaoqun,&stud[i].biaoxian,&stud[i].zuoye,&stud[i].biji);
        stud[i].sum = stud[i].kaoqun*0.3+stud[i].biaoxian*0.3+stud[i].zuoye*0.3+stud[i].biji*0.1;
    }
    
    //排序
    
    for (i = 0; i < N - 1; i++){
        for (j = 0; j < N - 1 - i; j++){ //按成绩对学生信息进行排序
            if (stud[j].sum > stud[j + 1].sum){ //整型数字的比较
                t = stud[j];
                stud[j] = stud[j + 1];
                stud[j + 1] = t;
            }
        }
    }
    //打印
    printf("学号\t姓名\t考勤\t表现\t作业\t笔记\t总分\t\n");
    for (i = 0; i < N; i++){
        printf("%d\t", stud[i].id);
        printf("%s\t", stud[i].name);
        printf("%d\t", stud[i].kaoqun);
        printf("%d\t", stud[i].biaoxian);
        printf("%d\t", stud[i].zuoye);
        printf("%d\t", stud[i].biji);
        printf("%d \n", stud[i].sum);
    }
    
    return 1;
}

链表排序一般两种方式,一是将链表的节点内容进行交换,但链表节点不交换;二是交换链表节点顺序,而链表的内容不交换。前者相对理解上容易一些。
参考https://blog.csdn.net/technologist_37/article/details/118500579 文中的
void BubbleSort(STUINFO* head)或者
void insertsort(STUINFO *head),都可以实现链表排序

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^