主要思想,main函数开始的时候从文件中读取数据,然后把数据做成一个链表存放到内存。然后开始通过菜单选项进行想要的操作(增加信息,修改信息,删除信息·····)。最后要推出程序的时候删除存放数据的文件,然后在创建一个文件把操作后的数据依次写入文件中。(练手程序,没什么技术含量!)
void delete(stul *h); //删除学生信息
int main(void)
{
stul *h;
h=create();
openfile(h);
while(1)
{
switch(menu())
{
case 1:append(h); break;
case 2:search(h); break;
case 3:modify(h); break;
case 4:delete(h); break;
case 5:out(h); break;
case 6:savetofile(h); exit(0); break;
}
}
}
void delete(stul *h) //删除学生信息
{
stul *p,*l;
int num;
char ch;
p=h;
l=p->next;
printf("请输入需要删除的学生学号:");
while(scanf("%d",&num)!=1)
{
while(ch=getchar()!='\n');
printf("请输入需要删除的学生学号(001 002 003):");
}
while(l!=NULL)
{
if(l->stuinfo.num==num)
{
p->next=p->next->next;
free(l);
break;
}
l=l->next;
p=p->next;
}
}
void modify(stul *h) //修改学生信息
{
stul *p;
int num;
char ch;
p=h->next;
while(p!=NULL)
{
printf("请输入需要修改学生信息的学号:");
while(scanf("%d",&num)!=1)
{
while(ch=getchar()!='\n');
printf("请输入需要修改学生信息的学号(001 002 003):");
}
if(p->stuinfo.num==num)
{
printf("请输入需要修改的姓名:");
scanf("%s",&p->stuinfo.name);
break;
}
else
p=p->next;
}
}
void search(stul *h) //根据学号查询信息
{
stul *p;
int num;
char ch;
p=h->next;
printf("请输入需要查询的学号:");
while(scanf("%d",&num)!=1)
{
while(ch=getchar()!='\n');
fprintf(stdout,"请输入需要查询的学号(001 002 003)");
}
while(p!=NULL)
{
if(p->stuinfo.num==num)
{
printf("学号:%d; 姓名:%s\n",p->stuinfo.num,p->stuinfo.name);
break;
}
else
p=p->next;
}
}
int main(void)
{
stul *h;
h=create();
openfile(h);
while(1)
{
switch(menu())
{
case 1:append(h); break;
case 2:search(h); break;
case 3:modify(h); break;
case 4:delete(h); break;
case 5:out(h); break;
case 6:savetofile(h); exit(0); break;
}
}
}
void delete(stul *h) //删除学生信息
{
stul *p,*l;
int num;
char ch;
p=h;
l=p->next;
printf("请输入需要删除的学生学号:");
while(scanf("%d",&num)!=1)
{
while(ch=getchar()!='\n');
printf("请输入需要删除的学生学号(001 002 003):");
}
while(l!=NULL)
{
if(l->stuinfo.num==num)
{
p->next=p->next->next;
free(l);
break;
}
l=l->next;
p=p->next;
}
}
void modify(stul *h) //修改学生信息
{
stul *p;
int num;
char ch;
p=h->next;
while(p!=NULL)
{
printf("请输入需要修改学生信息的学号:");
while(scanf("%d",&num)!=1)
{
while(ch=getchar()!='\n');
printf("请输入需要修改学生信息的学号(001 002 003):");
}
if(p->stuinfo.num==num)
{
printf("请输入需要修改的姓名:");
scanf("%s",&p->stuinfo.name);
break;
}
else
p=p->next;
}
}
void search(stul *h) //根据学号查询信息
{
stul *p;
int num;
char ch;
p=h->next;
printf("请输入需要查询的学号:");
while(scanf("%d",&num)!=1)
{
while(ch=getchar()!='\n');
fprintf(stdout,"请输入需要查询的学号(001 002 003)");
}
while(p!=NULL)
{
if(p->stuinfo.num==num)
{
printf("学号:%d; 姓名:%s\n",p->stuinfo.num,p->stuinfo.name);
break;
}
else
p=p->next;
}
}
比较有用的检测输入算法:
1 while(scanf("%d",&num)!=1) 2 { 3 while(ch=getchar()!='\n'); 4 fprintf(stdout,"请输入需要查询的学号(001 002 003)"); 5 }
有两个循环来接收输入的一个int型的变量。第一个循环是判断接收的数据是否是一个整型,如果不是继续接收;第二个循环是接收错误的数据,知道下一个换行符是停止接收!
void savetofile(stul *h) //把链表中的信息放入文件中
{
FILE *fp;
stul *p;
struct stu stuinfo;
remove("stuinfo.txt");
fp=fopen("stuinfo.txt","wb");
p=h->next;
while(p!=NULL)
{
fwrite(&p->stuinfo,sizeof(stuinfo),1,fp);
p=p->next;
}
}
void out(stul *h) //输出学生信息
{
stul *p;
p=h;
p=p->next;
while(p!=NULL)
{
printf("学号:%d;姓名:%s;\n",p->stuinfo.num,p->stuinfo.name);
p=p->next;
}
}
stul *create() //创建链表
{
stul *p;
p=(stul *)malloc(sizeof(stul));
p->next=NULL;
return p;
}
void openfile(stul *h) //把文件中的内容做成一个链表
{
FILE *fp;
struct stu stuinfo;
stul *p,*l;
p=h;
if((fp=fopen("stuinfo.txt","rb"))==NULL)
fprintf(stdout,"sorry cound not open stuinfo.txt file");
else
{
while(fread(&stuinfo,sizeof(stuinfo),1,fp)==1)
{
l=create();
l->stuinfo=stuinfo;
p->next=l;
p=l;
}
}
}
void append(stul *h) //添加学生信息
{
stul *p,*l;
struct stu stuinfo;
int num;
char name[20];
char ch,y;
p=h;
while(p->next!=NULL)
p=p->next;
do
{
puts("请输入学号(001 002 003):");
while(scanf("%d",&num)!=1)
{
while(ch=getchar()!='\n');
fprintf(stdout,"请输入学号(001 002 003):");
}
printf("\n请输入姓名:");
scanf("%s",stuinfo.name);
l=create();
stuinfo.num=num;
//stuinfo.name=name;
l->stuinfo=stuinfo;
p->next=l;
p=l;
getchar();
fprintf(stdout,"是否继续添加?(y/n)");
y=getchar();
}
while(y=='y'||y=='Y');
}
int menu() //菜单
{
int num;
char ch;
puts("please choose the following chooses!");
puts("\t1.append student`s info.");
puts("\t2.search student's info from name.");
puts("\t3.modify student's info.");
puts("\t4.delete student's info.");
puts("\t5.out student's info.");
puts("\t6.exit.");
while(scanf("%d",&num) != 1 || num>6 || num<1) //获取整数
{
while(ch=getchar()!='\n');
printf("please input your choose as 1 2 ...5 6\n");
}
return num;
}