更新时间2018-03-06 19:55:30
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
typedef struct Student
{
int number[4];
char name[20];
char sex;
int grade;
char major[20];
}Student;//学生信息(学号,姓名,性别,年级,专业)
typedef struct Lstudent
{
Student *stu;
Lstudent *next;
}Lstudent,*Linkliststu;//学生信息链表节点的定义
Lstudent *s_head=NULL;
void LinklistCreat()
{
FILE *fp1;
char ch;
if((fp1=fopen("stu.dat","wb"))==NULL)
{
printf("cannot open the file");
return;
}
Lstudent *p=s_head;//当前结点
do{while(s_head!=NULL&&p->next!=NULL)
{p=p->next;}
Lstudent *node=(Lstudent *)malloc(sizeof(Lstudent));//创建一个新节点
if(s_head==NULL)
{s_head=node;}
else
{p->next=node;}
printf("输入该学生的学号:");
scanf("%s",node->stu->number);
printf(" 输入该学生的姓名:");
scanf("%s",node->stu->name);
printf(" 输入该学生的性别:");
scanf("%c",&node->stu->sex);
printf(" 输入该学生的年级:");
scanf("%d",&node->stu->grade);
printf(" 输入该学生的专业:");
scanf("%s",node->stu->major);
printf("学生信息录入成功");
node->next=NULL;
if(fwrite(node,sizeof(struct Lstudent),1,fp1)!=1)
printf("cannot open the file");
printf("是否继续输入 y or n");
ch=getchar();}while(ch=='y'||ch=='Y');
}//添加学生信息加入链表——从尾部加入--并存入文件fp1中--"stu.dat"
void LinklistChange()
{
Lstudent *q=s_head;
int b=0;
char ck;
int ch[4];
FILE *fp;//原文件指针
FILE *fp2;//暂时文件指针
do{if((fp=fopen("stu.dat","wb"))==NULL)
{
printf("cannot open the file");
return;
}
if((fp2=fopen("temp.dat","wb"))==NULL)
{
printf("cannot open the file");
return;
}
printf("请输入要修改学生信息的学号");
scanf("%s",ch);
while(fread(q,sizeof(struct Lstudent),1,fp)==1)
{
if(q->stu->number==ch)
{
b++;
printf("学号,姓名,性别,年级,专业");
printf("%s,%s,%c,%d,%s",q->stu->number,q->stu->name,q->stu->sex,q->stu->grade,q->stu->major);
printf("请输入新的学生信息");
printf("请输入新的学号:");
scanf("%s",&q->stu->number);
printf(" 请输入新的姓名:");
scanf("%s",&q->stu->name);
printf(" 请输入新的性别:");
scanf("%c",&q->stu->sex);
printf(" 请输入新的年级:");
scanf("%s",&q->stu->grade);
printf(" 请输入新的专业:");
scanf("%s",&q->stu->major);
fwrite(q,sizeof(struct Lstudent),1,fp2);
q=q->next;
}
else
{
fwrite(q,sizeof(struct Lstudent),1,fp2);
q=q->next;
}
}
if(b==0)
printf("修改失败,没有找到相关信息");
rewind(fp);
q=s_head;//如果继续修改的话,要把标记移动到文件开头
printf("是否要继续修改 y or n");
ck=getchar();
fclose(fp);
fclose(fp2);
remove("stu.dat");
rename("temp.dat","stu.dat");}while(ck=='y'||ck=='Y');
if(b==1)
printf("修改成功");
}//修改学生信息--定义另一个文件,把要修改的信息放到该文件中,然后把其余的信息复制到该文件中;
//然后把其余的信息复制到该文件中;并把该文件从新命名为原来的名字并把原来的文件移除
void LinklistDelete()
{
int b=0;
Lstudent *q=s_head;
FILE *fp3;//原文件指针
FILE *fp4;//暂时文件指针
int ch[4];
char ck;
do{ if((fp3=fopen("stu.dat","wb"))==NULL)
{
printf("cannot open the file");
return;
}
if((fp4=fopen("temp.dat","wb"))==NULL)
{
printf("cannot open the file");
return;
}
printf("请输入要删除的学生的编号");
scanf("%s",ch);
while(fread(q,sizeof(struct Lstudent),1,fp3))
{
if(q->stu->number!=ch)
{
fwrite(q,sizeof(struct Lstudent),1,fp4);
q=q->next;
}
else
{q=q->next;
b++;
}
}
if(b==0)
printf("删除失败");
rewind(fp3);
fclose(fp3);
fclose(fp4);
remove("stu.dat");
rename("temp.dat","stu.dat");
printf("是否需要继续删除 y or n");
ck=getchar();}while(ck=='y'||ck=='Y');
if(b==1)
printf("删除成功");
}//删除学生信息--原理与修改类似
void main()
{
char ch;
printf("*******学生兴趣爱好管理系统******* ");
printf("***输入1--添加兴趣类别*** ");
printf("***输入2--删除兴趣类别*** ");
printf("***输入3--修改兴趣类别*** ");
printf("***输入4--添加兴趣项*** ");
printf("***输入5--删除兴趣项*** ");
printf("***输入6--修改兴趣项*** ");
printf("***输入7--添加学生信息*** ");
printf("***输入8--删除学生信息*** ");
printf("***输入9--修改学生信息*** ");
printf("***输入10--给学生添加兴趣*** ");
printf("***输入11--删除学生的兴趣*** ");
printf("***输入12--输入学号查询该学生的信息和号码*** ");
printf("***输入13--输入爱好查出有此爱好的学生信息*** ");
scanf("%c",&ch);
switch(ch)
{
case '1'://添加兴趣类别
break;
case '2'://删除兴趣类别
break;
case '3'://修改兴趣类别
break;
case '4'://添加兴趣项
break;
case '5'://删除兴趣项
break;
case '6'://修改兴趣项
break;
case '7'://添加学生信息
LinklistCreat();
break;
case '8'://删除学生信息
LinklistDelete();
break;
case '9'://修改学生信息
LinklistChange();
break;
case '10'://给学生添加兴趣
break;
case '11'://删除学生的兴趣
break;
case '12'://输入学号查询该学生的信息和号码
break;
case '13'://输入爱好查出有此爱好的学生信息
break;
default : printf("输入数据错误,请重新输入");
}
}
程序至少有一个问题
c语言的char只能处理单个字符,不能用
case '10':
这样的写法的,若你要实现你的功能,改
char ch;
为
int ch;
然后用
scanf("%d",&ch);
及
case 1:
....
case 2:
....
case 10:
....
case 11:
....