.
ll=(Node*)malloc(sizeof(Node)); /*用于创建新的节点*/ if(!ll) {
printf(\分配存失败 \如没有申请到,打印提示信息*/ return ; /*返回主界面*/ }
ll->next=NULL; system(\
Disp(l); /*显示排序前的所有学生记录*/ p=l->next;
while(p) /*p!=NULL*/ {
s=(Node*)malloc(sizeof(Node)); /*新建节点用于保存从原链表中取出的节点信息*/
if(!s) /*s==NULL*/ {
printf(\分配存失败 \如没有申请到,打印提示信息*/ return ; /*返回主界面*/ }
s->data=p->data; /*填数据域*/ s->next=NULL; /*指针域为空*/
.
.
rr=ll;
/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/
while(rr->next!=NULL && rr->next->data.total>=p->data.total) {rr=rr->next;} /*指针移至总分比p所指的节点的总分小的节点位置*/ if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.total大时,就将p所指节点加入链表尾部*/ rr->next=s;
else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/ {
s->next=rr->next; rr->next=s; }
p=p->next; /*原链表中的指针下移一个节点*/ }
l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/
p=l->next; /*已排好序的头指针赋给p,准备填写名次*/ while(p!=NULL) /*当p不为空时,进行下列操作*/ {
i++; /*结点序号*/
.
.
p->data.mingci=i; /*将名次赋值*/ p=p->next; /*指针后移*/ } Disp(l); saveflag=1;
printf(\ =====>排序完成!\\n\ }
/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,示用户存盘*/ void Save(Link l) { FILE* fp; Node *p; int count=0;
fp=fopen(\以只写方式打开二进制文件*/ if(fp==NULL) /*打开文件失败*/ {
printf(\打开文件错误!\\n\ getchar();
.
会提 .
return ; }
p=l->next; while(p) {
if(fwrite(p,sizeof(Node),1,fp)==1)/*每次写一条记录或一个节点信息至文件*/ {
p=p->next; count++; } else { break; } }
if(count>0) {
getchar();
printf(\保存文件完成,保存的记录总数是:%d\\n\ getchar(); saveflag=0;
.
.
} else
{system(\
printf(\当前链表是空的,没有学生记录保存!\\n\ getchar(); }
fclose(fp); /*关闭此文件*/ }
void main() {
Link l; /*定义链表*/ FILE *fp; /*文件指针*/
int select; /*保存选择结果变量*/ char ch; /*保存(y,Y,n,N)*/
int count=0; /*保存文件中的记录条数(或结点个数)*/ Node *p,*r; /*定义记录指针变量*/
l=(Node*)malloc(sizeof(Node)); if(!l)
.
相关推荐: