帮同学修改的一个管理系统,要求把全局变量换为形参传递,自己尝试了好几次,在查询方面查询不存在的学生会出现bug,但还是比较有成就感的。
#include"stdio.h"
#include"string.h"
#include"math.h"
#include"conio.h"
#include"stdlib.h"
#define N sizeof(struct student)
void save_message(struct student *h);
struct date{int y;int m;int d;}bir; /*日期结构体数组*/
struct student
{
int num;
char name[20];
char tel[20];
char addr[30]; /*省份*/
char yb[20]; /*邮编*/
char daxue[30];
struct date bir;
struct student *next;
};
char a;
FILE *fp;
struct student *create()
{
int i,k;
struct student *head,*p1,*p2;
printf("\n请输入学生数:\n");
scanf("%d",&k);
head=NULL;
head=p1=p2=(struct student *)malloc(N);
for(i=0;i<k;i++)
{
p1=(struct student *)malloc(N);
printf("\n请输入序号:");
scanf("%d",&p1->num);
printf("\n请输入姓名:");
scanf("%s",p1->name);
printf("\n请输入电话:");
scanf("%s",p1->tel);
printf("\n请输入籍贯:");
scanf("%s",p1->addr);
printf("\n请输入邮编:");
scanf("%s",p1->yb);
printf("\n请输入大学:");
scanf("%s",p1->daxue);
printf("\n请输入出生日期(年-月-日)");
scanf("%d-%d-%d",&p1->bir.y,&p1->bir.m,&p1->bir.d);
p2->next=p1;
p2=p1;
}
p2->next=NULL;
head=head->next;
save_message(head);
return head;
}
struct student *input_message(struct student *h)
{
system("cls");
printf("\n\n**********输入学生信息**********\n");
printf("------------------------------------\n");
h=create();
getch();
printf("输入完毕,按任意键返回主菜单!");
getch();
return h;
}
void output_message(struct student *p) /*输出模块*/
{
system("cls");
if(p==NULL)
printf("暂无信息!请回主菜单录入信息!\n");
else
{
printf("\n\n====================通讯录信息表====================\n\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
while(p!=NULL)
{
printf("-----------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
printf("-----------------------------------------------\n");
printf("\n");
p=p->next;
}
}
printf("\n");
printf("按任意键返回主菜单!\n\n");
getch();
}
void save_message(struct student *h) /*保存学生信息*/
{
FILE *fp;
struct student *f;
f=h;
if((fp=fopen("a.txt","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
while(h!=NULL)
{
if(fwrite(h,N,1,fp)!=1) /*向文件写入数据*/
{
printf("文件写入错误!");
return;
}
h=h->next;
}
h=f;
printf("已存盘,按任意键回上层菜单:\n");
getch();
fclose(fp);
return;
}
struct student *read_message(struct student *h) /*读取信息*/
{
FILE *fp;
if((fp=fopen("a.txt","rb"))==NULL)
{
printf("\n\n****暂时还没有该生信息,请按任意键返回上一级菜单.\n");
getch();
}
struct student *p,*q,t;
p=(struct student*)malloc(sizeof(struct student));
h=p;
q=p;
q->next=NULL;
while(fread(&t,sizeof(struct student),1,fp)!=0)
{
if(p!=h)
{
q=q->next;
}
strcpy(p->name,t.name);
strcpy(p->tel,t.tel);
strcpy(p->addr,t.addr);
strcpy(p->yb,t.yb);
strcpy(p->daxue,t.daxue);
p->num=t.num;
p->bir.y=t.bir.y;
p->bir.m=t.bir.m;
p->bir.d=t.bir.d;
p=(struct student*)malloc(sizeof(struct student));
q->next=p;
}
q->next=NULL;
free(p);
fclose(fp);
return h;
}
struct student *add_message(struct student *w) /*添加学生信息*/
{
struct student *p,*q;
p=(struct student *)malloc(N); /*p指向新申请的结点*/
system("cls");
printf("\n请输入学生序号:");
scanf("%d",&p->num);
printf("\n请输入学生姓名:");
scanf("%s",p->name);
printf("\n请输入学生电话:");
scanf("%s",p->tel);
printf("\n请输入学生籍贯:");
scanf("%s",p->addr);
printf("\n请输入学生邮编:");
scanf("%s",p->yb);
printf("\n请输入学生大学:");
scanf("%s",p->daxue);
printf("\n请输入学生出生日期:");
scanf("%d-%d-%d",&p->bir.y,&p->bir.m,&p->bir.d);
p->next=NULL;
if(w==NULL)
{w=p; /*头指针为空,p作为新头指针*/
return w; /*正确插入返回1*/
}
q=w; /*从头指针开始*/
if((q->num)>(p->num)) /*找到插入位置在首结点之前*/
{
p->next=w; /*将首结点链接在新结点之后*/
w=p; /*p作为新的头指针*/
return w;
}
while((q->next)!=NULL&&(q->next->num)<(p->num))
q=q->next; /*继续查找插入位置*/
if(q->next==NULL) /*插入位置在尾结点之后*/
{q->next=p; /*新结点链接到尾结点之后*/
return w;
}
else if((q->next->num)==(p->num)) /*找到重号*/
{free(p);
printf("已存在该学号!"); /*释放新结点的存储空间*/
return w; /*不插入返回0*/
}
p->next=q->next; /*后续结点链接到新结点之后*/
q->next=p; /*新结点链接到前驱结点之后*/
return w;
}
struct student *del_message(struct student *w) /*删除模块*/
{
char name[20];
struct student *p,*q;
if(w==NULL)
return w; /**w就是头指针,空表不能删除返回0*/
system("cls");
printf("请输入要删除的学生姓名:\n");
scanf("%s",name);
q=w;
if(strcmp(q->name,name)==0) /*找到要删除的是第一个结点*/
{
w=q->next; /*修改头指针*/
free(q); /*释放存储空间*/
return w; /*正确删除返回1*/
}
p=q->next;
while(p!=NULL)
{
if(strcmp(p->name,name)==0) /*找到要删除的结点*/
{
q->next=p->next; /*后续结点连接到前驱结点之后*/
free(p); /*释放存储空间*/
return w;
}
q=p; /*推移指针继续查找*/
p=p->next;
}
if(p==NULL)
{
printf("没有该学生\n");
system("pause");
return w;
}
/*未找到要删除的结点返回0*/
}
void revise_message(struct student *g) /*修改模块*/
{
int choice;
char name[20],m,n;
do
{
system("cls");
printf("**********学生信息**********\n");
printf("请输入要修改的学生的姓名:\n");
scanf("%s",name);
while(g!=NULL)
{
while(strcmp(g->name,name)!=0)
g=g->next;
if(g==NULL)
{
printf("\n 该学生不存在!");
getch();
}
else
{
do
{
printf("\n您要修改哪一项?\n");
printf("\n 1序号\n");
printf("\n 2姓名\n");
printf("\n 3籍贯\n");
printf("\n 4电话\n");
printf("\n 5大学\n");
printf("\n 6出生日期\n");
scanf("%d",&choice);
switch(choice)
{
case 1:printf("\n 请输入修改后的序号:");
scanf("%d",&g->num);break;
case 2:printf("\n 请输入修改后的姓名:");
scanf("%s",g->name);break;
case 3:printf("\n 请输入修改后的籍贯:");
scanf("%s",g->addr); break;
case 4:printf("\n 请输入修改后的电话:");
scanf("%s",g->tel); break;
case 5:printf("\n 请输入修改后的大学:");
scanf("%s",g->daxue); break;
case 6:printf("\n 请输入修改后的出生日期:");
scanf("%d-%d-%d",&g->bir.y,&g->bir.m,&g->bir.d);break;
}
printf("\n是否继续修改此人信息?y/n\n") ;
getchar();
m=getchar();
}while(m=='y');
printf("\n\n=======================通讯录信息表======================\n\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("-----------------------------------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s\n",g->name,g->addr,g->tel,g->bir.y,g->bir.m,g->bir.d,g->yb,g->daxue);
printf("-----------------------------------------------------------------------\n\n");
getch();
}
break;
}
printf("\n要继续吗?(y/n)\n");
getchar();
n=getchar();
}while(n=='y');
printf("\n按任意键返回主菜单!");
getch();
}
struct student *renew_message(struct student *h) /*更新模块*/
{
int choice=100;
while(choice!=0)
{
printf("\n**********更新同学信息**********\n\n");
printf(" 1.添加同学信息\n\n");
printf(" 2.删除同学信息\n\n");
printf(" 3.修改同学信息\n\n");
printf(" 0.返回修改菜单\n\n");
printf(" 请选择(0—3):\n");
printf("***********************************\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:h=add_message(h);break;
case 2:h=del_message(h);break;
case 3:revise_message(h);break;
case 0:break;
default:printf("输入有误!\n");
}
}
return h;
}
void inquire_name(struct student *p) /*按姓名查询*/
{
char name[20];
struct student *f;
f=p;
system("cls");
printf("\n\n 请输入要查找的姓名:");
scanf("%s",name);
if(p==NULL)
{
printf("\n您要查找的学生不存在,请按任意键返回.\n");
getch();
}
else if(strcmp(p->name,name)!=0||p->name==NULL)
p=p->next;
system("cls");
printf("\n\n该生有关信息为:\n\n");
printf("\n\n==============通讯录信息表==============");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("-----------------------------------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
printf("-----------------------------------------------------------------------\n\n");
p=f;
getch();
}
void inquire_tel(struct student *p) /*按电话查询*/
{
char tel[20];
struct student *f;
f=p;
system("cls");
printf("\n 请输入要查找的电话:");
scanf("%s",tel);
if(p==NULL)
{
printf("NO");
system("pause");
}
else{
while(strcmp(p->tel,tel)!=0||p->tel==NULL)
p=p->next;
if(strcmp(p->tel,tel)==0)
{
system("cls");
printf("\n\n该生有关信息为:\n\n");
printf("\n\n==============通讯录信息表==============");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("-----------------------------------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
printf("-----------------------------------------------------------------------\n\n");
p=f;
getch();
}
else
{
system("cls");
printf("您要查找的学生不存在,请按任意键返回.") ;
getch();
}}
}
void inquire_message(struct student *h) /*查询模块*/
{
int choice=100;
while(choice!=0)
{
printf("\n************查询同学通讯信息************");
printf(" 1.按同学姓名查询:\n");
printf(" 2.按同学电话查询:\n");
printf(" 0.返回主菜单:\n");
printf(" 请选择(0-2):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:inquire_name(h);break;
case 2:inquire_tel(h);break;
case 0:break;
default:printf("无此类查询方式!\n");
}
}
}
void count_ad(struct student *p) /*省份统计*/
{
int count=0;
char count_ad[20];
printf("\n 输入要统计的省份名称:\n");
scanf("%s",count_ad);
if(p==NULL)
{
printf("\n 该学生不存在!");
getch();
}
else
{
printf(" 在该省份的同学:\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("----------------------------------------------------\n");
while(p!=NULL)
{
if(strcmp(p->addr,count_ad)==0)
{
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
count++;
} p=p->next;
}
}
printf("在这个省份的同学共有%d个",count);
}
void count_birthday(struct student *p) /*生日统计*/
{
int count=0;
int count_birthday_month;
printf(" 请输入要统计的月份:\n");
scanf("%d",&count_birthday_month);
if(p==NULL)
{
printf("\n 该学生不存在!");
getch();
}
else
{
printf(" 在这个月过生日的同学:记得祝贺他们生日快乐!\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("----------------------------------------------------\n");
while(p!=NULL)
{
if(p->bir.m==count_birthday_month)
{
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
count++;
}p=p->next;
}
}
printf("在这个月过生日的同学有%d个",count);
}
void count_message(struct student *h) /*统计模块*/
{
int choice=100;
while(choice!=0)
{
printf("\n\n*************************统计同学通讯信息*************************\n");
printf(" 1.按省份统计信息;\n");
printf(" 2.按生日统计信息;\n");
printf(" 0.返回主菜单;\n");
printf(" 请选择(0-2):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:count_ad(h);break;
case 2:count_birthday(h);break;
case 0:break;
default:printf("输入有误!\n");
}
}
}
main()
{
int b;
struct student *h=NULL;
h=read_message(h);
printf("输入任意键进入。\n");
getch();
do
{
system("cls");
printf("\n\n\n*************欢迎进入*************\n\n\n");
printf("**********学生通讯录管理系统**********\n\n");
printf(" **** 1输入学生信息 **** \n\n");
printf(" **** 2输出学生信息 **** \n\n");
printf(" **** 3更新学生信息 **** \n\n");
printf(" **** 4查询学生信息 **** \n\n");
printf(" **** 5统计学生信息 **** \n\n");
printf(" **** 6保存信息 **** \n\n");
printf(" **** 0退出系统 **** \n\n");
printf(" **** 请选择(0~6) : **** \n\n");
scanf("%d",&b);
switch(b)
{
case 1: h=input_message(h); break;
case 2: output_message(h); break;
case 3: h=renew_message(h); break;
case 4: inquire_message(h); break;
case 5: count_message(h); break;
case 6: save_message(h); break;
case 0: break;
}
}while(b!=0);
}