/*
以本班同学的具体数据为背景,设计一个本班同学通讯录
实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//*****************联系人信息*****************//
typedef struct peo
{
char name[20];//姓名
char wm[20];//性别
char tele[20];//手机号码
char postal[20];//邮编
char mail[20];//E-Mail
char home[100];//家庭住址
struct peo* next;
}peo;
peo* head;//头指针
void menu()//主菜单
{
printf("\n=======================================================\n");
printf(" 欢迎来到通讯录管理系统\n\n");
printf(" 1.输入数据 2.显示数据\n");
printf(" 3.排序数据 4.删除数据\n");
printf(" 5.查看数据 6.修改数据\n");
printf(" 7.返回主菜单\n");
printf("\n~~~~~~输~~~~~~入~~~~~~8~~~~~~退~~~~~~出~~~~~~程~~~~~~序\n");
}
void peo_print(peo* p1)
{
printf("\t姓名:>");
printf("%s\n", p1->name);
printf("\t性别:>");
printf("%s\n", p1->wm);
printf("\t电话:>");
printf("%s\n", p1->tele);
printf("\t邮编:>");
printf("%s\n", p1->postal);
printf("\tE-mail:>");
printf("%s\n", p1->mail);
printf("\t家庭地址:>");
printf("%s\n", p1->home);
}
//**************添加联系人信息**************//
void input()//输入数据
{
int ans;//判断是否继续输入
peo* p1, * p2;
p1 = (peo*)malloc(sizeof(peo));//申请内存来用
if (p1 != NULL)
{
printf("========输入数据========\n");
head = p1;
while (1)
{
printf("姓名:");
scanf("%s", &p1->name);
printf("性别:");
scanf("%s", &p1->wm);
printf("手机号码:");
scanf("%s", &p1->tele);
printf("邮编:");
scanf("%s", &p1->postal);
printf("E-Mail:");
scanf("%s", &p1->mail);
printf("家庭地址:");
scanf("%s", &p1->home);
printf("===================================\n");
p2 = p1;
p1 = (peo*)malloc(sizeof(peo));//申请下一个要用的空间
if (p1 != NULL)
p2->next = p1;
printf("请选择是否继续输入:1.继续 2.退出\n请选择:\n");//用户选择
scanf("%d", &ans);
if (ans == 1)//继续
continue;
else//退出
{
printf("添加成功\n");
p2->next = NULL;
free(p1);//将申请的的无用内存释放
break;
}
}
}
}
//**************显示联系人信息**************//
void look(peo* p1)//显示数据
{
printf("\n========显示数据========\n");
while (p1 != NULL)
{
printf("姓名:%s\n", p1->name);
printf("性别:%s\t", p1->wm);
printf("手机号码:%s\t", p1->tele);
printf("邮编:%s\t", p1->postal);
printf("E-Mail:%s\t", p1->mail);
printf("家庭住址:%s\n", p1->home);
printf("=====================================\n");
p1 = p1->next;
}
printf("\n========显示完毕========\n");
}
//**************删除联系人信息**************//
void deleted()//删除数据
{
peo* p1, * p2;
char name[20];//删除者姓名
printf("========删除数据========\n");
printf("请输入要删除者的姓名:");
scanf("%s", name);
p1 = head;
p2 = NULL;
if (head == NULL)//通讯录已经没数据了
{
printf("通讯录里什么也没有了。\n");
printf("========删除失败========\n");
return;
}
if (!strcmp(name, p1->name))//头指针就是要删除的,为什么要单独拿出来,就是为了可以在删除后改变头指针
{
head = p1->next;
printf("========删除成功========\n");
return;
}
while (p1 != NULL && strcmp(name, p1->name))
{
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL)//查找完了,没找到
{
printf("查无此人!!!!\n");
return;
}
if (p1->next != NULL)//找到了,不是最后一个
{
p1 = p1->next;
p2->next = p1;
printf("========删除成功========\n");
}
else//是最后一个
{
p2->next = NULL;
printf("========删除成功========\n");
}
}
//**************查找联系人信息**************//
void find(peo* p1)//查找数据
{
char name[20];//查找的名字
char postal[20];//查找的邮编
int flag = 0;
printf("========查看数据========\n");
printf("请输入|>\t1.按姓名\t2.按邮编\n|>");
scanf("%d", &flag);
if (flag == 1)
{
printf("查找:");
scanf("%s", name);
while (p1 != NULL)
{
if (!strcmp(name, p1->name))//找到了输出
{
peo_print(p1);
break;
}
p1 = p1->next;
}
if (p1 == NULL)//找完了,没找到
printf("您要查找的人不存在\n");
printf("========结束查找========\n");
}
else if (flag == 2)
{
printf("查找:");
scanf("%s", postal);
while (p1 != NULL)
{
if (!strcmp(postal, p1->postal))//找到了输出
{
peo_print(p1);
break;
}
p1 = p1->next;
}
if (p1 == NULL)//找完了,没找到
printf("您要查找的人不存在\n");
printf("\n========结束查找========\n");
}
else
{
printf("输入错误");
}
}
//**************修改联系人信息**************//
void modify(peo* p1)//修改数据
{
int n;//选择的修改内容
char name[20];//要修改人的姓名
printf("========修改数据========\n");
printf("请输入要修改人的姓名:");
scanf("%s", name);
while (p1 != NULL)
{
if (!strcmp(name, p1->name))//找到了
{
printf("请输入:>\n");
peo_print(p1);
printf("\n \t1.姓名\t2.性别\t3.手机号码\t4.邮编\t5.E-Mail\t6.家庭住址\n\n:>");
scanf("%d", &n);
switch (n)
{
case 1:
printf("姓名:");
scanf("%s", &p1->name);
break;
case 2:
printf("性别:");
scanf("%s", &p1->wm);
break;
case 3:
printf("手机号码:");
scanf("%s", &p1->tele);
break;
case 4:
printf("邮编:");
scanf("%s", &p1->postal);
break;
case 5:
printf("E-Mail:");
scanf("%s", &p1->mail);
break;
case 6:
printf("家庭住址:");
scanf("%s", &p1->home);
break;
}
printf("|>修改成功\n");
break;
}
p1 = p1->next;
}
if (p1 == NULL)//没有找到
{
printf("|>联系人不存在!\n");
}
}
void Savefile(peo* p1)//保存数据
{
FILE* fp = NULL;
char file[15];
fopen_s(&fp, "contact.txt", "w");
if (fp == NULL)//打开文件,若没有此文件可以新建立
{
printf("cannot open this file\n");//无法建立新文件
return;//正常运行程序并退出程序
}
fprintf(fp, "姓名\t性别\t手机号码\t邮编\tE-Mail\t家庭住址\n");
while (p1 != NULL)
{
fprintf(fp, "%s\t", p1->name);
fprintf(fp, "%s\t", p1->wm);
fprintf(fp, "%s\t", p1->tele);
fprintf(fp, "%s\t", p1->postal);
fprintf(fp, "%s\t", p1->mail);
fprintf(fp, "%s\n", p1->home);
p1 = p1->next;
}
printf("已保存联系人!\n");
fclose(fp);//关闭文件,这个要记得
fp = NULL;//为file添加休止符
}
void Loadfile(peo* p1)
{
FILE* fp;
char file[15];
fopen_s(&fp, "contact.txt", "r");
if (fp == NULL)//读取文件
{
printf("cannot open this file\n");//无法建立新文件
return;
}
fprintf(fp, "姓名\t性别\t手机号码\t邮编\tE-Mail\t家庭住址\n");
while (p1 != NULL)
{
fscanf(fp, "%s\t", p1->name);
fscanf(fp, "%s\t", p1->wm);
fscanf(fp, "%s\t", p1->tele);
fscanf(fp, "%s\t", p1->postal);
fscanf(fp, "%s\t", p1->mail);
fscanf(fp, "%s\n", p1->home);
p1 = p1->next;
}
fclose(fp);//关闭文件,这个要记得
fp = NULL;
}
//******************排序**********************//
void sort(peo* L)
{
int flag = 1;
printf("请输入|>\t1.按姓名\t2.按邮编\n|>");
if (flag = 1) {
for (peo* p = L->next; p != NULL; p = p->next)
{
for (peo* q = p; q != NULL; q = q->next)
{
if (strcmp(p->name, q->name) > 0)
{
//交换数据域
peo t = *p;
*p = *q;
*q = t;
//交换指针域
t.next = p->next;
p->next = q->next;
q->next = t.next;
}
}
}
printf("排序完成");
}
else if(flag == 2)
{
for (peo* p = L->next; p != NULL; p = p->next)
{
for (peo* q = p; q != NULL; q = q->next)
{
if (strcmp(p->postal, q->postal) > 0)
{
//交换数据域
peo t = *p;
*p = *q;
*q = t;
//交换指针域
t.next = p->next;
p->next = q->next;
q->next = t.next;
}
}
}
printf("排序完成");
}
else
{
printf("输入错误");
}
}
int main()
{
int n;
menu();
Loadfile(head);
while (1)
{
printf("请输入(1~9):");
scanf("%d", &n);
switch (n)
{
case 1:
input();
break;
case 2:
look(head);//显示刚输入的数据
break;
case 3:
sort(head);
break;
case 4:
deleted();
break;
case 5:
find(head);
break;
case 6:
modify(head);
break;
case 7:
menu();
break;
case 8:
exit(1);//退出系统
break;
default:
printf("输入有误!");
}
}
Savefile(head);
return 0;
}
没法保存??😓
exit(1)是直接退出程序,其下边的代码将不会执行。
你输入8之后直接就退出了,也就是main函数就结束了,Savefile(head);不会执行
如果想要保存的话,两种方法:
1、把Savefile(head);放到exit(1)上边即可
2、把exit(1)删除即可