本文共 9436 字,大约阅读时间需要 31 分钟。
Contact.h
#ifndef __CONTACT_H__ #define __CONTACT_H__ #include#include #include #include #define NAME_MAX 30 #define SEX_MAX 5 #define TEL_MAX 12 #define ADDR_MAX 30 #define CAPACITY 3 //第一次所开辟的空间能够储存联系人的个数 #define ADD_CAP 2 //每次开辟空间增加所能存储联系人的个数(每次增加两个) typedef struct PeoInfo //联系人信息 { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tel[TEL_MAX]; char addr[ADDR_MAX]; }PeoInfo; typedef struct contact //定义一个结构体 { PeoInfo *data; //联系人信息 int sz; //联系人个数 int capacity; //目前的容量 }contact, *pContact; void init_contact(pContact pc); //初始化通讯录 void load_contact(pContact pc); //加载通讯录 void add_contact(pContact pc); //添加联系人信息 void del_contact(pContact pc); //删除联系人信息 void modify_contact(pContact pc); //修改联系人信息 void sel_contact(pContact pc); //查询联系人信息 void show_contact(pContact pc); //显示所有联系人的信息 void empty_contact(pContact pc); //清空通讯录 void sort_contact(pContact pc); //排序 void destory_contact(pContact pc); //销毁通讯录 void save_contact(pContact pc); //将联系人保存在文件中 #endif
Contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "Contact.h" void init_contact(pContact pc) { PeoInfo *tmp = NULL; assert(pc); pc->sz = 0; pc->capacity = CAPACITY; tmp = (PeoInfo *)calloc(pc->capacity, sizeof(PeoInfo)); if (tmp == NULL) { perror("use calloc"); system("pause"); exit(EXIT_FAILURE); } pc->data = tmp; load_contact(pc); } int espand(pContact pc) { PeoInfo *tmp = { 0 }; assert(pc); if (pc->sz == CAPACITY) { tmp = (PeoInfo *)realloc(pc->data, (pc->sz + ADD_CAP) * sizeof(PeoInfo)); if (tmp == NULL) { printf("增容失败\n"); return 0; } else { pc->data = tmp; pc->capacity += ADD_CAP; printf("增容成功\n"); return 1; } } return 1; } void load_contact(pContact pc) { PeoInfo tmp = { 0 }; assert(pc); FILE *pf = fopen("contact.txt", "rb"); if (pf == NULL) { perror("open file for read"); system("pause"); exit(EXIT_FAILURE); } while (fread(&tmp, sizeof(PeoInfo), 1, pf)) { if (espand(pc) == 0) { system("pause"); exit(EXIT_FAILURE); } pc->data[pc->sz] = tmp; pc->sz++; } fclose(pf); pf = NULL; } void add_contact(pContact pc) { int judge = 0; assert(pc); judge = espand(pc); if (!judge) { return; } assert(pc); printf("请输入姓名:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:"); scanf("%d", &pc->data[pc->sz].age); printf("请输入性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:"); scanf("%s", pc->data[pc->sz].tel); printf("请输入住址:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("增加成功\n"); } int find_data(pContact pc, char name[]) { for (int i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; } void del_contact(pContact pc) { char name[NAME_MAX] = { 0 }; int ret = 0; assert(pc); if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } printf("请输入要删除人的姓名: "); scanf("%s", name); ret = find_data(pc, name); if (ret == -1) { printf("要删除的人不存在\n"); return; } else { for (int i = ret; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); } } void modify_contact(pContact pc) { char name[NAME_MAX] = { 0 }; int ret = 0; assert(pc); if (pc->sz == 0) { printf("通讯录为空,无法修改\n"); return; } printf("请输入要修改人的名字:"); scanf("%s", name); ret = find_data(pc, name); if (ret == -1) { printf("要修改的人不存在\n"); return; } else { int input = 0; printf("1. name 2. age 3.sex 4.tel 5.addr 0.exit\n"); printf("请输入要修改的选项:"); scanf("%d", &input); switch (input) { case 1: { printf("请输入修改后的名字:"); scanf("%s", pc->data[ret].name); } break; case 2: { printf("请输入修改后的年龄:"); scanf("%d", &pc->data[ret].age); } break; case 3: { printf("请输入修改后的性别:"); scanf("%s", pc->data[ret].sex); } break; case 4: { printf("请输入修改后的电话:"); scanf("%s", pc->data[ret].tel); } break; case 5: { printf("请输入修改后的住址:"); scanf("%s", pc->data[ret].addr); } break; case 0: printf("修改成功\n"); break; default: printf("请重新输入:"); break; } } } void sel_contact(pContact pc) { char name[NAME_MAX] = { 0 }; int ret = 0; assert(pc); if (pc->sz == 0) { printf("通讯录为空,无法查询\n"); return; } printf("请输入要查询人的名字:"); scanf("%s", name); ret = find_data(pc, name); if (ret == -1) { printf("要查询的人不存在\n"); return; } else { printf("%6s\t%4s\t%3s\t%11s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "住址"); printf("%6s\t%4d\t%3s\t%11s\t%15s\t\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tel, pc->data[ret].addr); } } void show_contact(pContact pc) { assert(pc); printf("%6s\t%4s\t%3s\t%11s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "住址"); for (int i = 0; i < pc->sz; i++) { printf("%6s\t%4d\t%3s\t%11s\t%15s\t\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tel, pc->data[i].addr); } } void empty_contact(pContact pc) { assert(pc); pc->sz = 0; printf("已清空\n"); } void sort_contact(pContact pc) { for (int i = 0; i < pc->sz - 1; i++) { for (int j = 0; j < pc->sz - 1 - i; j++) { PeoInfo tmp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = tmp; } } printf("排序成功\n"); } void destory_contact(pContact pc) { assert(pc); free(pc->data); pc->data = NULL; pc->capacity = 0; pc->sz = 0; } void save_contact(pContact pc) { FILE *pf = fopen("contact.txt", "wb"); assert(pc); if (pf == NULL) { perror("open file of write"); system("pause"); exit(EXIT_FAILURE); } for (int i = 0; i < pc->sz; i++) { fwrite(pc->data + i, sizeof(PeoInfo), 1, pf); } fclose(pf); pf = NULL; }
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "Contact.h"void menu(){ printf("******************************************\n"); printf("**** 1.增加 2.删除 ****\n"); printf("**** 3.修改 4.查询 ****\n"); printf("**** 5.显示 6.清空 ****\n"); printf("**** 7.排序 0.退出 ****\n"); printf("******************************************\n");}enum option{ EXIT, ADD, DEL, MODIFY, SEL, SHOW, EMPTY, SORT};void test(){ int input = 0; contact Con; init_contact(&Con); do { menu(); printf("请选择: "); scanf("%d", &input); switch (input) { case ADD: add_contact(&Con); break; case DEL: del_contact(&Con); break; case MODIFY: modify_contact(&Con); break; case SEL: sel_contact(&Con); break; case SHOW: show_contact(&Con); break; case EMPTY: empty_contact(&Con); break; case SORT: sort_contact(&Con); break; case EXIT: save_contact(&Con); //退出之前将联系人保存在文件中 destory_contact(&Con); break; default: printf("输入选项不存在,请重新输入: \n"); break; } } while (input);}int main(){ test(); system("pause"); return 0;}
转载地址:http://qbwdb.baihongyu.com/