⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 蛇型距阵第4章.txt

📁 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单 简单
💻 TXT
📖 第 1 页 / 共 2 页
字号:
p=p->next; /*将指针p后移*/ 
} 
if(p==NULL) /*如果p指针为空,说明没有指定结点*/ 
if(p==h) /*同时p等于h,说明链表为空*/ 
h=info; /*新记录则为头结点*/ 
else 
q->next=info; /*p为空,但p不等于h,将新结点插在表尾*/ 
else 
if(p==h) /*p不为空,则找到了指定结点*/ 
{ 
info->next=p; /*如果p等于h,则新结点插入在第一个结点之前*/ 
h=info; /*新结点为新的头结点*/ 
} 
else 
{ 
info->next=p; /*不是头结点,则是中间某个位置,新结点的后继为p*/ 
q->next=info; /*新结点作为q的后继结点*/ 
} 
printf("\n ----have inserted %s student----\n",info->name); printf("---Don't forget save---\n"); /*提示存盘*/ 
return(h); /*返回头指针*/ 
} 
/*保存数据到文件*/ 
void save(STUDENT *h) 
{ 
FILE *fp; /*定义指向文件的指针*/ 
STUDENT *p; /* 定义移动指针*/ 
char outfile[10]; /*保存输出文件名*/ 
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示文件名格式信息*/ 
scanf("%s",outfile); 
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/ 
{ 
printf("can not open file\n"); 
exit(1); 
} 
printf("\nSaving file......\n"); /*打开文件,提示正在保存*/ 
p=h; /*移动指针从头指针开始*/ 
while(p!=NULL) /*如p不为空*/ 
{ 
fwrite(p,sizeof(STUDENT),1,fp);/*写入一条记录*/ 
p=p->next; /*指针后移*/ 
} 
fclose(fp); /*关闭文件*/ 
printf("-----save success!!-----\n"); /*显示保存成功*/ 
} 
/* 从文件读数据*/ 
STUDENT *load() 
{ 
STUDENT *p,*q,*h=NULL; /*定义记录指针变量*/ 
FILE *fp; /* 定义指向文件的指针*/ 
char infile[10]; /*保存文件名*/ 
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*输入文件名*/ 
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/ 
{ 
printf("can not open file\n"); /*如不能打开,则结束程序*/ 
exit(1); 
} 
printf("\n -----Loading file!-----\n"); 
p=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ 
if(!p) 
{ 
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/ 
return h; /*返回空头指针*/ 
} 
h=p; /*申请到空间,将其作为头指针*/ 
while(!feof(fp)) /*循环读数据直到文件尾结束*/ 
{ 
if(1!=fread(p,sizeof(STUDENT),1,fp)) 
break; /*如果没读到数据,跳出循环*/ 
p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/ 
if(!p->next) 
{ 
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/ 
return h; 
} 
q=p; /*保存当前结点的指针,作为下一结点的前驱*/ 
p=p->next; /*指针后移,新读入数据链到当前表尾*/ 
} 
q->next=NULL; /*最后一个结点的后继指针为空*/ 
fclose(fp); /*关闭文件*/ 
printf("---You have success read data from file!!!---\n"); 
return h; /*返回头指针*/ 
} 
/*追加记录到文件*/ 
void append() 
{ 
FILE *fp; /*定义指向文件的指针*/ 
STUDENT *info; /*新记录指针*/ 
int s1,i; 
char infile[10]; /*保存文件名*/ 
printf("\nplease new record\n"); 
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ 
if(!info) 
{ 
printf("\nout of memory"); /*没有申请到,内存溢出本函数结束*/ 
return ; 
} 
inputs("enter no:",info->no,11); /*调用inputs输入学号*/ 
inputs("enter name:",info->name,15); /*调用inputs输入姓名*/ 
printf("please input %d score \n",N); /*提示输入成绩*/ 
s1=0; 
for(i=0;i<N;i++) 
{ 
do{ 
printf("score%d:",i+1); 
scanf("%d",&info->score[i]); /*输入成绩*/ 
if(info->score[i]>100||info->score[i]<0)printf("bad data,repeat input\n"); 
}while(info->score[i]>100||info->score[i]<0); /*成绩数据验证*/ 
s1=s1+info->score[i]; /*求总分*/ 
} 
info->sum=s1; /*保存总分*/ 
info->average=(float)s1/N; /*求均分*/ 
info->order=0; /*名次初始值为0*/ 
info->next=NULL; /*将新记录后继指针赋值为空*/ 
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*输入文件名*/ 
if((fp=fopen(infile,"ab"))==NULL) /*向二进制文件尾增加数据方式打开文件*/ 
{ 
printf("can not open file\n"); /*显示不能打开*/ 
exit(1); /*退出程序*/ 
} 
printf("\n -----Appending record!-----\n"); 
if(1!=fwrite(info,sizeof(STUDENT),1,fp)) /*写文件操作*/ 
{ 
printf("-----file write error!-----\n"); 
return; /*返回*/ 
} 
printf("-----append sucess!!----\n"); 
fclose(fp); /*关闭文件*/ 
} 
/*文件拷贝*/ 
void copy() 
{ 
char outfile[10],infile[10]; 
FILE *sfp,*tfp; /*源和目标文件指针*/ 
STUDENT *p=NULL; /*移动指针*/ 
clrscr(); /*清屏*/ 
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); 
scanf("%s",infile); /*输入源文件名*/ 
if((sfp=fopen(infile,"rb"))==NULL) /*二进制读方式打开源文件*/ 
{ 
printf("can not open input file\n"); 
exit(0); 
} 
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示输入目标文件名*/ 
scanf("%s",outfile); /*输入目标文件名*/ 
if((tfp=fopen(outfile,"wb"))==NULL) /*二进制写方式打开目标文件*/ 
{ 
printf("can not open output file \n"); 
exit(0); 
} 
while(!feof(sfp)) /*读文件直到文件尾*/ 
{ 
if(1!=fread(p,sizeof(STUDENT),1,sfp)) 
break; /*块读*/ 
fwrite(p,sizeof(STUDENT),1,tfp); /*块写*/ 
} 
fclose(sfp); /*关闭源文件*/ 
fclose(tfp); /*关闭目标文件*/ 
printf("you have success copy file!!!\n"); /*显示成功拷贝*/ 
} 
/*排序*/ 
STUDENT *sort(STUDENT *h) 
{ 
int i=0; /*保存名次*/ 
STUDENT *p,*q,*t,*h1; /*定义临时指针*/ 
h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/ 
h->next=NULL; /*第一个结点为新表的头结点*/ 
while(h1!=NULL) /*当原表不为空时,进行排序*/ 
{ 
t=h1; /*取原表的头结点*/ 
h1=h1->next; /*原表头结点指针后移*/ 
p=h; /*设定移动指针p,从头指针开始*/ 
q=h; /*设定移动指针q做为p的前驱,初值为头指针*/ 
while(t->sum<p->sum&&p!=NULL) /*作总分比较*/ 
{ 
q=p; /*待排序点值小,则新表指针后移*/ 
p=p->next; 
} 
if(p==q) /*p==q,说明待排序点值大,应排在首位*/ 
{ 
t->next=p; /*待排序点的后继为p*/ 
h=t; /*新头结点为待排序点*/ 
} 
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/ 
{ 
t->next=p; /*t的后继是p*/ 
q->next=t; /*q的后继是t*/ 
} 
} 
p=h; /*已排好序的头指针赋给p,准备填写名次*/ 
while(p!=NULL) /*当p不为空时,进行下列操作*/ 
{ 
i++; /*结点序号*/ 
p->order=i; /*将名次赋值*/ 
p=p->next; /*指针后移*/ 
} 
printf("sort sucess!!!\n"); /*排序成功*/ 
return h; /*返回头指针*/ 
} 
/*计算总分和均值*/ 
void computer(STUDENT *h) 
{ 
STUDENT *p; /*定义移动指针*/ 
int i=0; /*保存记录条数初值为0*/ 
long s=0; /*总分初值为0*/ 
float average=0; /*均分初值为0*/ 
p=h; /*从头指针开始*/ 
while(p!=NULL) /*当p不为空时处理*/ 
{ 
s+=p->sum; /*累加总分*/ 
i++; /*统计记录条数*/ 
p=p->next; /*指针后移*/ 
} 
average=(float)s/i;/* 求均分,均分为浮点数,总分为整数,所以做类型转换*/ 
printf("\n--All students sum score is:%ld average is %5.2f\n",s,average); 
} 
/*索引*/ 
STUDENT *index(STUDENT *h) 
{ 
STUDENT *p,*q,*t,*h1; /*定义临时指针*/ 
h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/ 
h->next=NULL; /*第一个结点为新表的头结点*/ 
while(h1!=NULL) /*当原表不为空时,进行排序*/ 
{ 
t=h1; /*取原表的头结点*/ 
h1=h1->next; /*原表头结点指针后移*/ 
p=h; /*设定移动指针p,从头指针开始*/ 
q=h; /*设定移动指针q做为p的前驱,初值为头指针*/ 
while(strcmp(t->no,p->no)>0&&p!=NULL) /*作学号比较*/ 
{ 
q=p; /*待排序点值大,应往后插,所以新表指针后移*/ 
p=p->next; 
} 
if(p==q) /*p==q,说明待排序点值小,应排在首位*/ 
{ 
t->next=p; /*待排序点的后继为p*/ 
h=t; /*新头结点为待排序点*/ 
} 
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/ 
{ 
t->next=p; /*t的后继是p*/ 
q->next=t; /*q的后继是t*/ 
} 
} 
printf("index sucess!!!\n"); /*索引排序成功*/ 
return h; /*返回头指针*/ 
} 
/*分类合计*/ 
void total(STUDENT *h) 
{ 
STUDENT *p,*q; /*定义临时指针变量*/ 
char sno[9],qno[9],*ptr; /*保存班级号的*/ 
float s1,ave; /*保存总分和均分*/ 
int i; /*保存班级人数*/ 
clrscr(); /*清屏*/ 
printf("\n\n *******************Total*****************\n"); 
printf("---class---------sum--------------average----\n"); 
p=h; /*从头指针开始*/ 
while(p!=NULL) /*当p不为空时做下面的处理*/ 
{ 
memcpy(sno,p->no,8); /*从学号中取出班级号*/ 
sno[8]='\0'; /*做字符串结束标记*/ 
q=p->next; /*将指针指向待比较的记录*/ 
s1=p->sum; /*当前班级的总分初值为该班级的第一条记录总分*/ 
ave=p->average; /*当前班级的均分初值为该班级的第一条记录均分*/ 
i=1; /*统计当前班级人数*/ 
while(q!=NULL) /*内循环开始*/ 
{ 
memcpy(qno,q->no,8); /*读取班级号*/ 
qno[8]='\0'; /*做字符串结束标记*/ 
if(strcmp(qno,sno)==0) /*比较班级号*/ 
{ 
s1+=q->sum; /*累加总分*/ 
ave+=q->average; /*累加均分*/ 
i++; /*累加班级人数*/ 
q=q->next; /*指针指向下一条记录*/ 
} 
else 
break; /*不是一个班级的结束本次内循环*/ 
} 
printf("%s %10.2f %5.2f\n",sno,s1,ave/i); 
if(q==NULL) 
break; /*如果当前指针为空,外循环结束,程序结束*/ 
else 
p=q; /*否则,将当前记录作为新的班级的第一条记录开始新的比较*/ 
} 
printf("---------------------------------------------\n"); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -