通讯录
/*
计一个班级同学的通讯录,要求如下:
通讯录中每个同学的信息包含以下内容:学号(id)、姓名(name)、电话号码(tel)。如果需要更多其他信息,请自行添加。
程序主菜单包含以下几个功能:
(1) 添加记录:通过键盘输入信息,添加一条通讯录记录。
(2) 删除记录:通过键盘输入学号,删除该学号的记录。
(3) 输出记录:输出通讯录全部记录。
(4) 按姓名查找:通过键盘输入姓名,输出该同学的所有信息。
(5) 保存记录:把通讯录中所有的记录保存到文件中。
(6) 清空记录:删除通讯录中的全部记录,并删除文件。
(7) 退出
提示:
1.程序启动时应判断是否存在记录文件,如果存在,则读取每条记录到链表中。
2.用户选择并完成主菜单某功能后,除了退出程序,应该返回主菜单。
3.添加一条记录时,插入到链表的尾部。
4.查找、删除记录时,如果该记录不存在,则应该输出不存在的提示。
5.添加记录、删除记录时不需要写文件。
6.保存记录时,用覆盖写文件的方法。(或者先删除原文件,再保存全部记录信息)
7.各个功能模块写成函数,由主函数调用。
*/
// Oct.16.2016
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode{
ElemType id;
char name[20];
ElemType tel;
struct LNode *next;
}LinkList;
LinkList *L;
void enter();
/*void InitList(LinkList * &L){
system("cls");
L = new LinkList;
L->next=NULL;
cout<<endl<<endl<<endl<<"初始化完毕!"<<endl;
printf("\n\n按任意键返回.\n");
getch();
enter();
}*/
void Checkfile(LinkList *&L){ //check the file
system("cls");
L = new LinkList;
int f=0;
int i,t;
char n[20];
LinkList *p=L ;
FILE *fp = fopen("data.txt","r");
if(fp==NULL){
cout<<"打开文件失败"<<endl;
return ;
}
while(fscanf(fp,"%d%s%d",&i,n,&t)!=EOF){
LinkList *q = new LinkList;
q->id=i;
strcpy(q->name,n);
q->tel=t;
p->next = q;
p=q;
f=1;
}
if(f==0){
cout<<"文件为空"<<endl;
}
else
cout<<"读取完毕"<<endl;
p->next =NULL;
fclose(fp);
printf("\n\n按任意键返回.\n");
getch();
enter();
}
void CreateListR(LinkList *&L){ //add the data
system("cls");
LinkList *s,*r;
int i,n,id1,p;
char na[20];
//L = new LinkList;
//L->next =NULL;
r = L;
cout<<"输入学生人数: ";
cin>>n;
cout<<endl;
for(i=0;i<n;i++){
s = new LinkList;
cout<<endl;
cout<<"学生学号:\t";
cin>>id1;
s->id=id1;
cout<<endl;
cout<<"学生名字:\t";
scanf("%s",na);
strcpy(s->name,na);
cout<<endl;
cout<<"学生电话:\t";
cin>>p;
s->tel=p;
r->next = s;
r = s;
}
r->next =NULL;
cout<<endl<<endl<<endl<<"全部添加完毕!"<<endl;
printf("\n\n按任意键返回.\n");
getch();
enter();
}
bool ListDelete(LinkList * &L){ //datele the data
system("cls");
int id1;
cout<<"输入你要删除的学生的学号:\t";
cin>>id1;
LNode *p = L->next ,*pre = L, *q;
while(p!=NULL){
if(p==NULL)
cout<<"未找到该学生"<<endl;
else{
if(p->id==id1){
q=p;
p=p->next;
pre->next=p;
delete q;
cout<<endl<<endl<<"删除成功"<<endl;
break;
}
else{
pre = p;
p = p->next;
}
}
}
cout<<endl<<endl<<endl<<"操作完毕!"<<endl;
printf("\n\n按任意键返回.\n");
getch();
enter();
}
void DispList(LinkList * &L){ //display the data
system("cls");
int f=0;
LinkList *p = L->next;
while(p!=NULL){
cout<<"学生学号:\t"<<p->id<<"\t";
cout<<"学生姓名:\t"<<p->name<<"\t";
cout<<"学生手机:\t"<<p->tel<<endl;
p=p->next;
f=1;
}
if(f==1)
cout<<endl<<endl<<endl<<"全部显示完毕!"<<endl;
else cout<<endl<<endl<<"通讯录无数据"<<endl;
printf("\n\n按任意键返回.\n");
getch();
enter();
}
void FindList(LinkList *&L){ //find the data
system("cls");
char n[20];
cout<<"输入你要寻找的学生的姓名:\t";
scanf("%s",n);
LinkList *p = L->next;
while(p!=NULL&& strcmp(p->name,n)!=0) {
p = p->next;
}
if(p==NULL)
cout<<endl<<endl<<"没有找到该学生";
else{
cout<<endl<<endl<<"学生学号:\t"<<p->id<<"\t";
cout<<"学生姓名: \t"<<p->name<<"\t";
cout<<"学生手机:\t"<<p->tel<<endl;
cout<<endl<<"查找成功"<<endl;
}
cout<<endl<<endl<<endl<<"操作完毕!"<<endl;
printf("\n\n按任意键返回.\n");
getch();
enter();
}
void SaveList(LinkList *&L){ //save the data to "data.txt"
system("cls");
LinkList *p = L->next;
FILE *fp = fopen("data.txt","w");
if(fp==NULL)
cout<<endl<<"打开文件失败"<<endl;
while(p){
fprintf(fp,"%d\t%s\t%d\n",p->id,p->name,p->tel);
p=p->next;
}
cout<<endl<<"保存完毕"<<endl;
fclose(fp);
printf("\n\n按任意键返回.\n");
getch();
enter();
}
void end(){ //exit the system
system("cls");
printf("\n\n欢迎使用通讯录系统!谢谢!\n\n\n");
exit(0);
}
void DestroyList(LinkList * &L){ //Destroy the LinkList and file
system("cls");
LinkList *pre = L , *p = L->next;
while(p!=NULL){
delete pre;
pre = p;
p = pre -> next;
}
delete pre;
cout<<"销毁完毕"<<endl;
if(remove("data.txt") == 0)
cout<<"data.txt 文件已被删除"<<endl;
else
perror("remove");
getch();
end();
}
void enter(){ //主菜单界面
int choice, w;
system("cls");
printf("\n\n\t\t\t 通讯录管理系统"); //选择界面
printf("\n\n\n\t\t **************************************\n");
printf("\n\t\t * 1.检查 2.添加 *\n");
printf("\n\t\t * 3.删除 4.输出 *\n");
printf("\n\t\t * 5.查找 6.保存 *\n");
printf("\n\t\t * 7.清空 0.退出 *\n");
printf("\n\t\t **************************************\n");
printf("\n\t\t 输入相应执行功能的序号:");
scanf("%d", &choice);
switch (choice){ //选择操作
case 1:Checkfile(L);break;
case 2:CreateListR(L); break;
case 3:ListDelete(L); break;
case 4:DispList(L); break;
case 5:FindList(L); break;
case 6:SaveList(L); break;
case 7:DestroyList(L); break;
case 0:end(); break;
default:w = 1; //其他情况
}
if (w == 1){ //其他情况,重新输入
printf("\n输入有误,请按任意键重新选择。\n");
getch();
enter(); //重新打开选择界面
}
}
int main(){
system("color 3f");
int i;
int n = 0;
printf("\n\n\n\n\t\t **************************************\n");
printf("\n\n\t\t\t 欢迎来到通讯录管理系统\n");
printf("\n\n\n\t\t\t 按任意键进入通讯录!\n\n");
getch();
enter();
return 0;
}