我猜点进来的要么是搞C语言大作业的,要么是在B站看了鹏哥视频的。
但是鹏哥实现的通讯录是静态版本的,我的是动态版本的。
不管咋样,我不会详细讲,我只给代码,有不回了的可以直接问我。
跟三子棋和扫雷一样,都是三个文件,两个.c 一个.h。
上代码:
contact.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
enum option
{
EXIT,
ADD,
DELE,
SEARCH,
MODIFY,
AGESORT,
SHOW,
NAMESORT
};
//人员信息
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
}PeoInfo;
//通讯录
typedef struct contact
{
//动态开辟
PeoInfo* data;
//实际人数
size_t sz;
//容量
size_t capacity;
}contact;
//菜单
void menu();
//初始化
void ContactInit(contact* pc);
//销毁
void ContactDestroy(contact* pc);
//增
void ContactAdd(contact* pc);
//删
void ContactDele(contact* pc);
//查
void ContactFind(contact* pc);
//改
void ContactModify(contact* pc);
//打印
void ContactPrint(contact* pc);
//年龄排序
void ContactSortByAge(contact* pc);
//名字排序
void ContactSortByName(contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//菜单
void menu()
{
printf("*******************************\n");
printf("***** 1.add 2.dele ****\n");
printf("***** 3.search 4.modify ****\n");
printf("***** 5.AgeSort 6.show ****\n");
printf("***** 7.NameSort 0.exit ****\n");
printf("*******************************\n");
}
//初始化
void ContactInit(contact* pc)
{
assert(pc);
pc->data = NULL;
pc->capacity = pc->sz = 0;
}
//销毁
void ContactDestroy(contact* pc)
{
assert(pc);
free(pc->data);
pc->capacity = pc->sz = 0;
}
//创建一个新的人员
static PeoInfo* BuyNewPeoInfo()
{
PeoInfo* newPeo = (PeoInfo*)malloc(sizeof(PeoInfo));
if (newPeo == NULL)
{
printf("malloc fail\n");
exit(-1);
}
printf("请输入姓名:>");
scanf("%s", newPeo->name);
printf("请输入年龄:>");
scanf("%d", &(newPeo->age));
printf("请输入性别:>");
scanf("%s", newPeo->sex);
printf("请输入电话:>");
scanf("%s", newPeo->tele);
return newPeo;
}
//检查是否要扩容
void CheckCapacity(contact* pc)
{
if (pc->sz == pc->capacity)
{
size_t newCapacity = pc->capacity == 0 ? 4 : pc->capacity * 2;
PeoInfo* rePeo = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * newCapacity);
if (rePeo == NULL)
{
printf("realloc fail\n");
exit(-1);
}
pc->data = rePeo;
pc->capacity = newCapacity;
}
}
//增
void ContactAdd(contact* pc)
{
assert(pc);
PeoInfo* newPeo = BuyNewPeoInfo();
CheckCapacity(pc);
pc->data[pc->sz].age = newPeo->age;
strcpy(pc->data[pc->sz].name, newPeo->name);
strcpy(pc->data[pc->sz].sex, newPeo->sex);
strcpy(pc->data[pc->sz].tele, newPeo->tele);
free(newPeo);
pc->sz++;
}
//打印
void ContactPrint(contact* pc)
{
assert(pc);
printf("%-8s %-5s %-5s %-20s\n", "姓名", "年龄", "性别", "电话");
for (size_t i = 0; i < pc->sz; i++)
{
printf("%-8s %-5d %-5s %-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele);
}
}
//查询子函数
static int _search_by_name(contact* pc, char name[])
{
size_t i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//查
void ContactFind(contact* pc)
{
printf("请输入你要查找的人的姓名:>");
char name[MAX_NAME];
scanf("%s", name);
int pos = _search_by_name(pc, name);
if (pos == -1)
{
printf("查无此人\n");
return;
}
printf("%-8s %-5s %-5s %-20s\n", "姓名", "年龄", "性别", "电话");
printf("%-8s %-5d %-5s %-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele);
}
//删
void ContactDele(contact* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("当前通讯录无人员\n");
return;
}
printf("请输入你要删除的人的姓名:>");
char name[MAX_NAME];
scanf("%s", name);
int pos = _search_by_name(pc, name);
if (pos == -1)
{
printf("查无此人\n");
return;
}
for (size_t i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
//改
void ContactModify(contact* pc)
{
assert(pc);
printf("请输入你要修改的人的姓名:>");
char name[MAX_NAME];
scanf("%s", name);
int pos = _search_by_name(pc, name);
if (pos == -1)
{
printf("查无此人\n");
return;
}
printf("请输入修改后的信息:\n");
printf("年龄:");
scanf("%d", &(pc->data[pos].age));
printf("性别:");
scanf("%s", pc->data[pos].sex);
printf("电话:");
scanf("%s", pc->data[pos].tele);
printf("修改成功\n");
}
int AgeCmp(const void* prev,const void* next)
{
return ((PeoInfo*)prev)->age - ((PeoInfo*)next)->age;
}
//排序
void ContactSortByAge(contact* pc)
{
assert(pc);
qsort(pc->data, pc->sz, sizeof(PeoInfo), AgeCmp);
printf("将年龄按照升序排序后的结果为:\n");
ContactPrint(pc);
}
int NameCmp(const void* prev, const void* next)
{
return strcmp(((PeoInfo*)prev)->name, ((PeoInfo*)next)->name);
}
//名字排序
void ContactSortByName(contact* pc)
{
assert(pc);
qsort(pc->data, pc->sz, sizeof(PeoInfo), NameCmp);
printf("将名字按照升序排序后的结果为:\n");
ContactPrint(pc);
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
int main()
{
int input = 0;
contact con;
ContactInit(&con);
do
{
menu();
printf("请选择你需要的功能:>");
scanf("%d", &input);
switch (input)
{
case ADD:
ContactAdd(&con);
break;
case DELE:
ContactDele(&con);
break;
case SEARCH:
ContactFind(&con);
break;
case MODIFY:
ContactModify(&con);
break;
case AGESORT:
ContactSortByAge(&con);
break;
case SHOW:
ContactPrint(&con);
break;
case NAMESORT:
ContactSortByName(&con);
break;
case EXIT:
break;
default:
printf("选择错误,重新选择。\n");
}
} while (input);
ContactDestroy(&con);
return 0;
}
结束。