通讯录
前言
1.Mian.c
#include"AddressList.h"
enum Usage
{
ALEXIT,
ALPLUS,
ALDELETE,
ALFSHOW,
ALREPLACE,
ALSHOW,
ALDESTORY,
ALSORT
};
void menu()
{
printf("\n");
printf(" 1.添加联系人信息 2.删除指定联系人信息\n");
printf(" 3.查找指定联系人信息 4.修改指定联系人信息\n");
printf(" 5.显示所有联系人信息 6.清空所有联系人\n");
printf(" 7.以名字排序所有联系人 0.退出\n");
printf("\n");
}
void Play()
{
AL address_list;
AL* pal = &address_list;
ALInIt(pal);
printf("欢迎进入通信录。\n");
int n;
do
{
menu();
printf("请输入:");
scanf("%d", &n);
switch (n)
{
//退出通讯录
case ALEXIT:
printf("退出通讯录中...\n");
ALDel(pal);
break;
//添加联系人信息
case ALPLUS:
ALPlus(pal);
break;
//删除指定联系人信息
case ALDELETE:
ALDelete(pal);
break;
//查找指定联系人信息
case ALFSHOW:
ALFShow(pal);
break;
//修改指定联系人信息
case ALREPLACE:
ALReplace(pal);
break;
//显示所有联系人信息
case ALSHOW:
ALShow(pal);
break;
//清空所有联系人
case ALDESTORY:
ALDestory(pal);
break;
//以名字排序所有联系人
case ALSORT:
ALSort(pal);
break;
//选择错误
default:
printf("选择错误。");
break;
}
} while (n);
printf("退出通讯录成功。\n");
}
int main()
{
Play();
return 0;
}
2.AddressList.c
#include"AddressList.h"
//删除通讯录
void ALDel(AL* pal)
{
assert(pal);
free(pal->persons);
pal->persons = NULL;
pal = NULL;
}
//通讯录初始化
void ALInIt(AL* pal)
{
assert(pal);
pal->persons = (P*)calloc(2, sizeof(P));
if (!pal->persons)
{
perror("ALInIt\n");
return;
}
pal->capacity = 2;
pal->count = 0;
}
//找人
static int ALFindName(const AL* pal, const char* name)
{
assert(pal);
int i;
for (i = 0;i < pal->count;i++)
{
if (!(strcmp(name, pal->persons[i].name)))
return i;
}
return -1;
}
//
static int ALCheckAdd(AL* pal)
{
assert(pal);
if (pal->count == pal->capacity)
{
P* pt = (P*)realloc(pal->persons, (pal->capacity + PLUS_NUMBER) * sizeof(P));
if (!pt)
{
perror("ALPlus\n");
return 1;
}
else
{
pal->persons = pt;
pal->capacity += PLUS_NUMBER;
printf("成功增容两位。\n");
}
}
return 0;
}
//添加联系人信息
void ALPlus(AL* pal)
{
assert(pal);
if (ALCheckAdd(pal))
return;
printf("请添加联系人的姓名:");
scanf("%s", pal->persons[pal->count].name);
printf("请添加联系人的性别:");
scanf("%s", pal->persons[pal->count].gender);
printf("请添加联系人的年龄:");
scanf("%hhd", &pal->persons[pal->count].age);
printf("请添加联系人的电话号码:");
scanf("%s", pal->persons[pal->count].phone);
printf("请添加联系人的地址:");
scanf("%s", pal->persons[pal->count].address);
printf("添加联系人%s信息成功!\n", pal->persons[pal->count].name);
pal->count++;
}
//删除指定联系人信息
void ALDelete(AL* pal)
{
assert(pal);
char tmp_name[MAX_NAME];
printf("请输入您要删除的联系人:");
scanf("%s", tmp_name);
int n = ALFindName(pal, tmp_name);
if (n == -1)
{
printf("查无此人。\n");
return;
}
else
{
int i;
for (i = n;i <= pal->count - 1;i++)
pal->persons[i] = pal->persons[i + 1];
pal->count--;
printf("删除联系人%s成功!\n", tmp_name);
}
}
//查找指定联系人信息
void ALFShow(const AL* pal)
{
assert(pal);
char tmp_name[MAX_NAME];
printf("请输入您要查找的联系人:");
scanf("%s", tmp_name);
int n = ALFindName(pal, tmp_name);
if (n == -1)
{
printf("查无此人。\n");
return;
}
else
{
printf("%3s%21s\t%5s\t%3s\t%12s\t%30s\n", "序列", "名字", "性别", "年龄", "电话", "地址");
printf("%3d:%20s\t%5s\t%4d\t%12s\t%30s\n", n + 1,
pal->persons[n].name,
pal->persons[n].gender,
pal->persons[n].age,
pal->persons[n].phone,
pal->persons[n].address);
}
}
//修改指定联系人信息
void ALReplace(AL* pal)
{
assert(pal);
char tmp_name[MAX_NAME];
printf("请输入您要修改的联系人的信息:");
scanf("%s", tmp_name);
int n = ALFindName(pal, tmp_name);
if (n == -1)
{
printf("查无此人。\n");
return;
}
else
{
printf("请修改联系人的姓名:");
scanf("%s", pal->persons[n].name);
printf("请修改联系人的性别:");
scanf("%s", pal->persons[n].gender);
printf("请修改联系人的年龄:");
scanf("%hhd", &pal->persons[n].age);
printf("请修改联系人的电话号码:");
scanf("%s", pal->persons[n].phone);
printf("请修改联系人的地址:");
scanf("%s", pal->persons[n].address);
printf("以成功修改联系人%s的信息为联系人%s的信息!\n", tmp_name, pal->persons[n].name);
}
}
//显示所有联系人信息
void ALShow(const AL* pal)
{
assert(pal);
int i;
printf("%3s%21s\t%5s\t%3s\t%12s\t%30s\n", "序列", "名字", "性别", "年龄", "电话", "地址");
for (i = 0;i < pal->count;i++)
{
printf("%3d:%20s\t%5s\t%4hhd\t%12s\t%30s\n", i + 1,
pal->persons[i].name,
pal->persons[i].gender,
pal->persons[i].age,
pal->persons[i].phone,
pal->persons[i].address);
}
}
//清空所有联系人
void ALDestory(AL* pal)
{
assert(pal);
pal->count = 0;
printf("清空所有联系人成功!\n");
}
//以名字排序
int NameSort(const void* e1, const void* e2)
{
return strcmp(((P*)e1)->name, ((P*)e2)->name);
}
//以名字排序所有联系人
void ALSort(AL* pal)
{
assert(pal);
qsort(pal->persons, pal->count, sizeof(P), NameSort);
printf("以名字排序所有联系人成功!\n");
}
3.AddressList.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
//_CRT_SECURE_NO_WARNINGS
//包含头文件
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
//定义
#define PLUS_NUMBER 2
#define MAX_NAME 10
#define MAX_GENDER 5
#define MAX_PHONE 12
#define MAX_ADDRESS 30
//人的信息包括:姓名、性别、年龄、电话、住址
typedef struct People
{
char name[MAX_NAME];//姓名
char gender[MAX_GENDER];//性别
char age;//年龄
char phone[MAX_PHONE];//电话
char address[MAX_ADDRESS];//住址
}P;
//通讯录可以用来存储1000个人的信息
typedef struct AddressList
{
P* persons;
int count;
int capacity;
}AL;
//删除通讯录
void ALDel(AL* pal);
//通讯录初始化
void ALInIt(AL* pal);
//添加联系人信息
void ALPlus(AL* pal);
//删除指定联系人信息
void ALDelete(AL* pal);
//查找指定联系人信息
void ALFShow(const AL* pal);
//修改指定联系人信息
void ALReplace(AL* pal);
//显示所有联系人信息
void ALShow(const AL* pal);
//清空所有联系人
void ALDestory(AL* pal);
//以名字排序所有联系人
void ALSort(AL* pal);
效果
刚开始:
添加联系人信息
删除指定联系人信息: