contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAXNAME 10
#define MAXSEX 4
#define MAXTELE 12
#define MAXADDR 20
typedef struct PeaInfo
{
char name[MAXNAME];
int age;
char sex[MAXSEX];
char tele[MAXTELE];
char addr[MAXADDR];
}PeaInfo;
typedef struct Contact
{
PeaInfo* Contact;
int count;
int capacity;
}Contact,*pContact;
void CheckCapacity(pContact pcon);
void InitContact(pContact pcon);
void AddContact(pContact pcon);
void DelContact(pContact pcon);
void ModifyContact(pContact pcon);
void SearchContact(pContact pcon);
void EmptyContact(pContact pcon);
void SortContact(pContact pcon);
void ExitContact(pContact pcon);
void ShowContact(pContact pcon);
#endif //_CONTACT_H__
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
//作者:刘月琪 基本功能的C语言实现
#include"contact.h"
void InitContact(pContact pcon) //初始化通讯录
{
pcon->Contact = (PeaInfo*)malloc(sizeof(PeaInfo)*DEFAULT_SZ); //每次分配3个PeaInfo大小的存储单元
if (pcon->Contact == NULL)
{
perror("memory allocation failed");
return;
}
pcon->count = 0;
pcon->capacity = DEFAULT_SZ;
memset(pcon->Contact,0,DEFAULT_SZ*sizeof(PeaInfo));
return;
}
void destory_contact(pContact pcon);
void CheckCapacity(pContact pcon)
{
if (pcon->count == pcon->capacity)
{
printf("空间不够,开辟空间\n");
PeaInfo* tmp = (PeaInfo*)realloc(pcon->Contact,(pcon->capacity+INC_SZ)*sizeof(PeaInfo));
if (tmp == NULL)
{
perror("memory allocation failed");
return;
}
pcon->Contact = tmp;
pcon->capacity += INC_SZ;
}
}
void AddContact(pContact pcon)
{
CheckCapacity(pcon); //判断并分配空间
printf("请输入联系人姓名:");
scanf("%s",pcon->Contact[pcon->count].name);
printf("请输入联系人年龄:");
scanf("%d", &(pcon->Contact[pcon->count].age));
printf("请输入联系人性别:");
scanf("%s", pcon->Contact[pcon->count].sex);
printf("请输入联系人电话:");
scanf("%s", pcon->Contact[pcon->count].tele);
printf("请输入联系人地址:");
scanf("%s", pcon->Contact[pcon->count].addr);
pcon->count++;
printf("添加成功\n");
}
int FindEntry(pContact pcon, char* name)
{
int i = 0;
for (i = 0; i < pcon->count; i++)
{
if (strcmp(name, pcon->Contact[i].name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(pContact pcon)
{
int i = 0;
int pos = 0;
char name[MAXNAME] = { 0 };
if (pcon->count == 0)
{
printf("电话本已空\n");
return;
}
printf("请输入要删除的联系人的姓名:");
scanf("%s", name);
pos = FindEntry(pcon,name);
if (pos == -1)
{
printf("不存在该联系人\n");
return;
}
for (i = pos; i < pcon->count; i++)
{
pcon->Contact[i] = pcon->Contact[i + 1];
}
pcon->count--;
printf("删除成功!!!\n");
}
void ModifyContact(pContact pcon)
{
int pos = 0;
char name[MAXNAME] = { 0 };
printf("请输入你要修改信息的联系人的姓名:");
scanf("%s",name);
pos = FindEntry(pcon, name);
printf("请输入联系人姓名:");
scanf("%s", pcon->Contact[pos].name);
printf("请输入联系人年龄:");
scanf("%d", &(pcon->Contact[pos].age));
printf("请输入联系人性别:");
scanf("%s", pcon->Contact[pos].sex);
printf("请输入联系人电话:");
scanf("%s", pcon->Contact[pos].tele);
printf("请输入联系人地址:");
scanf("%s", pcon->Contact[pos].addr);
return;
}
void SearchContact(pContact pcon)
{
int pos = 0;
char name[MAXNAME] = { 0 };
printf("请输入你要查找的联系人的姓名:");
scanf("%s", name);
pos = FindEntry(pcon, name);
if (pos == -1)
{
printf("未找到该联系人!!!\n");
return;
}
printf("%10s%10d%10s%10s%10s\n",
pcon->Contact[pos].name,
pcon->Contact[pos].age,
pcon->Contact[pos].sex,
pcon->Contact[pos].tele,
pcon->Contact[pos].addr);
return;
}
void EmptyContact(pContact pcon)
{
pcon->count = 0;
return;
}
void Swap(PeaInfo* a, PeaInfo* b)
{
PeaInfo tmp = *a;
*a = *b;
*b = tmp;
}
void SortContact(pContact pcon)
{
assert(pcon != NULL);
int i = 0;
int j = 0;
for (i = 0; i < pcon->count; i++)
{
for (j = 0; j < pcon->count - i - 1; j++)
{
if (strcmp(pcon->Contact[j].name, pcon->Contact[j + 1].name) > 0)
Swap(&(pcon->Contact[j]),&(pcon->Contact[j+1]));
}
}
printf("排序完成!!!\n");
return;
}
void ExitContact(pContact pcon)
{
return;
}
void ShowContact(pContact pcon)
{
int i = 0;
printf("%10s%10s%10s%10s%10s\n","name","age","sex","tele","addr");
for (i = 0; i < pcon->count; i++)
{
printf("%10s%10d%10s%10s%10s\n",
pcon->Contact[i].name,
pcon->Contact[i].age,
pcon->Contact[i].sex,
pcon->Contact[i].tele,
pcon->Contact[i].addr);
}
return;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
//作者:刘月琪 基本功能的C语言实现
#include"contact.h"
enum Option
{
EXIT,
ADD,
DEL,
MODIFY,
SEARCH,
SHOW,
EMPTY,
SORT
};
void menu()
{
printf(" 通讯录 \n");
printf("***************************\n");
printf("***** 1.add ******\n");
printf("***** 2.del ******\n");
printf("***** 3.modify ******\n");
printf("***** 4.search ******\n");
printf("***** 5.show ******\n");
printf("***** 6.empty ******\n");
printf("***** 7.sort ******\n");
printf("***** 0.exit ******\n");
printf("***************************\n");
}
void test()
{
int input = 0;
Contact con = { 0 };
InitContact(&con);
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case EMPTY:
EmptyContact(&con);
break;
case SORT:
SortContact(&con);
break;
case EXIT:
ExitContact(&con);
break;
default:
printf("输入错误,请重新输入!!!\n");
break;
}
} while (1);
return;
}
int main()
{
test();
return 0;
}