信息管理系统
最近看到了很多关于信息管理系统的贴,我自己也做了一个~算是对现阶段编程能力的一种自我检测吧~看看效果如何,发个来看看(噢,感觉做得有点特别~新手可能看不懂哦)~vc编译环境运行~~如果其它编译器有问题不能通过,那就这样先吧~
[此贴子已经被作者于2017-1-6 02:02编辑过]
程序代码:/*动态更新,写在前面的话:注意文件保存格式用txt--学号设置不能重复输入
第一阶段完结~代码突破了1000行*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define SIZE_FUN 7//这个是菜单长度,最大为10,大于10会出错
#define LEN sizeof(Student)//这个是Student的大小
#define MEMBER(A) (int)A-(int)head//这个是用来获取结构体成员的地址的
typedef int FUN (int,void *p,void *p2[]);//定义新函数类型
typedef struct Student//初始化
{
char num[3];
char name[10];
int score;
struct Student *date;
struct Student *back;
}Student;
Student *head=NULL;
typedef struct PRINT_SET//定义字库结构体
{
char ss1[5];//这个是字库关键字
char ss2[100];//这个似乎关键字对应的内容
}PRINT_SET;//这个是输出字库
int camp(const void *p1,const void *p2)//快排用的序函数
{
return strcmp(((PRINT_SET *)p1)->ss1,((PRINT_SET *)p2)->ss1);
}
void print_set(const void *str)//字库管理函数
{
static flag=1;
static PRINT_SET p[]=
{
"1001","\n您需要查询的学生信息为:\n",
"1002","\n没有找到需要查询学生的信息",
"1010","\n请输入您需要查询学生的学号",
"1011","\n请输入您需要查询学生的姓名",
"1021","\n请输入您需要插入学生的学号",
"1022","\n请输入您需要删除学生的学号",
"1023","\n请输入您需要修改学生的学号",
"1030","请输入读取文件路径:",
"1031","请输入读取文件路径:",
"2001","\n该学号已经存在,请重新输入\n",
"3001","\n请输入:Y--进行创建,追加学生信息;N--返回菜单(请输入Y\\N)",
"3011","\n请输入:Y--进行保存学生信息;N--返回菜单(请输入Y\\N)",
"3012","\n请输入:Y--进行读取学生信息;N--返回菜单(请输入Y\\N)",
"3031","\n请输入:Y--进行按学号查找学生信息;N--返回菜单(请输入Y\\N)",
"3032","\n请输入:Y--进行按姓名查找学生信息;N--返回菜单(请输入Y\\N)",
"3033","\n请输入:Y--进行按学号插入学生信息;N--返回菜单(请输入Y\\N)",
"3034","\n请输入:Y--进行按学号删除学生信息;N--返回菜单(请输入Y\\N)",
"3035","\n请输入:Y--进行清空学生信息;N--返回菜单(请输入Y\\N)",
"3036","\n请输入:Y--进行按学号修改学生信息;N--返回菜单(请输入Y\\N)",
"3100","即将返回上一步",
"3101","信息已清空,即将返回菜单\n",
"3134","\n是要插入该学生信息吗?(请输入Y\\N)",
"3135","\n是要删除该学生信息吗?(请输入Y\\N)",
"3136","\n是要修改该学生信息吗?(请输入Y\\N)",
"3200","\n现在进行按学号排序",
"3201","\n现在进行按姓名排序",
"3202","\n现在进行按成绩排序",
"3210","\n请输入:Y--进行按学号升序排序;N--返回菜单(请输入Y\\N)",
"3211","\n请输入:Y--进行按姓名升序排序;N--返回菜单(请输入Y\\N)",
"3212","\n请输入:Y--进行按成绩升序排序;N--返回菜单(请输入Y\\N)",
"3220","\n请输入:Y--进行按学号降序排序;N--返回菜单(请输入Y\\N)",
"3221","\n请输入:Y--进行按姓名降序排序;N--返回菜单(请输入Y\\N)",
"3222","\n请输入:Y--进行按成绩降序排序;N--返回菜单(请输入Y\\N)",
"4001","该表为空表,请先初始化信息\n",
"9999","Y--退出系统;N--返回菜单(请输入Y\\N)",
};//初始化输出字库
PRINT_SET *PS=p;
PRINT_SET *PB=NULL;
if (strcmp(str,"0000")==0)//"0000"表示输出为空,即什么都不输出
return;
if (flag)
{
qsort(p,sizeof(p)/sizeof(PRINT_SET),sizeof(p[0]),camp);//帮字符按编号快速排序,虽然输入可以直接人为插入排序,但也习惯做一下
flag=0;
}
if ((PB=(PRINT_SET *)bsearch(str,p,sizeof(p)/sizeof(PRINT_SET),sizeof(p[0]),camp))!=NULL)//bsearch函数二分法查找,提高效率
printf("%s",PB->ss2);//输出字库中要查找的字符串
}
int n=0;
FUN dump;//dump为空函数,闲置菜单用的
FUN fun_0_0,fun_0_1,fun_0_2,fun_0_3,fun_0_4;//菜单列表
FUN fun_1_0,fun_1_1,fun_1_2,fun_1_3,fun_1_4,fun_1_5;
FUN fun_2_0,fun_2_1,fun_2_2,fun_2_3,fun_2_4;
FUN fun_3_0,fun_3_1,fun_3_2,fun_3_3,fun_3_4;
FUN fun_4_0,fun_4_1,fun_4_2,fun_4_3,fun_4_4,fun_4_5,fun_4_6;
FUN fun_5_0,fun_5_1,fun_5_2,fun_5_3,fun_5_4;
FUN fun_6_0,fun_6_1,fun_6_2,fun_6_3,fun_6_4,fun_6_5;
FUN fun_7_0,fun_7_1,fun_7_2,fun_7_3;
void menu(int flag,int ss,void *p,void *p2[]);//菜单信息
/*第一个参数,输入特殊值打破菜单循环(一般设置为0)~第二个参数,初始化读取菜单信息~
第三个参数,附加一个地址(作为传参)~第四个参数,一个地址列表(感觉第三个参数可以省略)~*/
void creat();//创建,追加学生信息
void insert(Student *p);//插入学生信息
void insert_perform(Student *p1,Student *p2);//插入函数执行主体
void del(Student *p);//删除学生信息
void del_perform(Student *p);//函数执行主体
void change(Student *p);//修改学生信息~
void change_perfoem(Student *p);//函数执行主体
void sorting(int k,int (*f)(Student *p1,Student *p2,int k));//排序
int sorting_max_str(Student *p1,Student *p2,int k);//按字符串排序
int sorting_min_str(Student *p1,Student *p2,int k);//按字符串排序
int sorting_max_num(Student *p1,Student *p2,int k);//按数字排序
int sorting_min_num(Student *p1,Student *p2,int k);//按数字排序
void find_one(int k,int (*f)(Student *p1,Student *p2,int k));//查找信息
float fine_average(int k);//查找平均分
void empty_list(void *say);//清空学生信息
void file_set(void *say[],void *st,void (*f)(FILE **fp));
void save(FILE **fp);//保存学生信息
void load(FILE **fp);//读取学生信息
void ch_ferror(FILE **fp,int k);//出错处理(可以完善)
void find_member(void *s,void *p,void *say[],void (*ff)(Student *),int k);//查找信息
/*第一个参数,输入格式字符串~第二个参数,输入地址~第三个参数,提示字库的关键字集合~第四个参数,指针函数(可以提高执行不同的功能)~
第五个参数,指代抽象结构体成员*/
void judge_input(const void *s,const void *p);//判断输入合法性
int judge_continue(char *say1,char *say2);//判断是否继续执行
int judge_empty(char *say1,char *say2);//判断是否为空表
void input(Student *p);//插入学生信息
void print_one(Student *p);//输出单个关键学生信息
void print_set(const void *str);//字库函数
void print_out();//输出所有学生信息
void dump_2(Student *p);//空函数2号
Student *judge_find(void *po,int s,void *say[],void (*ff)(Student *));//查找学生信息,指针函数是为以后插入和删除学生信息作铺垫的
typedef int (*COM)();//设置菜单列表
COM A[][SIZE_FUN]=
{
{fun_0_0,fun_0_1,fun_0_2,fun_0_3,dump,dump,fun_0_4},
{fun_1_0,fun_1_1,fun_1_2,fun_1_3,fun_1_4,dump,fun_1_5},
{fun_2_0,fun_2_1,fun_2_2,fun_2_3,dump,dump,fun_2_4},
{fun_3_0,fun_3_1,fun_3_2,fun_3_3,dump,dump,fun_3_4},
{fun_4_0,fun_4_1,fun_4_2,fun_4_3,fun_4_4,fun_4_5,fun_4_6},
{fun_5_0,fun_5_1,fun_5_2,fun_5_3,dump,dump,fun_5_4},
{fun_6_0,fun_6_1,fun_6_2,fun_6_3,fun_6_4,dump,fun_6_5},
{fun_7_0,fun_7_1,fun_7_2,dump,dump,dump,fun_7_3},
};//菜单函数
COM (*P)[SIZE_FUN]=A;
int main()//主函数
{
menu(-1,0,NULL,NULL);
return 0;
}
int fun_0_0(int ss,void *p,void *p2[])//这个是退出系统选项
{
system("cls");
if (judge_continue("9999","3100"))
exit(0);
return ss;
}
int fun_0_1(int ss,void *p,void *p2[])//缓冲区
{
return 1;
}
int fun_0_2(int ss,void *p,void *p2[])//整理信息(先要判断是否为空表)
{
system("cls");
if (judge_empty("4001","3100"))
return 0;
return 2;
}
int fun_0_3(int ss,void *p,void *p2[])//缓冲区
{
return 3;
}
int fun_0_4(int ss,void *p,void *p2[])//菜单列表
{
printf("请输入:\n");
printf("1:添加\\删除\\修改学生信息\n");
printf("2:整理学生信息:\n");
printf("3:存取(输出)学生信息\n");
printf("0:退出\n");
return ss;
}
int fun_1_0(int ss,void *p,void *p2[])//缓冲区--返回主菜单
{
return 0;
}
int fun_1_1(int ss,void *p,void *p2[])//初始化//追加信息
{
while (judge_continue("3001","3100"))
creat();
Sleep(2000);
return ss;
}
int fun_1_2(int ss,void *p,void *p2[])//按学号插入学生信息
{
char *say[]={"1001","1002","1021"};//备用字库标记
char num[3]="\0";
system("cls");
while (judge_continue("3033","3100"))
find_member("%s",num,say,insert,MEMBER(head->num));
Sleep(2000);
return ss;
}
int fun_1_3(int ss,void *p,void *p2[])//按学号删除学生信息~
{
char *say[]={"1001","1002","1022"};
char num[3]="\0";
system("cls");
while (judge_empty("4001","3100")==0&&judge_continue("3034","3100"))
find_member("%s",num,say,del,MEMBER(head->num));
Sleep(2000);
return ss;
}
int fun_1_4(int ss,void *p,void *p2[])//修改学生信息
{
char *say[]={"1001","1002","1023"};//备用字库标记
char num[3]="\0";
system("cls");
while (judge_continue("3036","3100"))
find_member("%s",num,say,change,MEMBER(head->num));
Sleep(2000);
return ss;
}
int fun_1_5(int ss,void *p,void *p2[])//菜单列表
{
printf("请输入:\n");
printf("1:初始化学生信息\n");
printf("2:按学号插入学生信息\n");
printf("3:按学号删除学生信息\n");
printf("4:按学号修改学生信息\n");
printf("0:返回上一步\n");
return ss;
}
int fun_2_0(int ss,void *p,void *p2[])//缓冲区
{
return 0;
}
int fun_2_1(int ss,void *p,void *p2[])//缓冲区
{
return 4;
}
int fun_2_2(int ss,void *p,void *p2[])//缓冲区
{
return 5;
}
int fun_2_3(int ss,void *p,void *p2[])//缓冲区
{
system("cls");
if (judge_continue("3035","3100"))
empty_list("3101");
Sleep(2000);
return ss;
}
int fun_2_4(int ss,void *p,void *p2[])//菜单列表
{
printf("请选择:\n");
printf("1:查找学生信息\n");
printf("2:排序\n");
printf("3:清空学生信息\n");
printf("0:返回上一步\n");
return ss;
}
int fun_3_0(int ss,void *p,void *p2[])//缓冲区
{
return 0;
}
int fun_3_1(int ss,void *p,void *p2[])//这个是保存信息
{
void *say[]={"3011","3100","1030"};
system("cls");
if (judge_empty("4001","3100"))
{
Sleep(2000);
return ss;
}
file_set(say,"w",save);
Sleep(2000);
return ss;
}
int fun_3_2(int ss,void *p,void *p2[])//这个是读取信息
{
void *say[]={"3012","3100","1031"};
system("cls");
file_set(say,"r",load);
Sleep(2000);
return ss;
}
int fun_3_3(int ss,void *p,void *p2[])//这个是输出信息
{
system("cls");
print_out();
return ss;
}
int fun_3_4(int ss,void *p,void *p2[])//菜单列表
{
printf("请选择:\n");
printf("1:保存学生信息\n");
printf("2:读取学生信息\n");
printf("3:输出学生信息\n");
printf("0:返回上一步\n");
return ss;
}
int fun_4_0(int ss,void *p,void *p2[])//缓冲区
{
return 2;
}
int fun_4_1(int ss,void *p,void *p2[])//查找最高分(如果有多个,则输出多个)
{
system("cls");
printf("最高分的学生信息分为:\n");
find_one(MEMBER(&head->score),sorting_max_num);
system("pause");
return ss;
}
int fun_4_2(int ss,void *p,void *p2[])//查找最低分(如果有多个,则输出多个)
{
system("cls");
printf("最低分的学生信息分为:\n");
find_one(MEMBER(&head->score),sorting_min_num);
system("pause");
return ss;
}
int fun_4_3(int ss,void *p,void *p2[])//查找平均分
{
system("cls");
printf("平均分为:\n");
printf("%.2f\n",fine_average(MEMBER(&head->score)));
system("pause");
return ss;
}
int fun_4_4(int ss,void *p,void *p2[])//这个是按学号查找
{
char *say[]={"1001","1002","1010"};//备用字库标记
char num[3]="\0";
system("cls");
while (judge_continue("3031","3100"))
find_member("%[^\n]%*c",num,say,print_one,MEMBER(head->num));
Sleep(2000);
return ss;
}
int fun_4_5(int ss,void *p,void *p2[])////这个是按姓名查找
{
char *say[]={"1001","1002","1011"};
char s[10]="\0";
system("cls");
while (judge_continue("3032","3100"))
find_member("%[^\n]%*c",s,say,print_one,MEMBER(head->name));
Sleep(2000);
return ss;
}
int fun_4_6(int ss,void *p,void *p2[])
{
printf("请选择:\n");
printf("1:查找最高分\n");
printf("2:查找最低分\n");
printf("3:查找平均分\n");
printf("4:按学号查找\n");
printf("5:按姓名查找\n");
printf("0:返回上一步");
return ss;
}
int fun_5_0(int ss,void *p,void *p2[])
{
return 2;
}
int fun_5_1(int ss,void *p,void *p2[])//这个是按学号排序
{
void *s[]={"3200","3210","3220",sorting_min_str,sorting_max_str,head->num};
system("cls");
menu(0,7,NULL,s);//进入菜单
return ss;
}
int fun_5_2(int ss,void *p,void *p2[])//这个是按姓名排序
{
void *s[]={"3201","3211","3221",sorting_min_str,sorting_max_str,head->name};
system("cls");
menu(0,7,NULL,s);//进入菜单
return ss;
}
int fun_5_3(int ss,void *p,void *p2[])//这个是按成绩排序
{
void *s[]={"3202","3212","3222",sorting_min_num,sorting_max_num,&head->score};
system("cls");
menu(0,7,NULL,s);//进入菜单
return ss;
}
int fun_5_4(int ss,void *p,void *p2[])//菜单管理
{
printf("请选择:\n");
printf("1:按学号排序\n");
printf("2:按姓名排序\n");
printf("3:按成绩排序\n");
printf("0:返回上一步\n");
return ss;
}
int fun_6_0(int ss,void *p,void *p2[])//缓冲区
{
return 0;
}
int fun_6_1(int ss,void *p,void *p2[])//修改学号
{
char *say[]={"2001","0000"};
printf("请输入学生学号");
do
{
judge_input("%s",((Student *)p)->num);
}while (judge_find(((Student *)p)->num,MEMBER(head->num),say,print_one)!=NULL);
printf("修改成功\n");
system("pause");
return ss;
}
int fun_6_2(int ss,void *p,void *p2[])//修改姓名
{
printf("请输入学生姓名");
judge_input("%s",((Student *)p)->name);
printf("修改成功\n");
system("pause");
return ss;
}
int fun_6_3(int ss,void *p,void *p2[])//修改成绩
{
printf("请输入学生成绩");
judge_input("%d",&((Student *)p)->score);
printf("修改成功\n");
system("pause");
return ss;
}
int fun_6_4(int ss,void *p,void *p2[])//修改全部
{
input(p);
n--;//这里,因为调用input函数n会+1,修改完毕后n要-1;
printf("修改成功\n");
system("pause");
return ss;
}
int fun_6_5(int ss,void *p,void *p2[])
{
printf("请选择\n");
printf("1:修改学号\n");
printf("2:修改姓名\n");
printf("3:修改成绩\n");
printf("4:修改全部\n");
printf("0:返回上一步\n");
return ss;
}
int dump(int ss,void *p,void *p2[])
{
return ss;
}
int fun_7_0(int ss,void *p,void *p2[])//这个是过渡缓冲的
{
return 0;
}
int fun_7_1(int ss,void *p,void *p2[])
{
if(judge_continue(p2[1],"3100"))
{
sorting(MEMBER(p2[5]),p2[3]);//升序
printf("排序完毕!\n");
print_set("3100");
}
Sleep(2000);
return 0;
}
int fun_7_2(int ss,void *p,void *p2[])
{
if(judge_continue(p2[2],"3100"))
{
sorting(MEMBER(p2[5]),p2[4]);//降序
printf("排序完毕!\n");
print_set("3100");
}
Sleep(2000);
return 0;
}
int fun_7_3(int ss,void *p,void *p2[])//选择排序方式
{
print_set(p2[0]);
printf("请选择排序方式:\n");
printf("1:升序\n");
printf("2:降序\n");
printf("0:返回菜单\n");
return ss;
}
void menu(int flag,int ss,void *p,void *p2[])//菜单函数
{
while (ss!=flag)
{
char cmd=0;//菜单主体
system("cls");
ss=(*(*(P+ss)+SIZE_FUN-1))(ss,p,p2);
cmd=getch()-'0';
if (cmd<0||cmd>SIZE_FUN-2)
continue;
ss=(*(*(P+ss)+cmd))(ss,p,p2);
fflush(stdin);
}
}
int judge_empty(char *say1,char *say2)//判断是否为空表
{
if (n==0)
{
print_set(say1);
print_set(say2);
if (strcmp(say1,"0000")!=0)
Sleep(2000);
head=NULL;
}
return head==NULL;
}
void judge_input(const void *s,const void *p)//判断输入是否合法
{
while (scanf(s,p)!=1)
{
printf("您输入的数据有误,请重新输入\n");
fflush(stdin);
}
fflush(stdin);
}
void print_one(Student *p)//输出一个学生的信息
{
printf("学号:%3s\t",p->num);
printf("姓名:%-10s\t",p->name);
printf("成绩:%3d\t\n",p->score);
}
int judge_continue(char *say1,char *say2)//判断是否继续执行
{
char ch=0;
while (1)
{
print_set(say1);
ch=getch();
system("cls");
if (ch=='Y'||ch=='y')
return 1;
else if (ch=='N'||ch=='n')
{
print_set(say2);
return 0;
}
else
printf("\n判断只能在Y和N之间选择,请重新输入:");
}
}
Student *judge_find(void *po,int s,void *say[],void (*ff)(Student *))//查找学生信息
{
Student *p=head;
while (p)
{
if (strcmp(po,(char *)p+s)==0&&p!=po)//通过字符串比较
{
print_set(say[0]);
(*ff)(p);//调用指针函数
return p;//这个返回值作用不大~~其实是判断是否找到该学生信息
}
p=p->date;
}
print_set(say[1]);
return NULL;
}
void dump_2(Student *p)//这个空函数是用来缓冲的~
{
}
void creat()//创建//追加信息
{
Student *p=head;
if (judge_empty("0000","0000"))
{
p=head=(Student *)malloc(LEN);//判断空表
head->date=NULL;
head->back=NULL;
}
else
{
while (p->date) //追加信息
{
p->date->back=p;
p=p->date;
}
p->date=(Student *)malloc(LEN);
p->date->back=p;
p=p->date;
p->date=NULL;
}
printf("现在正在创建第%d个学生的信息\n\n",n+1);
input(p);
printf("添加成功……\n");
}
void input(Student *p)//输入信息
{
char *say[]={"2001","0000"};//初始化字库标记
n++;
printf("请输入学生学号");
do
{
judge_input("%s",p->num);
}while (judge_find(p->num,MEMBER(head->num),say,print_one)!=NULL);
printf("请输入学生姓名");
judge_input("%s",p->name);
printf("请输入学生成绩");
judge_input("%d",&p->score);
}
void print_out()//输出信息
{
Student *p=head;
if (judge_empty("4001","3100"))
return;
printf("现在统计人数有%d人\n",n);
while (p)
{
print_one(p);
p=p->date;
}
system("pause");
}
void insert(Student *p)//插入函数
{
Student *pi=NULL;
print_one(p);
printf("\n");
if (judge_continue("3134","3100")==0)
return;
pi=(Student *)malloc(LEN);
input(pi);
insert_perform(p,pi);
printf("插入成功!\n");
return;
}
void insert_perform(Student *p1,Student *p2)//插入执行主体
{
if (p1==head)
{
p2->date=head;
p2->back=NULL;
head->back=p2;
head=p2;
return;
}
p2->back=p1->back;
p1->back->date=p2;
p2->date=p1;
p1->back=p2;
return;
}
void del(Student *p)//删除函数
{
print_one(p);
printf("\n");
if (judge_continue("3135","3100")==0)
return;
del_perform(p);
printf("该学生信息已成功删除!\n");
system("pause");
return;
}
void del_perform(Student *p)//删除执行主体
{
if (p==head&&p->date==NULL)//当只有一个节点时
{
free(p);
head=NULL;
n--;
}
else if (p==head&&p->date!=NULL)//当删除节点在头指针并且不止一个节点时
{
p=p->date;
free(p->back);
p->back=NULL;
head=p;
n--;
}
else if (p->date!=NULL)
{
p->back->date=p->date;//一般情况下
p->date->back=p->back;
free(p);
n--;
}
else
{
p->back->date=NULL;//当删除节点在尾部时
free(p);
n--;
}
}
void change(Student *p)//修改函数
{
print_one(p);
printf("\n");
if (judge_continue("3136","3100")==0)
return;
menu(0,6,p,NULL);//调用菜单
}
void find_member(void *s,void *p,void *say[],void (*ff)(Student *),int k)//按关键信息查找
{
print_set(say[2]);
judge_input(s,p);
judge_find(p,k,say,ff);
}
void empty_list(void *say)//清空信息
{
Student *p=head;
if (judge_empty("4001","3100"))
{
Sleep(2000);
return;
}
while (p->date)
{
p=p->date;
free(p->back);
n--;
}
free(p);
n--;
head=NULL;
print_set(say);
return;
}
float fine_average(int k)//查找平均分
{
Student *p=head;
float ave=0;
while (p)
{
ave+=*((char *)p+k);
p=p->date;
}
return ave/n;
}
void sorting(int k,int (*f)(Student *p1,Student *p2,int k))//排序
{
Student *p1=head;
Student *p2=head;
Student *p3=head;
Student *pt=head;
while (p3->date)
{
p1=p2=p3;
while (p1->date)
{
if (f(p1,p2,k))//具体排序规则
p2=p1;
p1=p1->date;
}
if (p2!=p3)
{
pt=(Student *)malloc(LEN);
*pt=*p2;
insert_perform(p3,pt);//插入
del_perform(p2);//删除
n++;//后续处理~
}
else
p3=p3->date;
}
}
int sorting_max_str(Student *p1,Student *p2,int k)//从大到小排--字符串排序
{
if (strcmp((char *)p1+k,(char *)p2+k)>0)
return 1;
return 0;
}
int sorting_min_str(Student *p1,Student *p2,int k)//从小到大排
{
if (strcmp((char *)p1+k,(char *)p2+k)<0)
return 1;
return 0;
}
int sorting_max_num(Student *p1,Student *p2,int k)//内容排序
{
if (*((char *)p1+k)>*((char *)p2+k))
return 1;
return 0;
}
int sorting_min_num(Student *p1,Student *p2,int k)
{
if (*((char *)p1+k)<*((char *)p2+k))
return 1;
return 0;
}
void find_one(int k,int (*f)(Student *p1,Student *p2,int k))//查找信息
{
Student *p1=head;
Student *p2=head;
while (p1)
{
if (f(p1,p2,k))//具体查找规则
p2=p1;
p1=p1->date;
}
p1=head;
while (p1)
{
if (strcmp((char *)p1+k,(char *)p2+k)==0)
print_one(p1);
p1=p1->date;
}
}
void file_set(void *say[],void *st,void (*f)(FILE **fp))//文件初始化数据~
{
FILE *fp=NULL;
int flag=0;
char s[100]="\0";
if (judge_continue(say[0],say[1])==0)
return;
print_set(say[2]);
judge_input("%[^\n]%*c",s);
if ((fp=fopen(s,st))==NULL)
{
printf("无法打出此文件\n");
print_set("3100");
Sleep(2000);
return;
}
f(&fp);
}
void ch_ferror(FILE **fp,int k)//简单判断文件读写是否出错(这个可以完善)
{
if (ferror(*fp)||k==0)
{
printf("警告,文件录入异常!\n");
system("pause");
clearerr(*fp);
}
}
void save(FILE **fp)//保存数据
{
Student *p=head;
int flag=0;
while (p)
{
ch_ferror(fp,fprintf(*fp,"%s ",p->num));//检查文件是否录入异常
ch_ferror(fp,fprintf(*fp,"%s ",p->name));
ch_ferror(fp,fprintf(*fp,"%d\n",p->score));
p=p->date;
}
printf("保存完毕\n");
fclose(*fp);
print_set("3100");
return;
}
void load(FILE **fp)//读取数据
{
Student *p=head;//
int flag=0;
if (judge_empty("0000","0000")==0)
empty_list("0000");
n=1;
p=head=(Student *)malloc(LEN);//为头节点分配空间
p->back=NULL;
while (1)
{
ch_ferror(fp,fscanf(*fp,"%s ",p->num));
ch_ferror(fp,fscanf(*fp,"%s ",p->name));
ch_ferror(fp,fscanf(*fp,"%d%*c",&p->score));//%*c可以不要~~~
if (feof(*fp))
break;
p->date=(Student *)malloc(LEN);
p->date->back=p;
p=p->date;
n++;
}
n--;
p=p->back;//读取完毕人数要要减1~
free(p->date);
p->date=NULL;
printf("读取完毕\n");
fclose(*fp);
print_set("3100");
return;
}[此贴子已经被作者于2017-1-6 09:23编辑过]

……虽然初学者也许会难以理解,但感觉里面可以学到的东西很多,包括本人做这个的时候~[此贴子已经被作者于2017-1-6 09:27编辑过]
