终极版–增删改查 排序 动态开辟内存 文件存储
addressbook.h
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<assert.h>
#include<string.h>
#define DEFAULT_SZ 3
#define DEFAULT_INC 5
typedef struct people
{
char name[20];
char sex[5];
int age;
char tel[11];
char address[50];
}peo;
typedef struct LinkMan
{
peo *pcon;
size_t size;
size_t capacity;
}linkman;
void AddressBookInit(linkman* Plink);
void AddInformation(linkman* Plink);
void DeleteInformation(linkman* Plink);
void FindInformation(linkman* Plink);
void AmendInformation(linkman* Plink);
void ShowInformation(linkman* Plink);
void EmptyInformation(linkman* Plink);
void AddressBookSort(linkman* Plink);
void Dilatation(linkman* Plink);
int Find(linkman* Plink, char* name);
void AddressBookSortAsc(linkman* Plink, int(*cmp)(int*, int*));
int AgeSortAsc(int* a1, int* a2);
int AgeSortDes(int* a1, int* a2);
addressbook.c
#include"addressbook.h"
void AddressBookInit(linkman* Plink)
{
assert(Plink);
Plink->pcon = (peo*)malloc(DEFAULT_SZ*sizeof(peo));
if(Plink->pcon == NULL)
{
perror("malloc error\n");
exit(EXIT_FAILURE);
}
memset(Plink->pcon, 0, DEFAULT_SZ*sizeof(peo));
Plink->size = 0;
Plink->capacity = DEFAULT_SZ;
}
void Dilatation(linkman* Plink)
{
peo* ptr = NULL;
if(Plink->size == Plink->capacity)
{
ptr = (peo*)realloc(Plink->pcon, (Plink->size + DEFAULT_INC)*sizeof(peo));
if(ptr == NULL)
{
perror("realloc error\n");
return;
}
else
{
Plink->pcon = ptr;
Plink->capacity = Plink->capacity + DEFAULT_INC;
}
}
}
void AddInformation(linkman* Plink)
{
assert(Plink);
printf("=====%s=====\n", __FUNCTION__);
Dilatation(Plink);
printf("\n请输入联系人信息=>\n");
printf("姓名:");
scanf("%s", Plink->pcon[Plink->size].name);
printf("性别:");
scanf("%s", Plink->pcon[Plink->size].sex);
printf("年龄:");
scanf("%d", &Plink->pcon[Plink->size].age);
printf("电话:");
scanf("%s", Plink->pcon[Plink->size].tel);
printf("地址:");
scanf("%s", Plink->pcon[Plink->size].address);
Plink->size++;
}
void DeleteInformation(linkman* Plink)
{
printf("=====%s=====\n", __FUNCTION__);
assert(Plink);
char name[20];
printf("请输入要删除的联系人姓名=>");
scanf("%s", &name);
int ret = Find(Plink, name);
if(ret >= 0)
{
char flag1;
printf("确认要删除吗?[y/n] => ");
scanf("%s", &flag1);
if(flag1 == 'y')
{
if(Plink->size == 1)
{
Plink->size--;
}
else
{
for(size_t j=ret; j<Plink->size-1; j++)
{
Plink->pcon[j] = Plink->pcon[j+1];
}
Plink->size--;
}
printf("删除成功\n");
}
else
printf("没有删除\n");
}
}
int Find(linkman* Plink, char* name)
{
printf("=====%s=====\n", __FUNCTION__);
assert(Plink);
size_t k = 0;
for(; k<=Plink->size; k++)
{
if(strcmp(Plink->pcon[k].name, name) == 0)
{
printf("姓名:%s\n", Plink->pcon[k].name);
printf("性别:%s\n", Plink->pcon[k].sex);
printf("年龄:%d\n", &Plink->pcon[k].age);
printf("电话:%s\n", Plink->pcon[k].tel);
printf("地址:%s\n", Plink->pcon[k].address);
return k;
}
}
printf("此人不存在\n");
return -1;
}
void FindInformation(linkman* Plink)
{
printf("=====%s=====\n", __FUNCTION__);
assert(Plink);
char name[20];
printf("请输入要查找的联系人姓名=>");
scanf("%s", &name);
size_t k = 0;
int flag22 = 0;
for(; k<=Plink->size; k++)
{
if(strcmp(Plink->pcon[k].name, name) == 0)
{
flag22 = 1;
printf("姓名:%s\n", Plink->pcon[k].name);
printf("性别:%s\n", Plink->pcon[k].sex);
printf("年龄:%d\n", &Plink->pcon[k].age);
printf("电话:%s\n", Plink->pcon[k].tel);
printf("地址:%s\n", Plink->pcon[k].address);
}
}
if(flag22 != 1)
{
printf("此人不存在\n");
}
}
void AmendInformation(linkman* Plink)
{
printf("=====%s=====\n", __FUNCTION__);
assert(Plink);
if(Plink->size == 0)
{
printf("联系人列表为空\n");
return;
}
char name[20];
printf("请输入要修改的联系人姓名=>");
scanf("%s", &name);
int l = Find(Plink, name);
printf("请修改=>\n");
printf("姓名:");
scanf("%s", Plink->pcon[l].name);
printf("性别:");
scanf("%s", Plink->pcon[l].sex);
printf("年龄:");
scanf("%d", &Plink->pcon[l].age);
printf("电话:");
scanf("%s", Plink->pcon[l].tel);
printf("地址:");
scanf("%s", Plink->pcon[l].address);
printf("修改成功\n");
}
void ShowInformation(linkman* Plink)
{
printf("=====%s=====\n", __FUNCTION__);
assert(Plink);
if(Plink->size == 0)
{
printf("联系人列表为空\n");
return;
}
printf("姓名 性别 年龄 电话 地址\n");
for(size_t m=0; m<Plink->size; m++)
{
printf("%-6s ",Plink->pcon[m].name);
printf("%-6s ",Plink->pcon[m].sex);
printf("%-6d ",Plink->pcon[m].age);
printf("%-6s ",Plink->pcon[m].tel);
printf("%-6s ",Plink->pcon[m].address);
printf("\n");
}
}
void EmptyInformation(linkman* Plink)
{
printf("=====%s=====\n", __FUNCTION__);
if(Plink->size == 0)
{
printf("联系人列表已经为空\n");
return;
}
else
{
Plink->size = 0;
}
if(Plink->pcon != NULL)
{
free(Plink->pcon);
Plink->pcon = NULL;
printf("清空成功\n");
}
else
printf("已经为空\n");
}
int NameSort(char* n1, char* n2)
{
return (n1 > n2) ? 1 : 0;
}
int AgeSortAsc(int* a1, int* a2)
{
printf("=====%s=====\n", __FUNCTION__);
if(*a1 > *a2)
return 1;
else
return 0;
}
int AgeSortDes(int* a1, int* a2)
{
printf("=====%s=====\n", __FUNCTION__);
if(*a1 < *a2)
return 1;
else
return 0;
}
void AddressBookSortAsc(linkman* Plink, int(*cmp)())
{
printf("=====%s=====\n", __FUNCTION__);
assert(Plink);
if(Plink->size == 0)
{
printf("联系人列表为空\n");
return;
}
for(size_t n=0; n<Plink->size; n++)
{
for(size_t o=0; o<Plink->size-n-1; o++)
{
if(cmp(&Plink->pcon[o].age, &Plink->pcon[o+1].age))
{
struct people tmp = Plink->pcon[o];
Plink->pcon[o] = Plink->pcon[o+1];
Plink->pcon[o+1] = tmp;
}
}
}
printf("排序完成\n");
ShowInformation(Plink);
}
main.c
#include"addressbook.h"
void SaveFile(linkman* Plink)
{
FILE* p_file = fopen("addressbook.txt", "a+");
char s[] = "姓名 性别 年龄 电话 地址";
if(p_file != NULL)
{
fprintf(p_file, "%s\n", &s);
for(int i=0; i<Plink->size; i++)
{
fprintf( p_file, "%-9s ", &Plink->pcon[i].name);
fprintf( p_file, "%-9s ", &Plink->pcon[i].sex);
fprintf( p_file, "%-9d ", Plink->pcon[i].age);
fprintf( p_file, "%-9s ", &Plink->pcon[i].tel);
fprintf( p_file, "%-9s \n", &Plink->pcon[i].address);
}
}
fclose(p_file);
p_file = NULL;
}
int main()
{
linkman MyLinkMan;
AddressBookInit(&MyLinkMan);
while(1)
{
int n = 0;
printf("===================================\n");
printf("1:添加 2:删除 3:查找 4:修改\n");
printf("5:显示 8:清空 7:升序 8:降序\n");
printf("0:保存并退出\n");
printf("===================================\n");
printf("请输入=>");
scanf("%d", &n);
if(n>=0 && n<=8)
{
switch(n)
{
case 1:AddInformation(&MyLinkMan);
break;
case 2:DeleteInformation(&MyLinkMan);
break;
case 3:FindInformation(&MyLinkMan);
break;
case 4:AmendInformation(&MyLinkMan);
break;
case 5:ShowInformation(&MyLinkMan);
break;
case 6:EmptyInformation(&MyLinkMan);
break;
case 7:AddressBookSortAsc(&MyLinkMan, AgeSortAsc);
break;
case 8:AddressBookSortAsc(&MyLinkMan, AgeSortDes);
break;
case 0:printf("再见!\n");
SaveFile(&MyLinkMan);
exit(1);
}
}
else
{
printf("输入有误,请重输\n");
continue;
}
}
return 0;
}