通讯录的简单实现
在結構體這一塊,有普遍應用的就是通訊錄這一個功能的簡單實現。一開始首先定義兩個結構體:
這個結構體存放通訊錄信息
這個結構體存放通訊錄的通訊人數量,容量以及指向通訊錄信息的指針(有容量是因為在通訊錄滿了之后可以動態開辟)
typedef struct AddressBook {AddressInfo* _AIArray;size_t _size; size_t _capacity; }AddressBook;其中性別這一欄可以自己定義,也可以枚舉。
enum SEX {Man,Woman, };接下來開始各個接口的實現:
void AddressBookInit(AddressBook* pbook); void AddressBookInit(AddressBook* pbook) {assert(pbook);pbook->_size = 0;pbook->_capacity = 2;pbook->_AIArray = (AddressInfo*)malloc(sizeof(AddressInfo)* 2);assert(pbook->_AIArray); }//該接口是初始化通訊錄,首先給了2個存儲空間,如果已滿就malloc擴容空間,動態擴容我以后也會寫一篇博客來簡單介紹一下 void AddressBookDestroy(AddressBook* pbook); void AddressBookDestroy(AddressBook* pbook) {assert(pbook);free(pbook->_AIArray);pbook->_AIArray = NULL;pbook->_size = pbook->_capacity = 0; }//該接口是將通訊錄置為空的操作 void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo); void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo) {assert(pbook);if (pbook->_size == pbook->_capacity){pbook->_AIArray = realloc(pbook->_AIArray, pbook->_capacity * 2 * sizeof(AddressInfo));pbook->_capacity *= 2;}strcpy(pbook->_AIArray[pbook->_size]._name, pinfo->_name);strcpy(pbook->_AIArray[pbook->_size]._tel, pinfo->_tel);pbook->_AIArray[pbook->_size]._age = pinfo->_age;pbook->_AIArray[pbook->_size]._sex = pinfo->_sex;pbook->_size++; }//添加通訊人信息的接口 void AddressBookDel(AddressBook* pbook, const char* name); void AddressBookDel(AddressBook* pbook, const char* name) {for (size_t i = 0; i < pbook->_size; ++i){if (strcmp(pbook->_AIArray[i]._name, name) == 0){while (i < pbook->_size - 1){strcpy(pbook->_AIArray[i]._name, pbook->_AIArray[i + 1]._name);strcpy(pbook->_AIArray[i]._tel, pbook->_AIArray[i + 1]._tel);pbook->_AIArray[i]._age = pbook->_AIArray[i + 1]._age;pbook->_AIArray[i]._sex = pbook->_AIArray[i + 1]._sex;++i;}pbook->_size--;break;}} } //刪除操作 AddressInfo* AddressBookFind(AddressBook* pbook, const char* name); AddressInfo* AddressBookFind(AddressBook* pbook, const char* name) {assert(pbook);for (size_t i = 0; i < pbook->_size; ++i){if (strcmp(pbook->_AIArray[i]._name,name) == 0){return &pbook->_AIArray[i];}}return NULL; } //查找操作 void AddressBookSave(AddressBook* pbook, const char* filename); void AddressBookSave(AddressBook* pbook, const char* filename) {assert(pbook);FILE* fp = fopen(filename, "w");for (size_t i = 0; i < pbook->_size; ++i){fputs(pbook->_AIArray[i]._name, fp);fputc('\n', fp);fputs(pbook->_AIArray[i]._tel, fp);fputc('\n', fp);char agestr[20];itoa(pbook->_AIArray[i]._age, agestr, 10);fputs(agestr, fp);fputc('\n', fp);fprintf(fp, "%s %s %d\n", pbook->_AIArray[i]._name, pbook->_AIArray[i]._tel, pbook->_AIArray[i]._age);}AddressInfo end;fprintf(fp, "%s %s %d\n", "**", "**", -1); } //這個是存儲在文件中的接口實現,因為一般我們對于程序的實現都是在編譯器中的控制面板中看到的,在這個接口可以直接在文件中看到我所存儲的通訊錄信息。 void AddressBookLoad(AddressBook* pbook, const char* filename); void AddressBookLoad(AddressBook* pbook, const char* filename) {assert(pbook);FILE* fp = fopen(filename, "r");AddressInfo info;while (1){info._name[0] = '\0';info._tel[0] = '\0';info._age = 0;fscanf(fp, "%s%s%d", info._name, info._tel, &info._age);if (info._age == -1){break;}else{AddressBookAdd(pbook, &info);}} } //這個接口是重載通訊錄的實現,在經歷過add,del,save,find這些接口實現過后,這個接口就是重載通訊錄,讓客戶能夠看到變化。 void AddressBookPrint(AddressBook* pbook); void AddressBookPrint(AddressBook* pbook) {assert(pbook);for (size_t i = 0; i < pbook->_size; ++i){//printf("======================================\n");printf("name:%s ", pbook->_AIArray[i]._name);printf("tel:%s ", pbook->_AIArray[i]._tel);printf("age:%d ", pbook->_AIArray[i]._age);printf("sex:%d ", pbook->_AIArray[i]._sex);printf("\n");}//printf("======================================\n"); } //該接口是打印通訊錄信息以上就是幾大接口的的實現,接下來就是對這幾個接口進行測試的代碼:
void TestAddressBook() {AddressBook addressbook;AddressBookInit(&addressbook);AddressInfo info1 = {"安南是hp", "18213141414", 18, Man};AddressBookAdd(&addressbook, &info1);AddressInfo info2 = { "王曉", "18213141415", 19, Man };AddressBookAdd(&addressbook, &info2);AddressInfo info3 = { "李娜", "18213141416", 19, Man };AddressBookAdd(&addressbook, &info3);AddressBookSave(&addressbook, "addressfile.txt");AddressBookPrint(&addressbook);AddressBookLoad(&addressbook, "addressfile.txt");AddressBookPrint(&addressbook);AddressInfo* ret = AddressBookFind(&addressbook, "王曉");printf("%s\n", ret->_name);AddressBookDel(&addressbook, "王曉");AddressBookPrint(&addressbook);AddressBookSave(&addressbook, "addressfile.bin");AddressBookDestroy(&addressbook); } //首先給出幾個通訊錄的測試用例在測試用例給出之后,構造主函數,在主函數里面設計你想要的打印風格以及你想讓各大接口實現的安排。
int main() {AddressBook addressbook;AddressBookInit(&addressbook);AddressBookLoad(&addressbook, "addressfile.bin");int option = 0;do{printf("=========================================\n");printf("1.添加通訊錄信息 2.查找通訊錄信息\n");printf("3.刪除通訊錄信息 4.修改通訊錄信息\n");printf("5.保存通訊錄到文件 6.讀取文件通訊錄信息\n");printf("7.打印通訊錄信息 -1.退出.\n");scanf("%d", &option);if (option == 1){printf("請依次輸入姓名、電話、年齡、性別:\n");AddressInfo info;scanf("%s", info._name);scanf("%s", info._tel);scanf("%d", &info._age);char sex[10];scanf("%s", sex);if (strcmp(sex, "男") == 0)info._sex = 0;elseinfo._sex = 1;AddressBookAdd(&addressbook, &info);}else if (option == 2){char name[20];printf("請輸入要查找聯系人的姓名\n");scanf("%s", name);AddressInfo* ret = AddressBookFind(&addressbook, name);if (ret == NULL){printf("查無此人\n");}else{printf("姓名:%s\n", ret->_name);printf("電話:%s\n", ret->_tel);printf("年齡:%d\n", ret->_age);printf("性別:%d\n", ret->_sex);}}else if (option == 4){char name[20];printf("請輸入要修改聯系人的姓名\n");scanf("%s", name);AddressInfo* ret = AddressBookFind(&addressbook, name);if (ret == NULL){printf("查無此人\n");}else{printf("請輸入要修改聯系人的電話\n");scanf("%s", ret->_tel);}}else if (option == 5){AddressBookSave(&addressbook, "addressfile.bin");}else if (option == 6){addressbook._size = 0;AddressBookLoad(&addressbook, "addressfile.bin");}else if (option == 7){AddressBookPrint(&addressbook);}printf("=========================================\n");} while (option >= 0);return 0; }以上就是這個通訊錄實現的全部過程,當然在這之前也得引入頭文件:
#pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h>以上就是我的全部內容,附上完整代碼:
#pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h>enum SEX {Man,Woman, };typedef struct AddressInfo {char _name[24];char _tel[24];int _age;enum SEX _sex; }AddressInfo; typedef struct AddressBook {AddressInfo* _AIArray;size_t _size; size_t _capacity; }AddressBook;void AddressBookInit(AddressBook* pbook); void AddressBookDestroy(AddressBook* pbook);void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo); void AddressBookDel(AddressBook* pbook, const char* name); AddressInfo* AddressBookFind(AddressBook* pbook, const char* name);void AddressBookSave(AddressBook* pbook, const char* filename); void AddressBookLoad(AddressBook* pbook, const char* filename); void AddressBookPrint(AddressBook* pbook); #include "AddressBook.h"void AddressBookInit(AddressBook* pbook) {assert(pbook);pbook->_size = 0;pbook->_capacity = 2;pbook->_AIArray = (AddressInfo*)malloc(sizeof(AddressInfo)* 2);assert(pbook->_AIArray); }void AddressBookDestroy(AddressBook* pbook) {assert(pbook);free(pbook->_AIArray);pbook->_AIArray = NULL;pbook->_size = pbook->_capacity = 0; }void AddressBookAdd(AddressBook* pbook, AddressInfo* pinfo) {assert(pbook);if (pbook->_size == pbook->_capacity){pbook->_AIArray = realloc(pbook->_AIArray, pbook->_capacity * 2 * sizeof(AddressInfo));pbook->_capacity *= 2;}strcpy(pbook->_AIArray[pbook->_size]._name, pinfo->_name);strcpy(pbook->_AIArray[pbook->_size]._tel, pinfo->_tel);pbook->_AIArray[pbook->_size]._age = pinfo->_age;pbook->_AIArray[pbook->_size]._sex = pinfo->_sex;pbook->_size++; } void AddressBookSave(AddressBook* pbook, const char* filename) {assert(pbook);FILE* fp = fopen(filename, "w");for (size_t i = 0; i < pbook->_size; ++i){fputs(pbook->_AIArray[i]._name, fp);fputc('\n', fp);fputs(pbook->_AIArray[i]._tel, fp);fputc('\n', fp);char agestr[20];itoa(pbook->_AIArray[i]._age, agestr, 10);fputs(agestr, fp);fputc('\n', fp);fprintf(fp, "%s %s %d\n", pbook->_AIArray[i]._name, pbook->_AIArray[i]._tel, pbook->_AIArray[i]._age);}AddressInfo end;fprintf(fp, "%s %s %d\n", "**", "**", -1);void AddressBookLoad(AddressBook* pbook, const char* filename) {assert(pbook);FILE* fp = fopen(filename, "r");AddressInfo info;while (1){info._name[0] = '\0';info._tel[0] = '\0';info._age = 0;fscanf(fp, "%s%s%d", info._name, info._tel, &info._age);if (info._age == -1){break;}else{AddressBookAdd(pbook, &info);}} }void AddressBookDel(AddressBook* pbook, const char* name) {for (size_t i = 0; i < pbook->_size; ++i){if (strcmp(pbook->_AIArray[i]._name, name) == 0){while (i < pbook->_size - 1){strcpy(pbook->_AIArray[i]._name, pbook->_AIArray[i + 1]._name);strcpy(pbook->_AIArray[i]._tel, pbook->_AIArray[i + 1]._tel);pbook->_AIArray[i]._age = pbook->_AIArray[i + 1]._age;pbook->_AIArray[i]._sex = pbook->_AIArray[i + 1]._sex;++i;}pbook->_size--;break;}} }AddressInfo* AddressBookFind(AddressBook* pbook, const char* name) {assert(pbook);for (size_t i = 0; i < pbook->_size; ++i){if (strcmp(pbook->_AIArray[i]._name,name) == 0){return &pbook->_AIArray[i];}}return NULL; }void AddressBookPrint(AddressBook* pbook) {assert(pbook);for (size_t i = 0; i < pbook->_size; ++i){//printf("======================================\n");printf("name:%s ", pbook->_AIArray[i]._name);printf("tel:%s ", pbook->_AIArray[i]._tel);printf("age:%d ", pbook->_AIArray[i]._age);printf("sex:%d ", pbook->_AIArray[i]._sex);printf("\n");}//printf("======================================\n");#include "AddressBook.h"void TestAddressBook() {AddressBook addressbook;AddressBookInit(&addressbook);AddressInfo info1 = {"安南是Hp", "18213141414", 18, Man};AddressBookAdd(&addressbook, &info1);AddressInfo info2 = { "王曉", "18213141415", 19, Man };AddressBookAdd(&addressbook, &info2);AddressInfo info3 = { "李娜", "18213141416", 19, Man };AddressBookAdd(&addressbook, &info3);AddressBookSave(&addressbook, "addressfile.txt");AddressBookPrint(&addressbook);AddressBookLoad(&addressbook, "addressfile.txt");AddressBookPrint(&addressbook);AddressInfo* ret = AddressBookFind(&addressbook, "王曉");printf("%s\n", ret->_name);AddressBookDel(&addressbook, "王曉");AddressBookPrint(&addressbook);AddressBookSave(&addressbook, "addressfile.bin");AddressBookDestroy(&addressbook); } int main() {AddressBook addressbook;AddressBookInit(&addressbook);AddressBookLoad(&addressbook, "addressfile.bin");int option = 0;do{printf("=========================================\n");printf("1.添加通訊錄信息 2.查找通訊錄信息\n");printf("3.刪除通訊錄信息 4.修改通訊錄信息\n");printf("5.保存通訊錄到文件 6.讀取文件通訊錄信息\n");printf("7.打印通訊錄信息 -1.退出.\n");scanf("%d", &option);if (option == 1){printf("請依次輸入姓名、電話、年齡、性別:\n");AddressInfo info;scanf("%s", info._name);scanf("%s", info._tel);scanf("%d", &info._age);char sex[10];scanf("%s", sex);if (strcmp(sex, "男") == 0)info._sex = 0;elseinfo._sex = 1;AddressBookAdd(&addressbook, &info);}else if (option == 2){char name[20];printf("請輸入要查找聯系人的姓名\n");scanf("%s", name);AddressInfo* ret = AddressBookFind(&addressbook, name);if (ret == NULL){printf("查無此人\n");}else{printf("姓名:%s\n", ret->_name);printf("電話:%s\n", ret->_tel);printf("年齡:%d\n", ret->_age);printf("性別:%d\n", ret->_sex);}}else if (option == 4){char name[20];printf("請輸入要修改聯系人的姓名\n");scanf("%s", name);AddressInfo* ret = AddressBookFind(&addressbook, name);if (ret == NULL){printf("查無此人\n");}else{printf("請輸入要修改聯系人的電話\n");scanf("%s", ret->_tel);}}else if (option == 5){AddressBookSave(&addressbook, "addressfile.bin");}else if (option == 6){addressbook._size = 0;AddressBookLoad(&addressbook, "addressfile.bin");}else if (option == 7){AddressBookPrint(&addressbook);}printf("=========================================\n");} while (option >= 0);return 0; } }以上就是通訊錄內容的全部實現,希望各位大佬多多指正。
總結
- 上一篇: JS抽奖器(JS基础)
- 下一篇: linux常用基础命令——文件处理命令