实现动态通讯录的基本结构
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7.以名字排序所有联系人
用c语言实现简单的一个动态通讯录的代码如下:
contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include"Contact.h" //初始化 void InitContact(struct Contact* pc) { assert(pc); //先为通讯录初始化INIT_MIN个元素 struct PeoInfo* tmp = (struct PeoInfo*)malloc(sizeof(struct PeoInfo) * INIT_MIN); if (tmp == NULL) { printf("动态开辟失败n"); return; } else { pc->data = tmp; pc->size = 0; //最初通讯录为空 pc->capacity = INIT_MIN; } } //打印 void ShowContact(struct Contact* pc) { assert(pc); int i = 0; printf("%20st%20st%5st%12st%5sn", "name", "add", "age", "tel", "sex"); for (i = 0; i < pc->size; i++) { printf("%20st%20st%5dt%12st%5st", pc->data[i].name, pc->data[i].add, pc->data[i].age, pc->data[i].tel, pc->data[i].sex); printf("n"); } } //删除 void DelContact(struct Contact* pc) { assert(pc); char name[20] = { 0 }; printf("请输入要删除的成员的名字n"); scanf("%s", name); int pos = FindContact(pc, name); if (pos == -1) { printf("成员不存在n"); } else { int i = 0; for (i = pos; i < pc->size - 1; i++) { //后面的成员往前覆盖 pc->data[i] = pc->data[i + 1]; } printf("删除成功n"); //通讯录成员-1 pc->size--; } } //增加成员 void AddContact(struct Contact* pc) { assert(pc); //先判断通讯录是否满了,满了则增容 if (pc->size == pc->capacity) { //增容 ByNewcapacity(pc); } //增加成员 printf("请输入姓名:>"); scanf("%s", pc->data[pc->size].name);; printf("请输入性别:>"); scanf("%s", pc->data[pc->size].sex); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->size].age)); printf("请输入电话号码:>"); scanf("%s", pc->data[pc->size].tel); printf("请输入地址:>"); scanf("%s", pc->data[pc->size].add); //增加了成员,size++ pc->size++; } //查找成员信息 void SeaContact(struct Contact* pc) { printf("请输入要查找的成员名字n"); char name[20] = { 0 }; scanf("%s", name); int i = FindContact(pc, name); if (i == -1) { printf("该成员不存在n"); } else { //打印该成员的信息 //打印标题 printf("%20st%20st%5st%12st%5sn", "name", "add", "age", "tel", "sex"); printf("%20st%20st%5dt%12st%5st", pc->data[i].name, pc->data[i].add, pc->data[i].age, pc->data[i].tel, pc->data[i].sex); printf("n"); } } //查找成员是否存在,存在则返回其在通讯录成员数组的下标,不存在则返回-1 int FindContact(struct Contact* pc, char* name) { assert(pc); //遍历查找 int i = 0; for (i = 0; i < pc->size; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } //找不到 printf("找不到n"); return -1; } //判断通讯录是否为空 //如果size为0,说明通讯录为空 bool EmptyContact(struct Contact* pc) { return pc->size == 0; } //通讯录增容 void ByNewcapacity(struct Contact* pc) { assert(pc); struct PeoInfo* tmp = (struct PeoInfo*)realloc(pc->data, sizeof(struct PeoInfo) * (pc->capacity + 2)); if (tmp == NULL) { printf("增容失败n"); return; } else { printf("增容成功n"); pc->data = tmp; pc->capacity += 2; } } //通讯录释放 void FreeContact(struct Contact* pc) { assert(pc); free(pc->data); pc->data = NULL; pc->capacity = 0; pc->size = 0; } //修改成员信息 void ModifyContact(struct Contact* ps) { if (ps->size == 0) { printf("通讯录为空,请先增加成员n"); } char name[NAME_MAX] = { 0 }; printf("请输入要修改人名字:>"); scanf("%s", name); int pos = FindContact(ps, name); if (-1 == pos) { printf("查无此人n"); } else { printf("请输入新名字:"); scanf("%s", ps->data[pos].name); printf("请输入新年龄: "); scanf("%d", &(ps->data[pos].age)); printf("请输入新地址:"); scanf("%s", ps->data[pos].add); printf("请输入新号码:"); scanf("%s", ps->data[pos].tel); printf("请输入新性别:"); scanf("%s", ps->data[pos].sex); } }
text.c
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include"Contact.h" void menu() { printf("***********************n"); printf("***** 1.ADD 2.SHOW *n"); printf("***** 3.Del 4.FIND *n"); printf("***** 5.Modift 0.exit *n"); printf("***********************n"); } enum Option { EXIT, ADD, SHOW, DEL, FIND, MODIFY, }; int main() { int input = 0; struct Contact con; InitContact(&con); do { menu(); printf("请输入你的选择:>"); scanf("%d", &input); switch (input) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case FIND: SeaContact(&con); break; case EXIT: printf("欢迎下次使用n"); return; case SHOW: ShowContact(&con); break; case MODIFY: ModifyContact(&con); break; default: printf("选择错误,重新选择n"); break; } } while (input); return 0; }
contact.h
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include#include #include #include #include #define NAME_MAX 20 #define ADD_MAX 20 #define SEX_MAX 5 #define INIT_MIN 3 #define TEL_MAX 12 //通讯录成员 struct PeoInfo { char name[NAME_MAX]; char add[ADD_MAX]; char sex[SEX_MAX]; char tel[TEL_MAX]; int age; }; //动态通讯录 struct Contact { struct PeoInfo* data; //指向动态开辟的通讯录成员数组 int size; //标志成员个数 int capacity; //容量大小,不够则扩容 }; //初始化 void InitContact(struct Contact* pc); //打印 void ShowContact(struct Contact* pc); //删除 void DelContact(struct Contact* pc); //增加成员 void AddContact(struct Contact* pc); //查找成员信息 void SeaContact(struct Contact* pc); //查找成员是否存在,存在则返回其在通讯录成员数组的下标,不存在则返回-1 int FindContact(struct Contact* pc, char* name); //判断通讯录是否为空 bool EmptyContact(struct Contact* pc); //通讯录增容 void ByNewcapacity(struct Contact* pc); //释放空间 void FreeContact(struct Contact* pc); //修改指定联系人信息 void ModifyContact(struct Contact* ps);
基本的难点内容在代码中都有解释,我就不一一给大家讲解了,大家仔细看注释
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)