总言
??简单通讯录实现,分静态版本和动态版本。 ??现阶段各代码解释在动态版本内。
??
??
静态版
contact.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define Max 1000
#define NameMax 20
#define SexMax 5
#define TeleMax 12
#define AddrMax 25
typedef struct PeoInfo
{
char name[NameMax];
int age;
char sex[SexMax];
char tele[TeleMax];
char addr[AddrMax];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[Max];
int sz;
}Contact;
enum Option
{
Exit,
Add,
Delete,
Search,
Modifly,
Show,
Clear,
Sort
};
void InitContact(Contact* pho);
void AddContact(Contact* pho);
void ShowContact(const Contact* pho);
void DeleteContact(Contact* pho);
void SearchContact(const Contact* pho);
void ModiflyContact(Contact* pho);
void ClearContact(Contact* pho);
void SortContact(Contact* pho);
?? ??
test.c
#include "contact.h"
void menu()
{
printf("*****************************************\n");
printf("******** 1.Add 2.Delete *********\n");
printf("******** 3.Search 4.Modify *********\n");
printf("******** 5.Show 6.Clear *********\n");
printf("******** 7.Sort 0.Exit *********\n");
printf("*****************************************\n");
}
void test()
{
Contact pho;
InitContact(&pho);
int input = 0;
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case Add:
AddContact(&pho);
break;
case Delete:
DeleteContact(&pho);
break;
case Search:
SearchContact(&pho);
break;
case Modifly:
ModiflyContact(&pho);
break;
case Show:
ShowContact(&pho);
break;
case Clear:
ClearContact(&pho);
break;
case Sort:
SortContact(&pho);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
int main(void)
{
test();
return 0;
}
?? ??
contact.c
#include"contact.h"
void InitContact(Contact* pho)
{
assert(pho);
pho->sz = 0;
memset(pho->data, 0, sizeof(pho->data));
}
void AddContact(Contact* pho)
{
printf("输入联系人姓名:");
scanf("%s", pho->data[pho->sz].name);
printf("输入联系人年龄:");
scanf("%d", &(pho->data[pho->sz].age));
printf("输入联系人性别:");
scanf("%s", pho->data[pho->sz].sex);
printf("输入联系人电话:");
scanf("%s", pho->data[pho->sz].tele);
printf("输入联系人地址:");
scanf("%s", pho->data[pho->sz].addr);
pho->sz++;
printf("添加成功\n");
}
int FindContact(const char* name,const Contact*pho)
{
assert(name && pho);
int i;
for (i = 0; i < pho->sz; i++)
{
if (0 == strcmp(pho->data[i].name, name))
return i;
}
return -1;
}
void DeleteContact(Contact* pho)
{
assert(pho);
if (pho->sz == 0)
{
printf("通讯录为空,删除失败\n");
return;
}
char name[NameMax] = { 0 };
printf("请输入需要删除的联系人姓名:");
scanf("%s", name);
int result = FindContact(name, pho);
if (result == -1)
{
printf("删除失败,目标联系人不存在\n");
return;
}
int i;
for (i = result; i < pho->sz; i++)
{
pho->data[i] = pho->data[i + 1];
}
pho->sz--;
printf("删除成功\n");
}
void SearchContact(const Contact* pho)
{
assert(pho);
if (pho->sz == 0)
{
printf("通讯录为空,查找失败\n");
return;
}
char name[NameMax] = { 0 };
printf("请输入目标联系人的姓名:");
scanf("%s", name);
int result = FindContact(name, pho);
if (result == -1)
{
printf("查找失败,目标联系人不存在\n");
return ;
}
printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[result].name,
pho->data[result].age, pho->data[result].sex,
pho->data[result].tele, pho->data[result].addr);
}
void ModiflyContact(Contact* pho)
{
assert(pho);
if (pho->sz == 0)
{
printf("通讯录为空,修改失败\n");
return;
}
char name[NameMax] = { 0 };
printf("请输入需要修改的联系人姓名:");
scanf("%s", name);
int result = FindContact(name, pho);
if (result == -1)
{
printf("查找失败,目标联系人不存在\n");
return;
}
int aim;
printf("输入需要修改的信息:1、姓名,2、年龄,3、性别,4、电话,5、住址.");
scanf("%d", &aim);
switch (aim)
{
case 1:
printf("请输入新的姓名:");
scanf("%s", pho->data[result].name);
case 2:
printf("请输入新的年龄:");
scanf("%s", &(pho->data[result].age));
case 3:
printf("请输入新的性别:");
scanf("%s", pho->data[result].sex);
case 4:
printf("请输入新的电话:");
scanf("%s", pho->data[result].tele);
case 5:
printf("请输入新的住址:");
scanf("%s", pho->data[result].addr);
}
printf("修改成功\n");
}
void ShowContact(const Contact* pho)
{
assert(pho);
printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
int i;
for (i = 0; i < pho->sz; i++)
{
printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[i].name,
pho->data[i].age, pho->data[i].sex,
pho->data[i].tele, pho->data[i].addr);
}
}
void ClearContact(Contact* pho)
{
InitContact(pho);
}
int IntCmp(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}
void SortContact(Contact* pho)
{
qsort(pho->data,pho->sz,sizeof(PeoInfo),IntCmp);
}
?? ??
动态版
?? 动态版指通讯录总人数根据实际存入信息实时动态变化。例如,初始化通讯录人数容量为三人,后续该三个容量被使用后,按一定规律再为通讯录增加人数容量,比如从三人容量增加到五人容量,或者以倍数关系扩容等。 ??需要用到动态空间的相关知识,在静态版本的基础上做一些小改动。
contact.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define MaxName 20
#define MaxSex 5
#define MaxTele 12
#define MaxAddrs 25
#define CapaInit 3
typedef struct PeoInfo
{
char name[MaxName];
int age;
char sex[MaxSex];
char tele[MaxTele];
char addrs[MaxAddrs];
}PeoInfo;
typedef struct Contact
{
PeoInfo* data;
int sz;
int capacity;
}Contact;
enum Option
{
Exit,
Add,
Delete,
Search,
Modifly,
Show,
Clear,
Sort
};
void InitContact(Contact* pho);
void AddContact(Contact* pho);
void DeletContact(Contact* pho);
void SearchContact(Contact* pho);
void ModifyContact(Contact* pho);
void ShowContact(Contact* pho);
void ClearContact(Contact* pho);
void DestroyContact(Contact* pho);
void SortContact(Contact* pho);
?? ??
test.c
#include "contact.h"
void menu(void)
{
printf("*****************************************\n");
printf("******** 1.Add 2.Delete *********\n");
printf("******** 3.Search 4.Modify *********\n");
printf("******** 5.Show 6.Clear *********\n");
printf("******** 7.Sort 0.Exit *********\n");
printf("*****************************************\n");
}
void test(void)
{
Contact pho;
InitContact(&pho);
int input = 0;
do {
menu();
scanf("%d", &input);
switch (input)
{
case Exit:
DestroyContact(&pho);
printf("退出程序\n");
break;
case Add:
AddContact(&pho);
break;
case Delete:
DeletContact(&pho);
break;
case Search:
SearchContact(&pho);
break;
case Modifly:
ModifyContact(&pho);
break;
case Show:
ShowContact(&pho);
break;
case Clear:
ClearContact(&pho);
break;
case Sort:
SortContact(&pho);
break;
default:
printf("输入出错误,请重新输入!\n");
}
} while (input);
}
int main(void)
{
test();
return 0;
}
?? ??
contact.c
#include"contact.h"
void InitContact(Contact* pho)
{
assert(pho);
pho->sz = 0;
pho->capacity = CapaInit;
pho->data=(PeoInfo *)malloc(pho->capacity * sizeof(PeoInfo));
if (pho->data == NULL)
{
perror("IntiContact::malloc");
return;
}
}
void CheckContact(Contact* pho)
{
assert(pho);
if (pho->sz == pho->capacity)
{
PeoInfo* pdata=realloc(pho->data, (pho->capacity + 2) * sizeof(PeoInfo));
if (pdata != NULL)
{
pho->capacity += 2;
pho->data = pdata;
printf("扩容成功\n");
}
else
{
perror("CheckContact::realloc");
return;
}
}
}
void AddContact(Contact* pho)
{
assert(pho);
CheckContact(pho);
printf("请输入联系人姓名:");
scanf("%s", pho->data[pho->sz].name);
printf("请输入联系人年龄:");
scanf("%d", &(pho->data[pho->sz].age));
printf("请输入联系人性别:");
scanf("%s", pho->data[pho->sz].sex);
printf("请输入联系人电话:");
scanf("%s", pho->data[pho->sz].tele);
printf("请输入联系人地址:");
scanf("%s", pho->data[pho->sz].addrs);
pho->sz++;
printf("添加成功\n");
}
int FindContact(const char* name, const Contact* pho)
{
assert(pho);
int i;
for (i = 0; i < pho->sz; i++)
{
if (strcmp(name, pho->data[i].name) == 0)
return i;
}
return -1;
}
void DeletContact(Contact* pho)
{
assert(pho);
if (pho->sz == 0)
{
printf("删除失败,通讯录中无联系人\n");
return ;
}
char name[MaxName] = { 0 };
printf("请输入要删除的联系人姓名:");
scanf("%s", name);
int result = FindContact(name, pho);
if (-1 == result)
{
printf("删除失败,目标联系人不存在\n");
return;
}
int i;
for (i = result; i < pho->sz; i++)
{
pho->data[i] = pho->data[i + 1];
}
pho->sz--;
printf("删除成功\n");
}
void SearchContact(Contact* pho)
{
assert(pho);
if (0 == pho->sz)
{
printf("通讯录为空,查找失败\n");
return;
}
char name[MaxName] = { 0 };
printf("请输入需要查找的联系人姓名:");
scanf("%s", name);
int result = FindContact(name, pho);
if (-1 == result)
{
printf("查找失败,目标联系人不存在\n");
return;
}
printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[result].name,
pho->data[result].age, pho->data[result].sex,
pho->data[result].tele, pho->data[result].addrs);
}
void ModifyContact(Contact* pho)
{
assert(pho);
if (0 == pho->sz)
{
printf("通讯录为空,修改失败\n");
return 0;
}
char name[MaxName] = { 0 };
printf("请输入需要修改的联系人的姓名:");
scanf("%s", name);
int result = FindContact(name, pho);
if (-1 == result)
{
printf("修改失败,目标联系人不存在\n");
return 0;
}
int aim = 0;
do {
printf("请输入需要修改的信息:1、姓名,2、年龄,3、性别,4、电话,5、地址,0、退出");
scanf("%d", &aim);
switch (aim)
{
case 0:
return;
case 1:
printf("请输入新的姓名:");
scanf("%s", pho->data[result].name);
break;
case 2:
printf("请输入新的年龄:");
scanf("%d", &(pho->data[result].age));
break;
case 3:
printf("请输入新的性别:");
scanf("%s", pho->data[result].sex);
break;
case 4:
printf("请输入新的电话:");
scanf("%s", pho->data[result].tele);
break;
case 5:
printf("请输入新的地址:");
scanf("%s", pho->data[result].addrs);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (aim);
printf("修改成功\n");
}
void ShowContact(Contact* pho)
{
assert(pho);
printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
int i;
for (i = 0; i < pho->sz; i++)
{
printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[i].name,
pho->data[i].age, pho->data[i].sex,
pho->data[i].tele, pho->data[i].addrs);
}
}
void ClearContact(Contact* pho)
{
InitContact(pho);
}
void DestroyContact(Contact *pho)
{
free(pho->data);
pho->data = NULL;
pho->capacity = 0;
pho->sz = 0;
}
int CmpPho(const void *e1,const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pho)
{
qsort(pho->data, pho->sz, sizeof(PeoInfo), CmpPho);
}
?? ??
|