一、头文件
#define _CRT_SECURE_NO_WARNINGS 1
#define EXPAND 5
#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 15
#define PLACE_MAX 20
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
enum menu
{
ex = 0,
add,
delet,
find,
change,
show,
clear,
sort,
};
typedef struct student
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tel[TEL_MAX];
char place[PLACE_MAX];
}Stu;
typedef struct contact
{
Stu* person;
int num;
int capability;
}Cont;
void Add(Cont* contact);
void Show(Cont* contact);
void Find(Cont* contact);
void Change(Cont* contact);
void Delet(Cont* contact);
void Clear(Cont* contact);
int compare(void* a, void* b);
二、.c函数文件
#include "contacts.h"
void Add(Cont* contact)
{
assert(contact);
if (contact->capability == 0 || contact->capability == contact->num)
{
Stu* arr = (Stu*)realloc(contact->person, (contact->capability += EXPAND) * sizeof(Stu));
if (arr != NULL)
{
contact->person = arr;
contact->capability += EXPAND;
printf("增容成功\n");
}
else
{
perror("ADD");
printf("增容失败\n");
return;
}
}
Stu* arr = contact->person;
int i = contact->num;
printf("请输入姓名、性别、年龄、电话、地址(用空格分开):");
scanf("%s %s %d %s %s", (arr + i)->name, (arr + i)->sex, &((arr + i)->age), (arr + i)->tel, (arr + i)->place);
contact->num += 1;
printf("增加成功!\n");
}
void Show(Cont* contact)
{
assert(contact);
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\t\n", "姓名", "年龄", "性别", "电话", "地址");
Stu* arr = contact->person;
for (int i = 0; i < contact->num; i++)
{
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\t\n",
(arr + i)->name,
(arr + i)->sex,
(arr + i)->age,
(arr + i)->tel,
(arr + i)->place);
}
}
void Find(Cont* contact)
{
assert(contact);
char input[NAME_MAX];
printf("请输入想要搜索的人名:");
scanf("%s", input);
Stu* arr = contact->person;
for (int i = 0; i < contact->num; i++)
{
if (!(strcmp((arr + i)->name, input)))
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\t\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\t\n",
(arr + i)->name,
(arr + i)->sex,
(arr + i)->age,
(arr + i)->tel,
(arr + i)->place);
break;
}
}
printf("没有此人!\n");
}
void Change(Cont* contact)
{
assert(contact);
char input[NAME_MAX] = {0};
printf("请输入想要修改的人名:");
scanf("%s", input);
Stu* arr = contact->person;
for (int i = 0; i < contact->num; i++)
{
if (!(strcmp((arr + i)->name, input)))
{
printf("请输入姓名、性别、年龄、电话、地址(用空格分开):");
scanf("%s %s %d %s %s", (arr + i)->name, (arr + i)->sex, &((arr + i)->age), (arr + i)->tel, (arr + i)->place);
printf("修改成功!\n");
return;
}
}
printf("没有此人!\n");
}
void Delet(Cont* contact)
{
assert(contact);
char input[NAME_MAX] = { 0 };
printf("请输入想要删除的人名:");
scanf("%s", input);
Stu* arr = contact->person;
for (int i = 0; i < contact->num; i++)
{
if (!(strcmp((arr + i)->name, input)))
{
while (i < contact->num - 1)
{
memcpy(arr + i, arr + i + 1, sizeof(Stu));
i++;
}
contact->num -= 1;
printf("删除成功!\n");
return;
}
}
printf("没有此人!\n");
}
void Clear(Cont* contact)
{
assert(contact);
memset(contact->person, 0, contact->num * sizeof(Stu));
contact->num = 0;
}
int compare(void* a, void* b)
{
return strcmp(((Stu*)a)->name, ((Stu*)b)->name);
}
三、.c测试文件
#include "contacts.h"
void menu()
{
printf("**********欢迎来到通讯录************\n");
printf("*******1. add 2. delet********\n");
printf("*******3. find 4. change*******\n");
printf("*******5. show 6. clear********\n");
printf("*******7. sort 0. exit*********\n");
}
int main()
{
int input = 0;
Cont contact = {NULL,0,0};
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case add:
Add(&contact);
break;
case delet:
Delet(&contact);
break;
case find:
Find(&contact);
break;
case change:
Change(&contact);
break;
case show:
Show(&contact);
break;
case clear:
Clear(&contact);
break;
case sort:
qsort(contact.person, contact.num, sizeof(Stu), compare);
Show(&contact);
break;
case ex:
printf("退出成功!");
break;
}
} while (input);
free(contact.person);
contact.person = NULL;
return 0;
}