希望可以写一个函数,实现对文件中数据的排序。
具体点:文件之中储存的是借书人的信息,一行当中,第一个数据是证号(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),都可以实现链表排序