1.静态通讯录:
实现的功能:
①添加联系人
②删除指定联系人
③查找指定联系人
④修改联系人的信息
⑤显示所有人信息
⑥清空所有人信息
⑦保存通讯录到文件中
⑧加载通讯录
⑨以名字排序所有联系人信息
下面是实现的代码:
通讯录的.h文件
#pragma once
#include<stddef.h>
#define ADDRESS_BOOK_MAX 1000
#define ELEM_TYPE char
#define FILE_PATH "book.txt"
typedef struct person{
ELEM_TYPE name[100];
ELEM_TYPE gender[100];
ELEM_TYPE age[100];
ELEM_TYPE tele_number[100];
ELEM_TYPE address[100];
}person;
typedef struct address_book
{
person book[ADDRESS_BOOK_MAX];
size_t size;
}address_book;
address_book ADDRLIST;
enum{
ADDContact = 1,
DELETEContact = 2,
FINDContact = 3,
UPDATAContact = 4,
DISPLAYContact = 5,
DESTROYContact = 6,
SORTBYNAMEContact = 7,
EXIT = 0
};
void menu();
void ADDR_BOOK_Init(address_book *ADDRLIST);
void ADD_ADDR_BOOK(address_book *ADDRLIST);
void DISPLAY_ALL_ADDRLIST_BOOK(address_book *ADDRLIST);
void ERASE_ADDRLIST_BOOK(address_book *ADDRLIST);
void SAVE_ADDRLIST_BOOK(address_book *ADDRLIST);
void LOAD_ADDRLIST_BOOK(address_book *ADDRLIST);
void FIND_ADDRLIST_BOOK(address_book *ADDRLIST);
void UPDATA_ADDRLIST_BOOK(address_book *ADDRLIST);
void DESTROY_ADDRLIST_BOOK(address_book *ADDRLIST);
void BUBBLE_SORT_ADDRLIST_BOOK(address_book *ADDRLIST);
void swap(person* x,person* y);
.c文件
#include"address_book.h"
#include<stdio.h>
#include<string.h>
#include<assert.h>
void menu()
{
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");
printf("----------------------------------------\n");
}
//初始化
void ADDR_BOOK_Init(address_book *ADDRLIST)
{
ADDRLIST->size = 0;
}
//添加
void ADD_ADDR_BOOK(address_book *ADDRLIST)
{
assert(ADDRLIST);
if(ADDRLIST->size > ADDRESS_BOOK_MAX)
{
printf("通讯录已满,不可再添加联系人\n");
return;
}
printf("开始添加\n");
printf("请输入姓名\n");
scanf("%s",ADDRLIST->book[ADDRLIST->size ].name);
printf("请输入性别\n");
scanf("%s",ADDRLIST->book[ADDRLIST->size ].gender);
printf("请输入年龄\n");
scanf("%s",ADDRLIST->book[ADDRLIST->size ].age);
printf("请输入电话号码\n");
scanf("%s",ADDRLIST->book[ADDRLIST->size ].tele_number);
printf("请输入地址\n");
scanf("%s",ADDRLIST->book[ADDRLIST->size ].address );
printf("添加成功\n");
ADDRLIST->size ++;
}
//显示
void DISPLAY_ALL_ADDRLIST_BOOK(address_book *ADDRLIST)
{
size_t i = 0;
assert(ADDRLIST);
if(ADDRLIST->size == 0)
{
printf("通讯录为空。\n");
return;
}
printf("|姓名|\t\t|性别|\t\t|年龄|\t\t|电话|\t\t\t|地址|\n");
for(i=0;i<ADDRLIST->size;i++)
{
printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n"
,ADDRLIST->book[i].name
,ADDRLIST->book[i].gender
,ADDRLIST->book[i].age
,ADDRLIST->book[i].tele_number
,ADDRLIST->book[i].address);
}
}
//删除指定联系人
void ERASE_ADDRLIST_BOOK(address_book *ADDRLIST)
{
size_t i = 0,j = 0;
int flag = 0;
ELEM_TYPE deleted[100];
assert(ADDRLIST);
if(ADDRLIST->size <=0)
{
printf("通讯录为空\n");
return ;
}
printf("请输入要删除的姓名:");
scanf("%s",deleted);
for(i=0;i <= ADDRLIST->size;i++)
{
if(strcmp(ADDRLIST->book [i].name ,deleted) == 0)
{
for(j=i;j < ADDRLIST->size;j++)
{
ADDRLIST->book[j] = ADDRLIST->book [j+1];
}
flag = 1;
ADDRLIST->size --;
printf("删除成功。\n");
return;
}
}
if(flag == 0)
{
printf("通讯录中没有此人.\n");
return;
}
}
//查找通讯录
void FIND_ADDRLIST_BOOK(address_book *ADDRLIST)
{
size_t i =0;
ELEM_TYPE find[100];
int flag = 0;
assert(ADDRLIST);
if(ADDRLIST->size == 0)
{
printf("通讯录为空。\n");
}
printf("请输入要查找的姓名:");
scanf("%s",find);
for(i=0;i<ADDRLIST->size ;i++)
{
if(strcmp(ADDRLIST->book [i].name ,find) == 0)
{
flag = 1;
printf("|姓名|\t\t|性别|\t\t|年龄|\t\t|电话|\t\t\t|地址|\n");
printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n"
,ADDRLIST->book[i].name
,ADDRLIST->book[i].gender
,ADDRLIST->book[i].age
,ADDRLIST->book[i].tele_number
,ADDRLIST->book[i].address);
return;
}
}
if(flag == 0)
{
printf("通讯录中没有这个人。\n");
}
}
//修改指定人的信息
void UPDATA_ADDRLIST_BOOK(address_book *ADDRLIST)
{
size_t i = 0;
ELEM_TYPE updata[200];
assert(ADDRLIST);
if(ADDRLIST->size == 0)
{
printf("通讯录为空。\n");
return;
}
printf("输入需要修改的人的名字:");
scanf("%s",updata);
for(i=0;i<ADDRLIST->size ;i++)
{
if(strcmp(ADDRLIST->book [i].name ,updata) == 0)
{
printf("请重新输入姓名\n");
scanf("%s",ADDRLIST->book[i].name);
printf("请重新输入性别\n");
scanf("%s",ADDRLIST->book[i].gender);
printf("请重新输入年龄\n");
scanf("%s",ADDRLIST->book[i].age);
printf("请重新输入电话号码\n");
scanf("%s",ADDRLIST->book[i].tele_number);
printf("请重新输入地址\n");
scanf("%s",ADDRLIST->book[i].address );
return;
}
}
}
//清空通讯录
void DESTROY_ADDRLIST_BOOK(address_book *ADDRLIST)
{
assert(ADDRLIST);
ADDRLIST->size = 0;
}
//通讯录按名称排序
void swap(person* x,person* y)
{
person temp = *x;
*x = *y;
*y = temp;
}
void BUBBLE_SORT_ADDRLIST_BOOK(address_book *ADDRLIST)
{
size_t i = 0,j = 0;
assert(ADDRLIST);
if(ADDRLIST->size == 0)
{
printf("通讯录为空。\n");
return;
}
for(i=0;i<ADDRLIST->size-1;i++)
{
for(j=0;j<ADDRLIST->size-i-1;j++)
{
if(strcmp(ADDRLIST->book [j].name,ADDRLIST->book [j+1].name )>0)
{
swap(&ADDRLIST->book [j],&ADDRLIST->book [j+1]);
}
}
}
}
//保存信息
void SAVE_ADDRLIST_BOOK(address_book *ADDRLIST)
{
FILE* write = fopen(FILE_PATH,"w");
size_t i = 0;
assert(ADDRLIST);
if(write == NULL)
{
printf("文件打开失败!%s\n",FILE_PATH); //FILE_PATH
return;
}
for(i=0;i<ADDRLIST->size ;i++)
{
fprintf(write,"%s\t%s\t%s\t%s\t%s\n"
,ADDRLIST->book [i].name
,ADDRLIST->book[i].gender
,ADDRLIST->book [i].age
,ADDRLIST->book [i].tele_number
,ADDRLIST->book [i].address );
}
fclose(write);
}
//加载通讯录
void LOAD_ADDRLIST_BOOK(address_book *ADDRLIST)
{
FILE* read = fopen(FILE_PATH,"r");
assert(ADDRLIST);
if(read == NULL)
{
printf("文件打开失败。%s\n",FILE_PATH); //FILE_PATH
return;
}
while(feof(read)==0)
{
fscanf(read,"%s\t%s\t%s\t%s\t%s\n"
,ADDRLIST->book [ADDRLIST->size ].name
,ADDRLIST->book[ADDRLIST->size].gender
,ADDRLIST->book [ADDRLIST->size].age
,ADDRLIST->book [ADDRLIST->size].tele_number
,ADDRLIST->book [ADDRLIST->size].address );
++ADDRLIST->size ;
}
fclose(read);
}
下面是测试代码:
#include<stdio.h>
#include"address_book.h"
int main()
{
int input = 0;
ADDR_BOOK_Init(&ADDRLIST);
LOAD_ADDRLIST_BOOK(&ADDRLIST);
do
{
menu();
printf("请选择你的需求:");
scanf("%d",&input);
switch(input)
{
case ADDContact:
{
ADD_ADDR_BOOK(&ADDRLIST);
SAVE_ADDRLIST_BOOK(&ADDRLIST);
}
break;
case DELETEContact:
ERASE_ADDRLIST_BOOK(&ADDRLIST);
SAVE_ADDRLIST_BOOK(&ADDRLIST);
break;
case FINDContact:
FIND_ADDRLIST_BOOK(&ADDRLIST);
break;
case UPDATAContact:
UPDATA_ADDRLIST_BOOK(&ADDRLIST);
SAVE_ADDRLIST_BOOK(&ADDRLIST);
break;
case DISPLAYContact:
DISPLAY_ALL_ADDRLIST_BOOK(&ADDRLIST);
break;
case DESTROYContact:
DESTROY_ADDRLIST_BOOK(&ADDRLIST);
SAVE_ADDRLIST_BOOK(&ADDRLIST);
break;
case SORTBYNAMEContact:
BUBBLE_SORT_ADDRLIST_BOOK(&ADDRLIST);
SAVE_ADDRLIST_BOOK(&ADDRLIST);
break;
case EXIT:
break;
default:
printf("输入非法,请重新输入:\n");
break;
}
}while(input);
return 0;
}
2.动态通讯录
实现的功能和静态通讯录有相同的功能,不同的地方就是动态通讯的联系人保存在堆上。其代码的实现如下:
#pragma once
#define NAME_SIZE 100
#define TEL_SIZE 100
#define ADD_SIZE 200
#define TEXTHEADER printf("\n---------------------%s--------------------\n",__FUNCTION__)
#define FILE_PATH "Dbook.txt"
enum{
DISPLAY = 1,
ADD = 2,
ERASE = 3,
FIND = 4,
INSERT = 5,
DESTROY = 6,
EXIT = 0
};
typedef struct PersonInfo{
char name[NAME_SIZE];
char tel[TEL_SIZE];
char add[ADD_SIZE];
}PersonInfo;
typedef struct AddrBook{
PersonInfo* data;
size_t size;
size_t capacity;
}AddrBook;
AddrBook addr_book;
void InitAddressBook(AddrBook* addr_book);
void DisplayAddressBook(AddrBook* addr_book);
void AddAddressBook(AddrBook* addr_book);
void MallocPersonInfo(AddrBook* addr_book);
void SaveAddrBook(AddrBook* addr_book);
void LoadAddrBook(AddrBook* addr_book);
void EraseAddrBook(AddrBook* addr_book);
void FindAddrBook(AddrBook* addr_book);
void InsertAddrBook(AddrBook* addr_book);
void DestroyAddrBook(AddrBook* addr_book);
.c文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"AddressBook.h"
//初始化通讯录
void InitAddressBook(AddrBook* addr_book)
{
addr_book->size =0;
addr_book->capacity =1;
addr_book->data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
if(addr_book->data == NULL)
{
printf("空间开辟失败.\n");
return;
}
}
//打印通讯录
void DisplayAddressBook(AddrBook* addr_book)
{
size_t i =0;
if(addr_book == NULL)
{
return;
}
if(addr_book->size == 0)
{
printf("通讯录为空.%s\n",FILE_PATH);
return;
}
printf("【姓 名】\t\t【电 话】\t\t【地 址】\n");
for(i=0;i < addr_book->size ;i++)
{
printf("%s\t\t%s\t\t%s\n",addr_book->data[i].name ,
addr_book->data[i].tel ,
addr_book->data[i].add);
}
printf("\n");
}
void MallocPersonInfo(AddrBook* addr_book)
{
size_t i =0;
PersonInfo* new_book = NULL;
if(addr_book == NULL)
{
return;
}
addr_book->capacity = 2*addr_book->capacity +1;
new_book = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
for(i=0;i<addr_book->size ;i++)
{
new_book[i] = addr_book->data [i];
}
free(addr_book->data);
addr_book->data = new_book;
}
//添加通讯录
void AddAddressBook(AddrBook* addr_book)
{
if(addr_book->size >= addr_book->capacity )
{
MallocPersonInfo(addr_book);
}
printf("开始添加通讯录\n");
printf("请输入姓名:\n");
scanf("%s",addr_book->data[addr_book->size ].name );
printf("请输入电话:\n");
scanf("%s",addr_book->data[addr_book->size ].tel );
printf("请输入地址:\n");
scanf("%s",addr_book->data[addr_book->size ].add );
printf("添加成功\n");
++addr_book->size ;
}
//保存通讯录
void SaveAddrBook(AddrBook* addr_book)
{
FILE* fw = fopen(FILE_PATH,"w");
size_t i = 0;
if(addr_book == NULL)
{
return;
}
if(fw == NULL)
{
printf("打开文件失败.%s\n",FILE_PATH);
return;
}
for(i=0;i<addr_book->size ;i++)
{
fprintf(fw,"%s\t\t%s\t\t%s\n",addr_book->data[i].name,
addr_book->data[i].tel,
addr_book->data[i].add);
}
fclose(fw);
}
//加载通讯录
void LoadAddrBook(AddrBook* addr_book)
{
FILE* fr = fopen(FILE_PATH,"r");
if(addr_book->size == 0 )
{
return;
}
if(fr == NULL)
{
printf("打开通讯录失败,%s\n",FILE_PATH);
return;
}
while(feof(fr) == 0) //文件结束,返回非零值;否则返回0
{
fscanf(fr,"%s\t\t%s\t\t%s\n",addr_book->data[addr_book->size ].name ,
addr_book->data[addr_book->size ].tel ,
addr_book->data[addr_book->size ].add);
++addr_book->size ;
addr_book->capacity+=addr_book->size ;
}
fclose(fr);
}
//删除通讯录中的指定条目
void EraseAddrBook(AddrBook* addr_book)
{
size_t i = 0;
size_t j = 0;int flag = 0;
char to_deleted[NAME_SIZE];
if(addr_book == NULL)
{
return;
}
if(addr_book->size == 0)
{
printf("通讯录为空.%s\n",FILE_PATH);
return;
}
printf("请输入需要删除的人的姓名:");
scanf("%s",to_deleted);
for(i=0;i<addr_book->size ;i++)
{
if(strcmp(addr_book->data [i].name ,to_deleted)==0)
{
for(j=i;j< addr_book->size-1;j++)
{
addr_book->data [j] = addr_book->data [j+1];
}
--addr_book->size;
printf("删除成功.\n");
flag = 1;
return;
}
}
if(flag == 0)
{
printf("通讯录中没有此人.\n");
return;
}
}
//查找通讯录
void FindAddrBook(AddrBook* addr_book)
{
int flag = 0;
size_t i = 0;
char to_find[NAME_SIZE];
if(addr_book == NULL)
{
return;
}
if(addr_book->size == 0)
{
printf("通讯录为空.%s\n",FILE_PATH);
return;
}
printf("请输入想要查找的人的姓名:");
scanf("%s",to_find);
for(i=0;i<addr_book->size;i++)
{
if(strcmp(addr_book->data[i].name,to_find)==0)
{
printf("%s\t\t%s\t\t%s\n",addr_book->data[i].name ,
addr_book->data[i].tel ,
addr_book->data[i].add);
printf("查找成功.\n");
flag = 1;
return;
}
}
if(flag == 0)
{
printf("通讯录中没有此人.\n");
return;
}
}
//修改通讯录信息
void InsertAddrBook(AddrBook* addr_book)
{
int flag = 0;
size_t i = 0;
char to_insert[NAME_SIZE];
if(addr_book == NULL)
{
return;
}
if(addr_book->size == 0)
{
printf("通讯录为空.%s\n",FILE_PATH);
return;
}
printf("请输入想要修改的人的姓名:");
scanf("%s",to_insert);
for(i=0;i<addr_book->size ;i++)
{
if(strcmp(addr_book->data[i].name,to_insert)==0)
{
printf("请重新输入姓名:\n");
scanf("%s",addr_book->data[i].name );
printf("请重新电话:\n");
scanf("%s",addr_book->data[i].tel );
printf("请重新输入地址:\n");
scanf("%s",addr_book->data[i].add );
printf("修改成功\n");
flag = 1;
return;
}
}
if(flag == 0)
{
printf("通讯录中没有此人.\n");
return;
}
}
//销毁通讯录
void DestroyAddrBook(AddrBook* addr_book)
{
if(addr_book == NULL)
{
return;
}
addr_book->size = 0;
addr_book->capacity =0;
free(addr_book->data );
addr_book->data = NULL;
}
下面是动态通讯录的测试代码:
#include<stdio.h>
#include"AddressBook.h"
void menu(){
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");
printf("\n 0.退出通讯录 \n");
printf("\n○○○○○○○○○○○○○○○○○○○○○○○○○○○○○\n");
}
int main(){
int input = 0;
InitAddressBook(&addr_book);
LoadAddrBook(&addr_book);
do
{
menu();
printf("亲,请输入您的需求:");
scanf("%d",&input);
switch(input)
{
case DISPLAY:DisplayAddressBook(&addr_book);
break;
case ADD: AddAddressBook(&addr_book);
SaveAddrBook(&addr_book);
break;
case ERASE:EraseAddrBook(&addr_book);
SaveAddrBook(&addr_book);
break;
case FIND:FindAddrBook(&addr_book);
break;
case INSERT:InsertAddrBook(&addr_book);
SaveAddrBook(&addr_book);
break;
case DESTROY:DestroyAddrBook(&addr_book);
SaveAddrBook(&addr_book);
break;
case EXIT:
break;
default:
printf("输入错误,请重新输入.");
break;
}
}while(input);
return 0;
}
以上的代码都是在VS2008上面。。。。