/*学生信息管理系统*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<winbase.h>
#include<time.h>
#include<conio.h>
#define Maxword 20
/**/
typedef struct node
{
char name[20];//名字
char address[40];//家庭地址
char phone[15];//电话号码
long zip;//邮编
struct node *next;// 指向结构体的指针
}add_list;
struct person//备用结构体
{
char name[20];
char address[40];
char phone[15];
long zip;
};
FILE *fp;//指向文件地址的指针
add_list *tail,*head;//定义链表的尾结点指针与头指针;
/*从文件中读出数据生成通讯录链表,如果文件不存在,则生成空链表*/
add_list *load(char filename[])
{
add_list *new1,*head;//结构体指针
struct person t;//结构体变量
head=(add_list*)malloc(sizeof(add_list));//给头节点创建存储空间
tail=head=NULL;//初始化头节点尾节点
if((fp=fopen(filename,"rb"))==NULL)
//如果读取到的链表数据为空则返回头节点,此时头节点自身也为空;
{
return head;
}
else
{
if(!feof(fp))//文件结束标识符
{
if(fread(&t,sizeof(struct person),1,fp)==1)//
{
new1=(add_list*)malloc(sizeof(add_list));//创建链表第一个节点
strcpy(new1->name,t.name);//strcpy(a,c);将c中的数据复制到strcpy中;
strcpy(new1->address,t.address);//将t中的地址赋值给new1
strcpy(new1->phone,t.phone);
new1->zip=t.zip;
head=tail=new1;
new1->next=NULL;
while(!feof(fp))//连入链表其他节点
{
//fread(void *buffer,int size,int count,FILE *fp);
/*fread()──从fp所指向文件的当前位置开始,
一次读入size个字节,重
复count次,并将读入的数据存放到从buffer开始的内存中;
buffer是存放读入数据的起始地址(即存放何处)
*/
if(fread(&t,sizeof(struct person),1,fp)==1)
{
new1=(add_list*)malloc(sizeof(add_list));
strcpy(new1->name,t.name);
strcpy(new1->address,t.address);
strcpy(new1->phone,t.phone);
new1->zip=t.zip;
tail->next=new1;
new1->next=NULL;
tail=new1;
}
}
}
}
}
fclose(fp);//关闭文件指针 结束文件
return head;
}
//从文件中读出数据生成通讯录链表,若不存在则空链表;
/*进度条打印*/
void jindutiao()
{
int i;
for(i=0;i<90;i++)
{
putchar('.');//一直打印该界面
}
printf("\r\a");//响铃操作
for(i=0;i<90;i++)
{
if(i==0)
{
putchar('|');
}
Sleep(100);
printf("\b|>");
}
// return;
}
/*插入一条通讯录记录*/
void insert(add_list **head)
{
add_list *new1;
new1=(add_list*)malloc(sizeof(add_list));
system("cls");
printf("请输入姓名:");
getchar();
gets(new1->name);
/*gets函数用法:
从标准输入设备读字符串函数,
可以无限读取,不会判断上限,以回车结束读取。
所以如果输入的字符串超过100个,
它也不会做检测,此时就会发生溢出。*/
//scanf("%s")
printf("\n 请输入地址:");scanf("%s",new1->address);
printf("\n 请输入电话:");scanf("%s",new1->phone);
printf("\n 请输入邮编:");scanf("%d",&new1->zip);
if(*head==NULL)//如果此时表头为空
{
*head=new1;//此时数据类型一致,将new1的地址赋值给head
new1->next=NULL;//new1->next指向;
tail=new1;
}/*使用的是尾插法*/
else//插入到表尾
{
tail->next=new1;//将尾节点->next赋值给即将插入的节点new1;
new1->next=NULL;
tail=new1;
}
printf("输入完成,按回车键返回......");
getchar();
getchar();
// return;
}
/*将通讯录表中的内容保存到指定文件*/
void save(add_list *head,char filename[])
{
add_list *p;//结构体指针
struct person t;//创建结构体变量
if((fp=fopen(filename,"wb"))==NULL)//如果写入的数据为空
{
printf("错误,不能打开文件%s\n",filename);
printf("已退出\n");
exit(1);
}
else
{
p=head;//将地址传给p;p就指向头节点;
while(p!=NULL)
{
strcpy(t.name,p->name);//复制p给t函数
strcpy(t.address,p->address);
strcpy(t.phone,p->phone);
t.zip=p->zip;
fwrite(&t,sizeof(struct person),1,fp);
p=p->next;
}
}
fclose(fp);
printf("保存成功,按返回键返回......");
getchar();getchar();//?
//return;
}
/*显示通讯录内容*/
void display(add_list *head)
{
add_list *p;
p=head;
if(p!=NULL)
{
printf("姓名:\t\t住址:\t\t邮编:\t\t电话:\n");
//printf("对不起")
}
while(p!=NULL)
{
printf("%s\t\t%s\t\t%d\t\t\%s\n",p->name,p->address,p->zip,p->phone);
p=p->next;
}
printf("请输入回车键返回......");
getchar();
getchar();
}
/*按姓名查询通讯录记录*/
int search(add_list *head)
{
add_list *p;
char name[20];
int flag=0;
printf("请输入你要查询的同学姓名:\n");
getchar();
gets(name);//无限制接收数据
p=head;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("姓名:\t\t住址:\t\t邮编\t\t电话\n");
printf("%s\t\t%s\t\t%d\t\t%s\n",p->name,p->address,p->zip,p->phone);
flag=1;
}
p=p->next;//不能else也并不是else
}
// if(p==NULL)
// {
// printf("\n对不起,系统查无此人02\n");
// }
return flag;
}
/*按姓名删除一条通讯录信息*/
int delete1(add_list **head)
{
add_list *p,*q,*t;
char name[20],c;
int flag=0;
printf("请输入要删除人的姓名:");
scanf("%s",name);
q=p=*head;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("姓名:\t\t住址:\t\t邮编:\t\t电话:\n");
printf("%s\t\t%s\t\t%1d\t\t%s\n",p->name,p->address,p->zip,p->phone);
printf("真的要删除吗?(Y:是;N:否)\n");
getchar();
c=getchar();
if(c=='Y'||c=='y')
{
if(p==*head)
{
printf("已经成功删除%s信息02\n",p->name);
system("pause");
*head=p->next;//
}
else
{
printf("已经成功删除%s信息01\n",p->name);
system("pause");
q->next=p->next;
}
t=q;
p=p->next;
free(t);
flag=1;
}
else
{
q=p;
p=p->next;
flag=1;
}
}
else
{
q=p;
p=p->next;
}
}
return flag;
printf("按回车键返回......");
getchar();
}
void password()
{
char pass_word[Maxword]="abc123456";//密码本
char pass_input[20];
int i;
int j;
char c;//输入密码变量
for(i=3;i>=1;i--)
{
j=0;
printf("请输入你的登录密码,你还有%d次机会\n",i);
while((c=getch())!='\r')//回车键结束运行
{/*isprint判断输入的c是否是一个不可打印的字符*/
if(j<Maxword&&isprint(c))
{
pass_input[j++]=c;
//把在getch存入的密码存入pass_input数组当中;
//存一个,打印一个,直到敲下回车键结束;
putchar('*');
}
else if(j>0&&c=='\b')
{
//这里是指如果你乱的输密码
//比如退格键它也会识别为密码的输入;
j--;//如果输入的是退格键,则不存入数组;
putchar('\b');//此时打印无;
putchar(' ');
putchar('\b');
}
}
putchar('\n');//打印\n
pass_input[j]='\0';//添加字符结束符;
/*字符串比较函数相等就是0*/
int spot;
if(strcmp(pass_input,pass_word)==0)
{
system("cls");
printf("\t\t欢迎使用学生信息管理系统");
putchar('\a');
//打印点点;
for(spot=0;spot<3;spot++);
{
putchar('.');
Sleep(500);
}
for(spot=0;spot<3;spot++);
{
putchar('.');
Sleep(500);
}
break;
}
else if(i>1)
{
printf("输入密码有误!请重新输入!\n");
continue;
}
}
if(i==0)
{
printf("您输入的次数已用完,已经退出\n");
exit(0);
}
return;
}
/*显示菜单并选择菜单项*/
int menu_select()
{
char c;
system("cls");
printf("\t\t\t******通讯录******\n");
printf("\t\t\t1:输入新的通讯记录\n");
printf("\t\t\t2:删除记录\n");
printf("\t\t\t3:查找\n");
printf("\t\t\t4:保存文件\n");
printf("\t\t\t5:浏览所有通讯录记录\n");
printf("\t\t\t6:退出\n");
do{
printf("请输入你的选择(1-6):");
c=getchar();
}while(c<'1'||c>'6');//如果满足条件则跳出循环;
return c;
}
int main(void)
{
char filename[50];
char c;
int t;
password();
printf("通讯录启动中------\n");
//jindutiao(); //缓冲界面
system("cls");
printf("请输入通讯录文件名称:\n");
scanf("%s",filename);//输入文件名字;
getchar();//将enter吸收掉
head=load(filename);//接收通讯录的文件名;
while(1)//表示大于0的时候;
{
c=menu_select();//通过main函数输入菜单选项以及文件地址
//scanf("%d",&c);
//menu_select(filename,a);
//c=menu_select();
//menu_select(head);
switch(c)
{
case '1':insert(&head);break;//输入信息
case '2':t=delete1(&head);//删除信息
if(!t)//如何与t挂钩的
{
printf("对不起!系统没有此人信息\n按回车键返回!...");
system("pause");
}
getchar();
break;
case '3':t=search(head);//查询信息
if(!t){
printf("天啊!居然没有找到此人信息02\n按回车键返回......");
}
getchar();
break;
case '4':save(head,filename);break;//保存信息
case '5':display(head);break;//输出信息
case '6':printf("已安全退出");exit(0);//退出
}
}
// return 0;
}
/*不用感谢我,叫我雷锋即可!*/