#include〈stdlib。
h>
#include〈string。
h〉
#definePFprintf
#defineLENsizeof(structstudent)
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆定义结构体◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
structstudent
{
charNO[20];
charname[20];
intage;
charsex[3];/*’F'表示性别男,'M'表示性别女*/
charbirthday[10];
charaddress[30];
charphone[20];
chare_mail[20];
structstudent*next;//下个结点
};
typedefstructstudentSTU;
STU*head=NULL;//全局指针
intn,i=0;//全局变量
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆自定义函数◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidshow_menu();//显示菜单
voidmenu();//执行菜单
voidcreat_stu();//建立链表
voidinsert_stu();//学生信息录入
voidprint_stu();//学生信浏览
voidsearch_NO();//以学号方式查询信息
voidsearch_name();//以姓名方式查询信息
voidarrage_stu();//排序
voiddel_stu();//删除学生信息
voidrevise_stu();//修改学生信息
voidsave();//保存信息
voidmain()
{
creat_stu();
menu();
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆创建链表◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidcreat_stu(){
FILE*fp;
longsize;
STU*p1,*p2;
head=(STU*)malloc(sizeof(STU));
head—〉next=NULL;
if((fp=fopen(”fname。
txt","r”))==NULL)
{
printf("这是新表\n”);
return;
}
fseek(fp,0L,2);
size=ftell(fp);
if(!
size)
{
printf(”这是空表\n");
return;
}//开始创建链表
rewind(fp);//移动到文件首
p2=head—〉next;//找到但前位置
while(!
feof(fp))
{
p1=(STU*)malloc(sizeof(STU));
fscanf(fp,"%s%s%d%s%s%s%s%s\n”,p1-〉NO,p1—>name,&p1—〉age,\
p1-〉sex,p1—〉birthday,p1—〉address,p1->phone,p1->e_mail);
p1->next=NULL;
//创建节点完
if(head—>next==NULL)
head—>next=p1;
else
p2—〉next=p1;
p2=p1;
n++;
}
p2-〉next=NULL;
fclose(fp);
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆执行菜单◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidmenu()
{
intc;
show_menu();
while
(1)
{
scanf("%d",&c);
switch(c)
{
getchar();
case1:
insert_stu();break;
case2:
print_stu();break;
case3:
search_NO();break;
case4:
search_name();break;
case5:
del_stu();break;
case6:
revise_stu();break;
case7:
arrage_stu();break;
case0:
exit(0);
}//执行菜单选项
show_menu();
}
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆显示菜单◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidshow_menu()
{
PF(”\n”);
PF("\n※※※※※※※※※※※※※※※※※※菜单※※※※※※※※※※※※※※※※※※\n");
PF(”\t\t◆1。
输入学生信息◆\n”);
PF(”\t\t★2。
浏览学生信息★\n");
PF("\t\t◆3.以学号方式查询信息◆\n”);
PF(”\t\t★4。
以姓名方式查询信息★\n");
PF(”\t\t◆5.删除学生信息◆\n”);
PF(”\t\t★6。
修改学生信息★\n");
PF("\t\t◆7排序◆\n");
PF(”\t\t★0。
退出★\n");
PF(”※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n”);
PF(”\n请选择\n”);
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生信息录入◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidinsert_stu()//学生信息录入
{
n=0;
STU*p1=NULL,*p2=NULL;
p1=(STU*)malloc(sizeof(STU));
PF("\n※※※※※※※※※※※※※※※※※※录入学生信息※※※※※※※※※※※※※※※※※※\n");//录入学生信息
PF(”\t\t输入学生学号:
\t");
scanf("%s”,p1—〉NO);//学号
PF("\t\t输入学生姓名:
\t");
scanf(”%s",p1—>name);//姓名
PF(”\t\t输入学生年龄:
\t");
scanf(”%d",&p1-〉age);//年龄
PF(”\t\t输入学生性别:
\t”);
scanf(”%s”,p1->sex);//性别
PF(”\t\t输入学生出生年月:
\t”);
scanf("%s",p1->birthday);//出生年月
PF("\t\t输入学生地址:
\t”);
scanf("%s”,p1—>address);//地址
PF("\t\t输入学生电话:
\t”);
scanf(”%s”,p1—>phone);//电话
PF(”\t\t输入学生E-mail:
\t");
scanf(”%s",p1->e_mail);//E—mail
n++;
if(head—〉next==NULL)
{
head=(STU*)malloc(LEN);
head—〉next=p1;
}
else
{
for(p2=head;p2-〉next!
=NULL;p2=p2->next);/*找到最后的结点,然后
将增加的结点挂在它上面*/
p2-〉next=p1;
}
p1—〉next=NULL;
save();//保存到文件
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生信息浏览◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidprint_stu()//学生信浏览
{
STU*p=NULL;
if(head==NULL)//判断链表是否为空
{
PF("文档中无记录!
\n”);
return;
}
for(p=head-〉next;p!
=NULL;p=p-〉next)//读出信息
{
PF("※※※※※※※※※※※※※※※※※※学生信息浏览※※※※※※※※※※※※※※※※※※\n");
PF(”\t\t学生学号:
\t%s\n",p-〉NO);
PF("\t\t学生姓名:
\t%s\n”,p->name);
PF(”\t\t学生年龄:
\t%d\n”,p-〉age);
PF(”\t\t学生性别:
\t%s\n”,p-〉sex);
PF(”\t\t学生出生年月:
\t%s\n”,p—〉birthday);
PF(”\t\t学生地址:
\t%s\n”,p—〉address);
PF(”\t\t学生电话:
\t%s\n",p->phone);
PF("\t\t学生E-mail:
\t%s\n",p—>e_mail);
PF(”\n”);}//输出信息
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生姓名信息查找◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidsearch_name()//学生姓名信息查找
{
STU*p=NULL;
charname[20];
if(head==NULL)//判断链表是否为空
{
PF(”文档中无记录!
\n");
return;
}
PF(”输入学生姓名:
”);
scanf(”%s",name);
for(p=head—>next;p!
=NULL;p=p—>next)//读出信息
{
if(!
strcmp(p—〉name,name))
{PF(”※※※※※※※※※※※※※※※※※※您查找的学生是※※※※※※※※※※※※※※※※※※\n”);
PF("\t\t学生学号:
\t%s\n”,p—〉NO);
PF(”\t\t学生姓名:
\t%s\n”,p—〉name);
PF("\t\t学生年龄:
\t%d\n”,p—〉age);
PF(”\t\t学生性别:
\t%s\n",p—〉sex);
PF(”\t\t学生出生年月:
\t%s\n”,p—>birthday);
PF(”\t\t学生地址:
\t%s\n”,p->address);
PF("\t\t学生电话:
\t%s\n",p—>phone);
PF("\t\t学生E—mail:
\t%s\n”,p—〉e_mail);
PF(”\n”);
i=1;}
}//输出信息
if(!
i)
{PF(”无该生信息!
请查证:
");}//没找到信息时的处理
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生学号信息查找◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidsearch_NO()//学生学号信息查找
{
STU*p=NULL;
charNO[20];
if(head==NULL)//判断链表是否为空
{
PF(”文档中无记录!
\n”);
return;
}
PF("请输入学生学号:
”);
scanf("%s",NO);
for(p=head->next;p!
=NULL;p=p—>next)//读出信息
{
if(!
strcmp(p—>NO,NO))
{PF(”※※※※※※※※※※※※※※※※※※您查找的学生是※※※※※※※※※※※※※※※※※※\n");
PF(”\t\t学生学号:
\t%s\n”,p—〉NO);
PF("\t\t学生姓名:
\t%s\n",p-〉name);
PF(”\t\t学生年龄:
\t%d\n",p->age);
PF(”\t\t学生性别:
\t%s\n”,p—〉sex);
PF(”\t\t学生出生年月:
\t%s\n",p—〉birthday);
PF(”\t\t学生地址:
\t%s\n",p—〉address);
PF("\t\t学生电话:
\t%s\n”,p—〉phone);
PF(”\t\t学生E-mail:
\t%s\n",p->e_mail);
PF(”\n”);
i=1;}
}//输出信息
if(!
i)
{PF("无该生信息!
请查证:
”);}//没找到信息时的处理
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆修改学生信息◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidrevise_stu()
{
STU*p=NULL;
if(head==NULL)//判断链表是否为空
{
PF(”文档中无记录!
\n”);
return;
}
charNO[20];
PF("请输入学生的学号:
\t”);
scanf(”%s”,NO);
for(p=head—〉next;p!
=NULL;p=p—〉next)
{
if(!
strcmp(p—〉NO,NO))//验证信息是否正确
{
PF(”※※※※※※※※※※※※※※※※※※您要修改的学生是※※※※※※※※※※※※※※※※※※\n”);
PF(”\t\t学生学号:
\t%s\n",p->NO);
PF(”\t\t学生姓名:
\t%s\n”,p-〉name);
PF(”\t\t学生年龄:
\t%d\n",p-〉age);
PF("\t\t学生性别:
\t%s\n”,p—>sex);
PF(”\t\t学生出生年月:
\t%s\n”,p—〉birthday);
PF(”\t\t学生地址:
\t%s\n",p—〉address);
PF("\t\t学生电话:
\t%s\n",p—〉phone);
PF(”\t\t学生E—mail:
\t%s\n”,p—>e_mail);
PF(”\n");//输出要修改信息
i=1;
PF(”※※※※※※※※※※※※※※※※※※修改学号为%s的学生※※※※※※※※※※※※※※※※※※\n”,NO);
strcpy(p-〉NO,NO);
PF("\t\t输入修改学生姓名:
\t");
scanf("%s”,p—>name);
PF(”\t\t输入修改学生年龄:
\t”);
scanf(”%d”,&p—>age);
PF(”\t\t输入修改学生性别:
\t”);
scanf(”%s",p—>sex);
PF(”\t\t输入修改学生出生年月:
\t");
scanf(”%s”,p—>birthday);
PF(”\t\t输入修改学生地址:
\t”);
scanf("%s",p-〉address);
PF(”\t\t输入修改学生电话:
\t");
scanf("%s",p—〉phone);
PF("\t\t输入修改学生E—mail:
\t”);
scanf(”%s”,p—>e_mail);
PF("\n");//输入修改信息
save();
}
}if(!
i)
{PF("无该生信息!
请查证:
”);}/*没找到信息时的处理*/
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆删除学生信息◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voiddel_stu()
{
STU*p=NULL;
if(head==NULL)//判断链表是否为空
{
PF(”文档中无记录!
\n”);
return;
}
else
{
charNO[20];
PF(”请输入学生的学号:
\t");
scanf(”%s”,NO);
for(p=head;p!
=NULL;p=p—〉next)
{
if(!
strcmp(p-〉next—〉NO,NO))//验证信息是否正确
{
PF(”※※※※※※※※※※※※※※※※※※您要删除的学生是※※※※※※※※※※※※※※※※※※\n”);
PF(”\t\t学生学号:
\t%s\n”,p-〉next—〉NO);
PF(”\t\t学生姓名:
\t%s\n",p—〉next—〉name);
PF(”\t\t学生年龄:
\t%d\n",p—>next->age);
PF(”\t\t学生性别:
\t%s\n”,p—〉next—>sex);
PF(”\t\t学生出生年月:
\t%s\n",p—〉next—〉birthday);
PF("\t\t学生地址:
\t%s\n",p—>next-〉address);
PF("\t\t学生电话:
\t%s\n”,p->next—〉phone);
PF(”\t\t学生E—mail:
\t%s\n”,p—>next—〉e_mail);
PF("\n”);//输出要删除的信息
i=1;
if(p-〉next—〉next)
{
printf("第一个\n”);
p—〉next=p—>next—〉next;
}
else
p—〉next=NULL;
n-—;
save();
return;
}if(!
i)
{PF(”无该生信息!
请查证:
”);//没找到信息时的处理
return;}
}
}
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆按学号排序◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidarrage_stu()
{
STU*p1,*p2;
intin=0,j;
if(head—〉next==NULL)//首先判断
{
printf(”你还没有记录,无法排序\n”);
return;
}
printf("n=%d”,n);
p1=head—〉next;
for(in=0;infor(j=0,p1=head—>next;j<=n-in—3;p1=p1-〉next,j++)
{
if(j==0)//第一次比较第一个和第二个节点信息
{
if(strcmp(p1-〉NO,p1—>next->NO))//比较p1本身和p1下一个节点
{
p2=p1—〉next;
p1—〉next=p1-〉next—〉next;
p2-〉next=p1;
head—〉next=p2;
p1=head->next;//从新给CUR赋值
/*
p1=head—〉next;
p1=p2;
错误:
如果一个变量=他前一个节点的NEXT那么不可以说把另外一个变量赋给它就可以改变它
前一个节点的NEXT他只能操作后节点!
!
!
*/
}
}
if(strcmp(p1—>next->NO,p1->next—>next-〉NO))//比较p1下一个和p1下两个节点
{
p2=p1—>next;
p1—>next=p1—>next-〉next;
p2—〉next=p1—>next—>next;
p1-〉next—〉next=p2;
}
}
if(strcmp(head-〉next-〉NO,head-〉next—>next—〉NO))//只有两个节点信息时直接比较他们两个
{
p1=head-〉next;
head-〉next=p1—〉next;
p1—>next=p1—〉next—〉next;
head—>next->next=p1;
if(n==2)//只有两个节点信息时把第二个节点的next赋为空
head—>next-〉next->next=NULL;
}
}
//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆保存信息◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
voidsave()
{
printf("※※※※※※※※※※※※※※※※※※保存信息并结束※※※※※※※※※※※※※※※※※※\n”);
STU*p=NULL;
FILE*fp;
char*filename=”fname。
txt”;
if((fp=fopen(”fname。
txt”,”w”))==NULL)//出错检测
{
printf("\n打不开文件!
\n”);
return;
}
if(head—>next==NULL)
{
printf("\n信息为空!
\n");
return;
}
else
p=head—〉next;
while(p!
=NULL)
{
fprintf(fp,”%s%s%d%s%s%s%s%s\n”,p-〉NO,p-〉name,p—〉age,
p-〉sex,p-〉birthday,p—>address,p—>phone,p-〉e_mail);//存入文件
p=p—>next;
}
printf(”保存完毕!
\n”);
fclose(fp);
}