C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄詳細(xì)過程
??前言:
通訊錄相信每一個人都了解過
它的功能包括簡單包括:增刪查改
這一期就來實現(xiàn)一個C語言實現(xiàn)的通訊錄
續(xù)上次所聊到的--動態(tài)內(nèi)存的分配
那么我會從標(biāo)題所給的兩個方式來實現(xiàn)
??一.靜態(tài)通訊錄的實現(xiàn)
??1.環(huán)境的分工邏輯
由于過程有點長,便于理解,所以一共會用到三個文件
分別是兩個源文件test.c、contact.c ,還有一個頭文件contact.h來實現(xiàn)
??test.c是主體,是通訊錄的測試邏輯
??contact.c是通訊錄的實現(xiàn)邏輯
??contact.h是實現(xiàn)通訊錄函數(shù)的聲明
??2.待實現(xiàn)的功能
通訊錄的每一個功能是相對獨立的
所以可以分別用不同的函數(shù)來實現(xiàn)各個部分的功能
contact.c包含的函數(shù)分別以下內(nèi)容:
??1.結(jié)構(gòu)體的初始化
??2.添加聯(lián)系人
??3.展示聯(lián)系人
??4.刪除聯(lián)系人
??5.查找聯(lián)系人
??6.修改聯(lián)系人
??具體代碼如下:
??3.contact.h
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> //通訊錄可以用來存儲1000個人的信息,每個人的信息包括:姓名、性別、年齡、電話、住址 typedef struct Introduction { char name[20]; char sex[10]; int age; char tele[20]; char addr[30]; } Introduction; typedef struct contact { Introduction data[1000]; int sz; }contact; //結(jié)構(gòu)體的初始化 void Initcontact(contact* pc); //添加聯(lián)系人 void Add(contact* pc); //展示聯(lián)系人 void show(contact* pc); //刪除聯(lián)系人 void Dele(contact* pc); //查找聯(lián)系人 void Find(contact* pc); //修改聯(lián)系人 void Exchange(contact* pc);
??4.contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void Initcontact(contact* pc)//結(jié)構(gòu)體的初始化 { pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } void Add(contact* pc)//添加聯(lián)系人 { //判斷是否未滿 if (pc->sz == 1000) { printf("通訊錄已滿\n"); return; } 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].tele); printf("請輸入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("增加聯(lián)系人成功\n"); } void show(contact* pc)//展示聯(lián)系人 { int i = 0; printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } int SearchByName(contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; } void Dele(contact* pc)//刪除聯(lián)系人 { int i = 0; char name[10]; printf("輸入要刪除人的名字>:\n"); scanf("%s", name); if (pc->sz == 0) { printf("通訊錄為空,無法刪除\n"); } //判斷是否有聯(lián)系人 int pos = SearchByName(pc, name); if (pos == -1) { printf("找不到聯(lián)系人\n"); } else { for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除聯(lián)系人成功\n"); } } void Find(contact* pc)//查找聯(lián)系人 { char name[10]; printf("輸入要查找人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通訊錄中無查找人的名字"); } else { printf("查找的人信息為:>"); printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址"); printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } } void Exchange(contact* pc)//修改聯(lián)系人 { char name[10]; printf("輸入要修改人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通訊錄中無修改人的名字"); } else { printf("請輸入名字>:"); scanf("%s", pc->data[pos].name); printf("請輸入年齡>:"); scanf("%d", &(pc->data[pos].age)); printf("請輸入性別:>"); scanf("%s", pc->data[pos].sex); printf("請輸入電話:>"); scanf("%s", pc->data[pos].tele); printf("請輸入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功"); } }
??5.test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void menu() { printf("**********************************************\n"); printf("******* 1.Add 2.Dele *********\n"); printf("******* 3.Find 4.Exchange **********\n"); printf("******* 5.show 0.exit **********\n"); printf("**********************************************\n"); } int main() { int input = 0; contact con; Initcontact(&con); do { menu(); printf("請輸入一個數(shù)>:"); scanf("%d", &input); switch (input) { case 1: Add(&con); break; case 2: Dele(&con); break; case 3: Find(&con); break; case 4: Exchange(&con); break; case 5: show(&con); break; case 0: printf("退出通訊錄\n"); break; default: printf("選擇錯誤\n"); } } while (input); return 0; }
??6.實現(xiàn)效果
??二.通訊錄動態(tài)的實現(xiàn)
相較于靜態(tài)的實現(xiàn),兩者的差別并不大
前者是用一個固定數(shù)組來實現(xiàn)元素的儲存
后者則是用動態(tài)申請的內(nèi)存來實現(xiàn)儲存,優(yōu)點是可以節(jié)省內(nèi)存
區(qū)別在于
通訊錄的初始化,這里引用了capcity容量來比較已有的容量
來判斷內(nèi)存的使用量,便于擴(kuò)容
其次就是Add函數(shù),增加聯(lián)系人
最后再對釋放的內(nèi)存進(jìn)行釋放
??代碼如下:
??1.contact.h
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> typedef struct Introduction { char name[20]; char sex[10]; int age; char tele[20]; char addr[30]; }Introduction; typedef struct contact { Introduction* data; int sz; int capcity; }contact; //結(jié)構(gòu)體的初始化 void Initcontact(contact* pc); //添加聯(lián)系人 void Add(contact* pc); //展示聯(lián)系人 void show(contact* pc); //刪除聯(lián)系人 void Dele(contact* pc); //查找聯(lián)系人 void Find(contact* pc); //修改聯(lián)系人 void Exchange(contact* pc); //銷毀通訊錄 void destroy(contact*pc);
??2.contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" #define TARGET_sz 3 //初始通訊錄目標(biāo)容量 void Initcontact(contact* pc)//結(jié)構(gòu)體的初始化 { assert(pc);//判斷指針的有效性 pc->sz = 0; contact* tmp = 0; tmp=(contact*)malloc(sizeof(Introduction)*TARGET_sz); if (tmp!=NULL) { pc->data = tmp; } else { printf("擴(kuò)容失敗,請檢查原因\n"); return; } pc->capcity = TARGET_sz; } void Add(contact* pc)//添加聯(lián)系人 { assert(pc); if (pc->capcity == pc->sz) { Introduction* tmp = 0; tmp=(Introduction*)realloc(pc->data,sizeof(Introduction)*(pc->capcity+2)); if (tmp != NULL) { pc->capcity += 2; pc->data = tmp; printf("擴(kuò)容成功\n"); } else { printf("擴(kuò)容失敗,請檢查原因\n"); } } 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].tele); printf("請輸入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("增加聯(lián)系人成功\n"); } void show(contact* pc)//展示聯(lián)系人 { int i = 0; printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } int SearchByName(contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; } void Dele(contact* pc)//刪除聯(lián)系人 { int i = 0; char name[10]; printf("輸入要刪除人的名字>:\n"); scanf("%s", name); if (pc->sz == 0) { printf("通訊錄為空,無法刪除\n"); } //判斷是否有聯(lián)系人 int pos = SearchByName(pc, name); if (pos == -1) { printf("找不到聯(lián)系人\n"); } else { for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除聯(lián)系人成功\n"); } } void Find(contact* pc)//查找聯(lián)系人 { char name[10]; printf("輸入要查找人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通訊錄中無查找人的名字"); } else { printf("查找的人信息為:>"); printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址"); printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } } void Exchange(contact* pc)//修改聯(lián)系人 { char name[10]; printf("輸入要修改人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通訊錄中無修改人的名字"); } else { printf("請輸入名字>:"); scanf("%s", pc->data[pos].name); printf("請輸入年齡>:"); scanf("%d", &(pc->data[pos].age)); printf("請輸入性別:>"); scanf("%s", pc->data[pos].sex); printf("請輸入電話:>"); scanf("%s", pc->data[pos].tele); printf("請輸入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功"); } } void destroy(contact* pc) { assert(pc); free(pc->data); pc->data = NULL; pc->capcity = 0; pc->sz = 0; }
??3.test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void menu() { printf("**********************************************\n"); printf("******* 1.Add 2.Dele *********\n"); printf("******* 3.Find 4.Exchange **********\n"); printf("******* 5.show 0.exit **********\n"); printf("**********************************************\n"); } int main() { int input = 0; contact con; Initcontact(&con); do { menu(); printf("請輸入一個數(shù)>:"); scanf("%d", &input); switch (input) { case 1: Add(&con); break; case 2: Dele(&con); break; case 3: Find(&con); break; case 4: Exchange(&con); break; case 5: show(&con); break; case 0: destroy(&con); printf("退出通訊錄\n"); break; default: printf("選擇錯誤\n"); } } while (input); return 0; }
歡迎點贊收藏加關(guān)注,如若有問題可以提出來?????????
到此這篇關(guān)于C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄詳細(xì)過程的文章就介紹到這了,更多相關(guān)C語言 實現(xiàn)通訊錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++使用read()和write()讀寫二進(jìn)制文件
以文本形式讀寫文件和以二進(jìn)制形式讀寫文件的區(qū)別,并掌握了用重載的?>>?和?<<?運算符實現(xiàn)以文本形式讀寫文件,在此基礎(chǔ)上,本節(jié)將講解如何以二進(jìn)制形式讀寫文件2023-10-10深入分析Visual C++進(jìn)行串口通信編程的詳解
本篇文章是對Visual C++進(jìn)行串口通信編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語言實現(xiàn)實驗設(shè)備管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)實驗設(shè)備管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06C語言數(shù)據(jù)結(jié)構(gòu)鏈表隊列的實現(xiàn)
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)鏈表隊列的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07