1.对于学生管理系统,能够实现的方法有许多,但是今天我们用链表的方法来实现。虽然初学者很可能看不懂,但是不要紧,这是要在整体的系统的学习完C语言之后,我才编写出的程序。所以大家不必要担心。在这里与大家分享我的学生管理系统的链表的实现过程。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{
char bianhao[];
char name[];
struct student *next;
};
struct student *creat()//创建链表
{
struct student *head,*p,*end;
head=p=end=(struct student*)malloc(sizeof(struct student));
printf("请输入学生的编号:\n");
scanf("%s",p->bianhao);
while(strcmp(p->bianhao,"")!=)
{
end=p;
printf("请输入学生的姓名\n");
scanf("%s",p->name);
p=(struct student *)malloc(sizeof(struct student));
end->next=p;
printf("请输入学生的编号\n");
scanf("%s",p->bianhao);
}
end->next=NULL;
}
void save(struct student *head)//将链表保存为文件形式
{
FILE *fp;
struct student *p;
char filename[];
int ch;
printf("请输入要保存的文件名\n");
scanf("%s",filename);
if(fp=fopen(filename,"r")!=NULL)
{
printf("该文件已经存在,是否覆盖?\n");
printf("1-覆盖,2-不覆盖\n");
scanf("%d",&ch);
if(ch!=)
{
printf("请重新输入要保存的文件名\n");
scanf("%s",filename);
}
}
if(fp=fopen(filename,"w")==NULL)
{
printf("创建文件失败\n");
}
p=head;
while(p!=NULL)
{
fprintf(fp,"%s\n",p->bianhao);
fprintf(fp,"%s\n",p->name);
p=p->next;
}
fputs("over",fp);
printf("文件保存成功\n");
fclose(fp);
}
void output(struct student *head)//输出链表
{
struct student *p;
p=head;
if(p==NULL)
{
printf("没有创建任何记录\n");
}
while(p!=NULL)
{
printf("%s",p->bianhao);
printf("%s",p->name);
p=p->next;
}
}
struct student *openfile()//打开文件,即新创建连表读取链表文件
{
struct student *head,*p,*f;
FILE *fp;
char filename[];
int ch;
printf("请输入想要打开的文件名\n");
scanf("%s",filename);
if(fp=fopen(filename,"r")==NULL)
{
printf("打开文件失败\n");
printf("1-请重新输入文件名\n2-退出");
scanf("%d",&ch);
if(ch==)
scanf("%s",filename);
else if(ch==)
return NULL;
}
head=p=f=(struct student *)malloc(sizeof(struct student));
fscanf(fp,"%s%s",p->bianhao,p->name);
while(!feof(fp))
{
p=(struct student *)malloc(sizeof(struct student));
f->next=p;//用以节点的链接,是f节点的下一个是p节点,从而就将p,与f联系起来了
fscanf(fp,"%s%s",p->bianhao,p->name);
if(strcmp(p->bianhao,"over")==)
{
f->next=NULL;
printf("文件打开成功\n");
}
f=p;
}
}
void sort_hao(struct student *head)//按照标号排序
{
struct student *p,*f,*t;
char ch[];
int i;
p=f=t=head;
if(head==NULL)
{
printf("没有打开任何文件\n");
}
for(p=head;p->next!=NULL;p=p->next)
{
for(t=head;f=t->next;t=t->next,f=f->next)
{
if(strcmp(t->bianhao,f->bianhao)>)
{
strcpy(ch,t->bianhao);
strcpy(t->bianhao,f->bianhao);
strcpy(f->bianhao,ch); strcpy(ch,t->name);
strcpy(t->name,f->name);
strcpy(f->name,ch);
}
}
}
printf("排序完成\n");
}
void sort_name(struct student *head)//按照姓名排序
{
struct student *p,*f,*t;
char ch[];
int i;
p=f=head=t;
if(head=NULL)
{
printf("文件未能打开\n");
}
for(p=head;p->next!=NULL;p=p->next)
{
for(t=head;f=t->next!=NULL;t=t->next,f=f->next)
{
if(strcmp(t->name,f->name)>)
{
strcpy(ch,t->bianhao);
strcpy(t->bianhao,f->bianhao);
strcpy(f->bianhao,ch); strcpy(ch,t->name);
strcpy(t->name,f->name);
strcpy(f->name,ch);
}
}
}
printf("完成排序\n");
}
void search(struct student *head)//查询
{
struct student *p;
char str[];
int i,j=;
p=head;
if(head==NULL)
{
printf("没有打开任何文件\n");
}
printf("1-按照编号查询\n2-按照姓名查询\n");
scanf("%d",&i);
if(i=)
{
printf("请输入学生的编号\n");
}
else
{
printf("请输入学生的姓名\n");
}
scanf("%s",str);
while(p!=NULL)
{
if(i==)
{
if(strcmp(p->bianhao,str)==)
{
printf("编号:%s\n姓名:%s\n",p->bianhao,p->name);
j=;
break;
}
}
if(i==)
{
if(strcmp(p->name,str)==)
{
printf("编号:%s\n姓名:%s\n",p->name,p->name);
j=;
}
}
p=p->next;
}
if(j==)
{
printf("查找完毕,没有找到任何结果\n");
}
}
struct student *add(struct student *head)//添加学生的信息
{
struct student *p,*e,*f,*h;
if(head==NULL)
{
printf("打开文件失败\n");
}
h=e=f=head;
p=(struct student *)malloc(sizeof(struct student));//新添加节点,即新添加记录
printf("编号:\n");
scanf("%s",p->bianhao);
printf("姓名:\n");
scanf("%s",p->name);
if(strcmp(f->bianhao,p->bianhao)>)
{
p->next=f;
h=p;
printf("添加成功\n");
}
if(f->next=NULL)
{
f->next=p;
p->next=NULL;
printf("添加成功\n");
}
while(f->next!=NULL)
{
if(f->next==NULL)
{
f->next=p;
p->next=NULL;
printf("添加成功\n");
}
}
}
struct student *delete_mem(struct student *head)//删除个人信息
{
struct student *p,*e;
char str[];
if(head==NULL)
{
printf("未能打开任何文件\n");
}
p=e=head;
printf("请输入要删除的编号\n");
scanf("%s",str);
if(strcmp(p->bianhao,str)==)
{
head=head->next;
printf("删除成功\n");
}
p=p->next;
while(p!=NULL)
{
if(strcmp(p->bianhao,str)==)
{
if(p->next!=NULL)
e->next=p->next;
if(p->next==NULL)
e->next=NULL;
printf("删除成功\n");
}
p=p->next;
e=e->next;
}
printf("搜索完毕,未能找到结果\n");
}
struct student *change(struct student *head)//修改学生的信息
{
struct student *p;
char str[];
if(head==NULL)
{
printf("未能打开任何文件\n");
}
p=head;
printf("请输入要修改的学生编号\n");
scanf("%s",p->bianhao);
while(p!=NULL)
{
if(strcmp(p->bianhao,str)==)
{
printf("编号:%s\n姓名:%s\n",p->bianhao,p->name);
printf("请按照提示操作\n");
printf("编号\n");
scanf("%s",p->bianhao);
printf("姓名\n");
scanf("%s",p->name);
}
p=p->next;
}
printf("未能找到记录\n");
}
void mima()//密码的加密
{
FILE *fp;
char mima1[],mima2[];
int i=;
if(fp=fopen("mima","r")==NULL)
{
printf("密码尚未创建\n");
do
{
printf("请输入密码\n");
scanf("%s",mima1);
printf("请在此输入密码\n");
scanf("%s",mima2);
if(strcmp(mima1,mima2)!=)
{
printf("两次输入的密码不同,请重新输入\n");
i=;
}
else
break;
}while(i);
fp=fopen("mima","w");
fprintf(fp,"%s",mima1);
printf("密码试制成功\n");
fclose(fp);
}
else
printf("密码以创建\n");
}
void delete_doc()//文件的删除操作
{
FILE *fp;
char mima1[],mima2[],filename[];
printf("请输入初始密码\n");
scanf("%s",mima1);
fp=fopen("mima1","r");
fscanf(fp,"%s",mima2);
if(strcmp(mima1,mima2)==)
{
printf("请输入要删除的文件名\n");
scanf("%s",filename);
if(remove(filename)==)//remove函数的应用?
{
printf("删除成功\n");
}
else
{
printf("删除失败");
}
}
else
printf("密码错误\n");
}
void output_use()
{
printf("使用方法如下\n");
printf("1-编辑个人信息之后需要保存,否则再次启动时会覆盖\n");
printf("2-保存信息后,若要在原文件中添加,则需要先打开文件功能,然后再添加记录,然后再保存\n");
printf("3-除了新建文件之外,进行其他功能,先打开文件才能继续\n");
printf("4-编辑个人信息时,以学号0作为结束,故学生学号是没有为0的\n");
printf("5-由于本系统的缺陷,故在保存前需要保存一个学生的信息\n");
}
void output_view()//功能表
{
printf("==========================\n");
printf("0-使用说明\n");
printf("1-编辑学生的信息\n");
printf("2-保存学生的信息\n");
printf("3-显示学生的信息\n");
printf("4-打开记录\n");
printf("5-将记录排序\n");
printf("6-查询记录\n");
printf("7-添加记录\n");
printf("8-删除记录\n");
printf("9-修改记录\n");
printf("a-设置密码\n");
printf("b-删除文件\n");
printf("==========================\n");
}
void main()//主函数
{
struct student *head=NULL;
char ch;
int i,j=;
printf("欢迎使用本系统,按回车键进入系统\n");
getchar();
system("cls");
do
{
output_view();
printf("请选择相应的操作\n");
scanf("%c",&ch);
switch(ch)
{
case '':output_use();break;
case '':head=creat();break;
case '':save(head);break;
case '':output(head);break;
case '':head=openfile();break;
case '':system("cls");
printf("1-按照编号排序\n");
printf("2-按照姓名排序\n");
scanf("%d",&i);
switch(i)
{
case :sort_hao(head);break;
case :sort_name(head);break;
}
break;
case '':search(head);break;
case '':head=add(head);break;
case '':head=delete_mem(head);break;
case '':head=change(head);break;
case 'a':mima();break;
case 'b':delete_doc();break;
}
printf("按回车键返回\n");
getchar();
system("cls");
j=;
}while(j);
}
2.希望与大家共同努力,共同上进。
长风破浪会有时,直挂云帆济沧海!