- 因为之前版本的电话簿简易电话簿(大小固定)是设定好容量的,如果联系人满了,就不得不删除旧的添加新的,所以这次的电话簿采用了动态增长的方式,可以在添加联系人的时候检测是否已经满了,如果满了再扩增一定的空间,并且还可以将这些信息保存在本地文档中每次运行时进行读写;
- 在整体结构上并没有太大改动,只是增加了三个函数以及改变了结构体内存的开辟方式
1.CheckFull()
这个函数是每次添加联系人时,检测联系人是否已经满了,如果满了就使用realloc函数进行扩容:这里为了节省空间。每次扩容1个联系人的空间:
void CheckFull(PhoneBook* PhoneBook)
{
if (PhoneBook->Size == PhoneBook->Capacity)
{
printf("联系人已达上限:%d/%d!\n",PhoneBook->Size, PhoneBook->Capacity);
PersonInfr*tmp=(PersonInfr*)realloc(PhoneBook->Book,sizeof(PersonInfr)*(PhoneBook->Capacity+1));
if (tmp != NULL)
{
PhoneBook->Book = tmp;
PhoneBook->Capacity = PhoneBook->Capacity + 1;
printf("扩容成功!\n");
}
else
{
printf("扩容失败!\n");
exit(1);
}
}
}
Load()
这里是每次程序运行时,加载储存在本地txt文档里的联系人信息,如果没有找到这个文档,就在当前目录下创建一个txt记事本:
void Load(PhoneBook* data)
{
FILE* fp = fopen("../PhoneBook.txt", "r");
PersonInfr temp = { 0 };
printf("加载联系人的信息中\n");
if (fp == NULL)
{
printf("文件打开失败!\n");
}
if (fread(&temp, sizeof(PersonInfr), 1, fp))
{
CheckFull(data);
data->Book[data->Size] = temp;
data->Size++;
}
fclose(fp);
printf("数据读取成功,加载了%d条信息\n",data->Size);
}
Save()
这个函数是在程序即将结束前,将修改变动的联系人信息的操作,储存在本地文档中:
void Save(PhoneBook* data)
{
FILE* fp = fopen("../PhoneBook.txt", "w");
if (fp == NULL)
{
printf("文件打开失败!\n");
}
else
{
for (int i = 0; i < data->Size; i++)
{
fwrite(&data->Book[i], sizeof(PersonInfr), 1, fp);
}
}
fclose(fp);
printf("保存成功\n");
}
以下是整体代码:
- Contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define NAMELONGTH 1024
#define TELELONGTH 1024
//#define BOOKSIZE 200
#define DEFAULTCAY 1
typedef struct PersonInfr//每个人需要存储姓名和电话
{
char name[NAMELONGTH];
char tele[TELELONGTH];
}PersonInfr;
typedef struct PhoneBook//一个电话本至少需要200个联系人
{
PersonInfr * Book ; //test
unsigned int Size;
unsigned int Capacity;
}PhoneBook;
typedef void(*fun)(PhoneBook*);
int menu();
void Load();
void Save();
void PrintAll(PhoneBook* PhoneBook);
void CleanAll(PhoneBook* PhoneBook);
void InitBook(PhoneBook* PhoneBook);
void AddContact(PhoneBook* PhoneBook);
void FindContact(PhoneBook* PhoneBook);
void SortbyName(PhoneBook* PhoneBook);
void DeletContact(PhoneBook* PhoneBook);
void ChangeContact(PhoneBook* PhoneBook);
#endif
- Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
int menu()
{
int input = 0;
printf("\n");
printf("***1,增加联系人***\n");
printf("***2,删除联系人***\n");
printf("***3,修改联系人***\n");
printf("***4,查找联系人***\n");
printf("***5,打印全部人***\n");
printf("***6,按姓名排序***\n");
printf("***7,清空联系人***\n");
printf("***0,退出**********\n\n");
while (1)
{
printf("请输入你的选择\n");
scanf("%d", &input);
if (input < 8 && input >= 0)
return input;
else
printf("出入非法,重新输入!\n");
}
}
void InitBook(PhoneBook* PhoneBook)
{
PhoneBook->Size = 0;
PhoneBook->Book= (PersonInfr *)malloc(sizeof(PersonInfr)* DEFAULTCAY);
PhoneBook->Capacity = DEFAULTCAY;
}
void CheckFull(PhoneBook* PhoneBook)
{
if (PhoneBook->Size == PhoneBook->Capacity)
{
printf("联系人已达上限:%d/%d!\n",PhoneBook->Size, PhoneBook->Capacity);
PersonInfr*tmp=(PersonInfr*)realloc(PhoneBook->Book,sizeof(PersonInfr)*(PhoneBook->Capacity+1));
if (tmp != NULL)
{
PhoneBook->Book = tmp;
PhoneBook->Capacity = PhoneBook->Capacity + 1;
printf("扩容成功!\n");
}
else
{
printf("扩容失败!\n");
exit(1);
}
}
}
static int FindTarget(PhoneBook* PhoneBook, char*target)
{
for (int i = 0; i < PhoneBook->Size; i++)
{
if (!(strcmp(PhoneBook->Book[i].name, target)))
{
return i;
}
}
return -1;
}
void AddContact( PhoneBook* PhoneBook)
{
CheckFull(PhoneBook);
printf("请输入你要添加的联系人\n");
printf("姓名:\n");
scanf("%s", PhoneBook->Book[PhoneBook->Size].name);
printf("电话:\n");
scanf("%s", PhoneBook->Book[PhoneBook->Size].tele);
PhoneBook->Size++;
}
void DeletContact(PhoneBook* PhoneBook)
{
char target[NAMELONGTH] = { 0 };
printf("请输入你要删除的联系人\n");
printf("姓名:\n");
scanf("%s", &target);
int FindResult = FindTarget(PhoneBook, target);
if (FindResult != -1)
{
printf("删除成功!");
for (int i = FindResult; i < PhoneBook->Size; i++)
{
if (i < (PhoneBook->Size - 1))
{
PhoneBook->Book[i] = PhoneBook->Book[i + 1];
}
}
PhoneBook->Size--;
}
else
{
printf("你输入的名字我找不到==\n");
}
}
void ChangeContact(PhoneBook* PhoneBook)
{
char target[NAMELONGTH] = { 0 };
int choice = 0;
printf("请输入你要修改的联系人\n");
printf("姓名:\n");
scanf("%s", &target);
int FindResult = FindTarget(PhoneBook, target);
if (FindResult != -1)
{
printf("1.重命名 2.修改联系方式\n");
scanf("%d", &choice);
if (choice == 2)
{
printf("修改电话:\n");
scanf("%s", PhoneBook->Book[FindResult].tele);
}
else if (choice == 1)
{
printf("重命名:\n");
scanf("%s", PhoneBook->Book[FindResult].name);
}
else
{
printf("非法输入!\n");
}
}
else
{
printf("你输入的名字我找不到==\n");
}
}
void FindContact(PhoneBook* PhoneBook)
{
char target[NAMELONGTH] = { 0 };
printf("请输入你要查找的联系人\n");
printf("姓名:\n");
scanf("%s", &target);
int FindResult = FindTarget(PhoneBook, target);
if (FindResult != -1)
{
printf("%s:", PhoneBook->Book[FindResult].name);
printf("%s\n", PhoneBook->Book[FindResult].tele);
}
else
{
printf("你输入的名字我找不到==\n");
}
}
void PrintAll(PhoneBook* PhoneBook)
{
for (int i = 0; i < PhoneBook->Size; i++)
{
printf("%s:",PhoneBook->Book[i].name);
printf("%s\n",PhoneBook->Book[i].tele);
}
}
void SortbyName(PhoneBook* PhoneBook)//快速排序,按从小到大,可英文&中文;
{
PersonInfr temp;
for (int i = 1; i < PhoneBook->Size; i++)
{
temp=PhoneBook->Book[i];
int j = i - 1;
while (j >= 0 && (strcmp(PhoneBook->Book[j].name, temp.name)>0))
{
PhoneBook->Book[j + 1] = PhoneBook->Book[j];
j--;
}
PhoneBook->Book[j+1] = temp;
}
printf("排序成功!\n");
}
void CleanAll(PhoneBook* PhoneBook)
{
int del = 0;
printf("确定要删除全部联系人吗?0,是 1,否\n");
scanf("%d", &del);
if (!del)
{
PhoneBook->Size = 0;
printf("电话簿已清空!\n");
}
}
void Save(PhoneBook* data)
{
FILE* fp = fopen("../PhoneBook.txt", "w");
if (fp == NULL)
{
printf("文件打开失败!\n");
}
else
{
for (int i = 0; i < data->Size; i++)
{
fwrite(&data->Book[i], sizeof(PersonInfr), 1, fp);
}
}
fclose(fp);
printf("保存成功\n");
}
void Load(PhoneBook* data)
{
FILE* fp = fopen("../PhoneBook.txt", "r");
PersonInfr temp = { 0 };
printf("加载联系人的信息中\n");
if (fp == NULL)
{
printf("文件打开失败!\n");
}
if (fread(&temp, sizeof(PersonInfr), 1, fp))
{
CheckFull(data);
data->Book[data->Size] = temp;
data->Size++;
}
fclose(fp);
printf("数据读取成功,加载了%d条信息\n",data->Size);
}
3.main.c
//实现一个电话本,使得,增加,删除,修改,查找,打印全部,按姓名排序,清空所有记录
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
int main()
{
printf("%s","通话录:\n");
PhoneBook FirstBook;
InitBook(&FirstBook);
Load(&FirstBook);
fun ChooseFun[10] = { AddContact,DeletContact,ChangeContact,FindContact,PrintAll,SortbyName,CleanAll};
int choice = 0;
do
{
choice = menu();
if (choice)
{
ChooseFun[choice - 1](&FirstBook);
printf("\n");
ChooseFun[4](&FirstBook);
}
} while (choice);
Save(&FirstBook);
free(FirstBook.Book);
system("pause");
return 0;
}