C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼
正片開(kāi)始
這里為了方便對(duì)照,我搬出整個(gè)程序的前后修改版本,并分別作為靜態(tài)和動(dòng)態(tài)版本,實(shí)際差距并不大,提供出來(lái)只供君參考
動(dòng)機(jī)
為什么要寫(xiě)一個(gè)通訊錄?
1.當(dāng)然是一部分原因是看了b站上的資源自己比較感興趣
2.其次就是在C語(yǔ)言實(shí)際應(yīng)用上可以深化和鞏固,其實(shí)都看得出來(lái)我中間斷更了好久的數(shù)據(jù)結(jié)構(gòu)與算法的博客,主要想法還是想把C語(yǔ)言從里到外不遺余力的殺穿,又走了一遍底層原理,不過(guò)我相信費(fèi)時(shí)是值得的
3.在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法這板塊,需要C語(yǔ)言基礎(chǔ)高度的掌握,所以這部分算對(duì)前邊理論部分的一個(gè)實(shí)戰(zhàn)項(xiàng)目,數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu),無(wú)非就是數(shù)據(jù)的增刪查改,這里我們提前熱身一下也不錯(cuò)。
靜態(tài)版本
頭文件( phonebook.h)
我們這里依舊使用之前寫(xiě)掃雷的分裝思想,將這個(gè)通訊錄分為 頭文件,接口,功能三個(gè)部分。
首先我們寫(xiě)出頭文件,就是我們需要用到什么,給他整出來(lái),我們簡(jiǎn)單粗暴給命名為“ phonebook.h ”,展示為下面三個(gè)部分:
#pragma once # define _CRT_SECURE_NO_WARNINGS # include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h>
#define max 1000 #define x 30 #define y 30 #define z 20 typedef struct num { char name[x]; int age; char sex[y]; char addr[y]; char num[z]; }num; typedef struct book { num data[max]; int count; }book; enum conmenu { 退出, 增添, 刪減, 查找, 修改, 排序, 全覽, };
void start(book* p); //初始化通訊錄 void add(book* p);//增添信息 void show(const book* p);//展示信息 void delete(book* p);//刪除信息 int search(book* p,char name[]);//庫(kù)中搜尋要查找信息 void find(book* p);//查找信息 void modify(book* p);//修改信息 void sort(book* p);//排序信息
整個(gè)一坨掰成三瓣就是為了方便理解,從上到下分別是菜單(展示必要),自定義類(lèi)型變量(結(jié)構(gòu)體,枚舉類(lèi)型),需要實(shí)現(xiàn)的功能函數(shù)名。
為什么結(jié)構(gòu)體變量有兩個(gè)
book結(jié)構(gòu)體是我們整個(gè)通訊錄的骨骼,包含count(成員數(shù)量)和data(成員數(shù)據(jù)),這里就相當(dāng)于模擬了一個(gè)數(shù)組出來(lái),更方便管理; num 結(jié)構(gòu)體則是存放各個(gè)成員數(shù)據(jù)的細(xì)節(jié)成分(姓名,年齡,性別……)。
接口(test.c)
設(shè)置接口的目的就相當(dāng)于是設(shè)置了一個(gè)大門(mén),就是一個(gè)統(tǒng)攬全局的作用,我們把菜單,和功能模塊在這里作展示作用,代碼的實(shí)現(xiàn)我們會(huì)放在功能板塊實(shí)現(xiàn)。
#include"phonebook.h" void menu() { printf("-----------------------------\n"); printf("---- 歡迎使用通訊錄 ----\n"); printf("-----------------------------\n"); printf("----- 1.增添 | 2.刪減-----\n"); printf("----- 3.查找 | 4.修改-----\n"); printf("----- 5.排序 | 6.全覽-----\n"); printf("----- 0.退出 -----\n"); printf("-----------------------------\n"); } int main() { int input; book con; start(&con); do { menu(); printf("請(qǐng)選擇:\n"); scanf("%d", &input); switch (input) { case 增添: add(&con); break; case 刪減: delete(&con); break; case 查找: find(&con); break; case 修改: modify(&con); break; case 排序: sort(&con); break; case 全覽: show(&con); break; case 退出: break; default: printf("錯(cuò)誤輸入!\n"); return 0; } } while (input); return 0; }
拋開(kāi)菜單部分,do-while 語(yǔ)句就是對(duì)應(yīng)了菜單給出的功能遙控器,需要什么點(diǎn)什么。
為什么我們需要一個(gè)枚舉類(lèi)型,其原因就是為了對(duì)應(yīng)上面菜單中的功能(枚舉類(lèi)型成員在未賦值情況下,第一個(gè)成員默認(rèn)值為 0 ,其下依次遞增,從而實(shí)現(xiàn)一一對(duì)應(yīng)),我們作為設(shè)計(jì)者,主要是為了方便我們自己寫(xiě)代碼,switch-case 語(yǔ)句中,case 條件我們一眼瞄過(guò)去如果是 1,2,3 的數(shù)字,我們?cè)谕晟茣r(shí)就可能云里霧里,還要去查目錄,就很麻煩,所以我們用枚舉類(lèi)型來(lái)避免這種小尷尬。
功能板塊(phonebook.c)
我們?cè)谕ㄓ嶄浿行枰_(dá)到的目的有基本的增刪查改,以及作為稱(chēng)得上完美通訊錄的全覽,排序和退出,下面我們 一 一 實(shí)現(xiàn):
1. 初始化:
void start(book* p) { assert(p); p->count = 0; memset(p->data, 0, sizeof(p->data)); }
初識(shí)化首先就要避免空指針和隨機(jī)數(shù),所以這里安排一手 assert 和 置0 就夠了。
2. 增添:
void add(book* p) { assert(p); if (p->count == max) { printf("已滿(mǎn),請(qǐng)先進(jìn)行刪除\n"); return; } else { printf("請(qǐng)輸入姓名:"); scanf("%s", p->data[p->count].name); printf("請(qǐng)輸入年齡:"); scanf("%d", &(p->data[p->count].age)); printf("請(qǐng)輸入性別(F\\M):"); scanf("%s", p->data[p->count].sex); printf("請(qǐng)輸入地址:"); scanf("%s", p->data[p->count].addr); printf("請(qǐng)輸入電話(huà):"); scanf("%s", p->data[p->count].num); p->count++; printf("\n增添成功!\n"); } }
增添數(shù)據(jù)我們要對(duì)應(yīng)好結(jié)構(gòu)體中的類(lèi)型,因?yàn)槟挲g比較特殊,它是 %d 的形式,輸入類(lèi)型不是字符串,所以我們要進(jìn)行取地址操作
3.查找
void find(book* p) { assert(p); if (p->count == 0) printf("\n目錄為空!\n"); else { char name[max] = { 0 }; printf("請(qǐng)輸入查找對(duì)象:\n"); scanf("%s", &name); int i = search(p, name); if (i != -1) { printf("聯(lián)系人存在,在第%d位\n", i + 1); } else { printf("聯(lián)系人不存在!\n"); } } }
注意在開(kāi)始要判斷一下現(xiàn)在通訊錄狀態(tài)是否為空,空就無(wú)法查找,注意要在庫(kù)中尋找我們的查找對(duì)象,我們還要需要一個(gè)對(duì)信息進(jìn)行篩選比對(duì)的函數(shù)來(lái)找出該對(duì)象,因此我們引入 search 函數(shù):
int search(book* p, char name[]) { for (int i = 0; i < p->count; i++) { if (strcmp(name , p->data[i].name)==0) { return i; } else { return -1; } } }
4.刪除
void delete(book* p) { assert(p); if (p->count == 0) { printf("\n為空,無(wú)法刪除!\n"); return; } else { printf("請(qǐng)輸入刪除對(duì)象:\n"); char name[max] = {0}; scanf("%s", &name); int f = search(p,name); if (f == -1) { printf("該對(duì)象不存在!\n"); } else { for (int j = f; j < p->count-1; j++) { p->data[j] = p->data[j + 1]; } p->count--; printf("\n刪除成功!\n"); } } }
注意在開(kāi)始要判斷一下現(xiàn)在通訊錄狀態(tài)是否為空,空就無(wú)法刪除;確定不為空再找到刪除對(duì)象,我們所謂的刪除本質(zhì)就是用后面的數(shù)據(jù)進(jìn)行依次覆蓋,最后讓數(shù)組大小 count -1 即可。
5.修改
void modify(book* p) { assert(p); if (p->count == 0) { printf("為空,無(wú)法刪除!\n"); return; } else { printf("請(qǐng)輸入對(duì)象姓名:\n"); char name[max] = { 0 }; scanf("%s", &name); int i = search(p,name); if(i!=-1) { printf("該對(duì)象存在\n"); printf("請(qǐng)輸入修改內(nèi)容:\n"); printf("請(qǐng)輸入姓名:\n"); scanf("%s", p->data[i].name); printf("請(qǐng)輸入年齡:\n"); scanf("%d", &(p->data[p->count].age)); printf("請(qǐng)輸入性別(F\M):\n"); scanf("%c", &(p->data[p->count].sex)); printf("請(qǐng)輸入地址:\n"); scanf("%s", p->data[p->count].addr); printf("請(qǐng)輸入電話(huà):\n"); scanf("%s", p->data[p->count].num); printf("\n修改成功!\n"); } else { printf("該對(duì)象不存在!\n"); return 0; } } }
6.排序
int compare(const void* a, const void* b) { return strcmp(((book*)a)->data->name , ((book*)b)->data->name); } int compare2(const void* a, const void* b) { return strcmp(((book*)b)->data->name, ((book*)a)->data->name); } void sort(book* p) { printf("請(qǐng)選擇:\n"); printf("-----------------------------\n"); printf("----- 1.順序 | 2.逆序-----\n"); printf("-----------------------------\n"); int in; scanf("%d", &in); switch (in) { case 1: qsort(p->data, p->count, sizeof(p->data[0]), compare); case 2: qsort(p->data, p->count, sizeof(p->data[0]), compare2); } printf("\n 排序完成!\n"); }
排序我細(xì)分為了順序和逆序兩種,基本思想就是 qsort 函數(shù)一步到胃,不再贅述。
7.全覽
void show(book* p) { assert(p); int i = 0; printf("%10s %5s %5s %10s %13s\n","姓名","年齡","性別","地址","電話(huà)"); for (i = 0; i < p->count; i++) { printf("%10s %5d %5s %10s %13s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].addr, p->data[i].num); } }
就是全部打印出來(lái)即可,注意信息之間的間隔調(diào)整,讀者可自主更改其大小。
到這里我們所有功能就算實(shí)現(xiàn)完了,來(lái)康康實(shí)際效果如何(僅展示其中幾個(gè)):
靜態(tài)版全部代碼
為了方便讀者查看與創(chuàng)作,我把三個(gè)部分的代碼全部貼出來(lái):
test.c(接口)
#include"phonebook.h" void menu() { printf("-----------------------------\n"); printf("---- 歡迎使用通訊錄 ----\n"); printf("-----------------------------\n"); printf("----- 1.增添 | 2.刪減-----\n"); printf("----- 3.查找 | 4.修改-----\n"); printf("----- 5.排序 | 6.全覽-----\n"); printf("----- 0.退出 -----\n"); printf("-----------------------------\n"); } int main() { int input; book con; start(&con); do { menu(); printf("請(qǐng)選擇:\n"); scanf("%d", &input); switch (input) { case 增添: add(&con); break; case 刪減: delete(&con); break; case 查找: find(&con); break; case 修改: fix(&con); break; case 排序: sort(&con); break; case 全覽: show(&con); break; case 退出: break; default: printf("錯(cuò)誤輸入!\n"); return 0; } } while (input); return 0; }
phonebook.h(頭文件)
#pragma once # define _CRT_SECURE_NO_WARNINGS # include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h> #define max 1000 #define x 30 #define y 30 #define z 20 typedef struct num { char name[x]; int age; char sex[y]; char addr[y]; char num[z]; }num; typedef struct book { num data[max]; int count; int capacity; }book; enum conmenu { 退出, 增添, 刪減, 查找, 修改, 排序, 全覽, }; void start(book* p); void add(book* p); void show(const book* p); void delete(book* p); int search(book* p,char name[]); void find(book* p); void fix(book* p); void sort(book* p);
phonebook.c(功能)
# define _CRT_SECURE_NO_WARNINGS #include"phonebook.h" void start(book* p) { assert(p); p->count = 0; memset(p->data, 0, sizeof(p->data)); } void add(book* p) { assert(p); if (p->count == max) { printf("已滿(mǎn),請(qǐng)先進(jìn)行刪除\n"); return; } else { printf("請(qǐng)輸入姓名:"); scanf("%s", p->data[p->count].name); printf("請(qǐng)輸入年齡:"); scanf("%d", &(p->data[p->count].age)); printf("請(qǐng)輸入性別(F\\M):"); scanf("%s", p->data[p->count].sex); printf("請(qǐng)輸入地址:"); scanf("%s", p->data[p->count].addr); printf("請(qǐng)輸入電話(huà):"); scanf("%s", p->data[p->count].num); p->count++; printf("\n增添成功!\n"); } } void show(book* p) { assert(p); int i = 0; printf("%10s %5s %5s %10s %13s\n","姓名","年齡","性別","地址","電話(huà)"); for (i = 0; i < p->count; i++) { printf("%10s %5d %5s %10s %13s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].addr, p->data[i].num); } } int search(book* p, char name[]) { for (int i = 0; i < p->count; i++) { if (strcmp(name , p->data[i].name)==0) { return i; } else { return -1; } } } void delete(book* p) { assert(p); if (p->count == 0) { printf("\n為空,無(wú)法刪除!\n"); return; } else { printf("請(qǐng)輸入刪除對(duì)象:\n"); char name[max] = {0}; scanf("%s", &name); int f = search(p,name); if (f == -1) { printf("該對(duì)象不存在!\n"); } else { for (int j = f; j < p->count-1; j++) { p->data[j] = p->data[j + 1]; } p->count--; printf("\n刪除成功!\n"); } } } void find(book* p) { assert(p); if (p->count == 0) printf("\n目錄為空!\n"); else { char name[max] = { 0 }; printf("請(qǐng)輸入查找對(duì)象:\n"); scanf("%s", &name); int i = search(p, name); if (i != -1) { printf("聯(lián)系人存在,在第%d位\n", i + 1); } else { printf("聯(lián)系人不存在!\n"); } } } void fix(book* p) { assert(p); if (p->count == 0) { printf("為空,無(wú)法刪除!\n"); return; } else { printf("請(qǐng)輸入對(duì)象姓名:\n"); char name[max] = { 0 }; scanf("%s", &name); int i = search(p,name); if(i!=-1) { printf("該對(duì)象存在\n"); printf("請(qǐng)輸入修改內(nèi)容:\n"); printf("請(qǐng)輸入姓名:\n"); scanf("%s", p->data[i].name); printf("請(qǐng)輸入年齡:\n"); scanf("%d", &(p->data[p->count].age)); printf("請(qǐng)輸入性別(F\M):\n"); scanf("%c", &(p->data[p->count].sex)); printf("請(qǐng)輸入地址:\n"); scanf("%s", p->data[p->count].addr); printf("請(qǐng)輸入電話(huà):\n"); scanf("%s", p->data[p->count].num); printf("\n修改成功!\n"); } else { printf("該對(duì)象不存在!\n"); return 0; } } } int compare(const void* a, const void* b) { return strcmp(((book*)a)->data->name , ((book*)b)->data->name); } int compare2(const void* a, const void* b) { return strcmp(((book*)b)->data->name, ((book*)a)->data->name); } void sort(book* p) { printf("請(qǐng)選擇:\n"); printf("-----------------------------\n"); printf("----- 1.順序 | 2.逆序-----\n"); printf("-----------------------------\n"); int in; scanf("%d", &in); switch (in) { case 1: qsort(p->data, p->count, sizeof(p->data[0]), compare); case 2: qsort(p->data, p->count, sizeof(p->data[0]), compare2); } printf("\n 排序完成!\n"); }
動(dòng)態(tài)版
動(dòng)態(tài)版的區(qū)別就在于他的內(nèi)存是活的,按需索取,要多少拿多少,絕不少給也絕不浪費(fèi)空間,在空間上做出了質(zhì)的優(yōu)化,原理就是動(dòng)態(tài)內(nèi)存分配。
typedef struct book { num data[max]; int count; int capacity; }book;
首先我們?cè)?book 定義的結(jié)構(gòu)體中引入一個(gè) capacity 變量,意為容量,它就相當(dāng)于一個(gè)空間使用的指標(biāo)變量。
動(dòng)態(tài)初始化:
void start(book* p) { assert(p); num* container = (num*)malloc(DEFAULT * sizeof(num)); if (container != NULL) { p->data = container; p->count = 0; p->capacity = DEFAULT; } else { printf("%s\n", strerror(errno)); return; } }
重點(diǎn)是這里不再使用死板的數(shù)組,改用 malloc 函數(shù)先開(kāi)辟一塊默認(rèn)大小,這個(gè)大小我們隨意設(shè)置但避免浪費(fèi)我們要盡量往小了設(shè)置。注意空指針,我們后面設(shè)置一個(gè)查看錯(cuò)誤類(lèi)型方便排空(注意引<errno.h>頭文件) 。
擴(kuò)容函數(shù)
則擴(kuò)容的關(guān)鍵就在于我們的 capa_city 函數(shù):
void capa_city(book* p) { num* container = (num*)realloc(p->data, sizeof(book) * (p->capacity + 2)); if (container != NULL) { p->data = container; p->capacity += 2 ; printf("增容成功!\n"); } else { printf("%s\n", strerror(errno)); return; } }
我們?yōu)榱梭w現(xiàn)空間利用的得當(dāng),我們每次擴(kuò)容控制在 +2 數(shù)據(jù)空間即可。
接下來(lái)不用變動(dòng)即可實(shí)現(xiàn)動(dòng)態(tài)版本了,我直接上代碼:
動(dòng)態(tài)版全部代碼
test.c
#include"phonebook.h" void menu() { printf("-----------------------------\n"); printf("---- 歡迎使用通訊錄 ----\n"); printf("-----------------------------\n"); printf("----- 1.增添 | 2.刪減-----\n"); printf("----- 3.查找 | 4.修改-----\n"); printf("----- 5.排序 | 6.全覽-----\n"); printf("----- 0.退出 -----\n"); printf("-----------------------------\n"); } int main() { int input; book con; start(&con); do { menu(); printf("請(qǐng)選擇:\n"); scanf("%d", &input); switch (input) { case 增添: add(&con); break; case 刪減: delete(&con); break; case 查找: find(&con); break; case 修改: fix(&con); break; case 排序: sort(&con); break; case 全覽: show(&con); break; case 退出: break; default: printf("錯(cuò)誤輸入!\n"); return 0; } } while (input); return 0; }
phonebook.h
#pragma once # define _CRT_SECURE_NO_WARNINGS # include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h> #include<errno.h> #define max 1000 #define x 30 #define DEFAULT 50 #define z 20 typedef struct num { char name[x]; int age; char sex[x]; char addr[x]; char num[z]; }num; typedef struct book { num* data; int count; int capacity; }book; enum conmenu { 退出, 增添, 刪減, 查找, 修改, 排序, 全覽, }; void start(book* p); void add(book* p); void show(const book* p); void delete(book* p); int search(book* p,char name[]); void find(book* p); void fix(book* p); void sort(book* p); void capa_city(book* p);
phonebook.c
# define _CRT_SECURE_NO_WARNINGS #include"phonebook.h" void capa_city(book* p) { num* container = (num*)realloc(p->data, sizeof(book) * (p->capacity + 2)); if (container != NULL) { p->data = container; p->capacity += 2 ; printf("增容成功!\n"); } else { printf("%s\n", strerror(errno)); return; } } void start(book* p) { assert(p); num* container = (num*)malloc(DEFAULT * sizeof(num)); if (container != NULL) { p->data = container; p->count = 0; p->capacity = DEFAULT; } else { printf("%s\n", strerror(errno)); return; } } void add(book* p) { if (p->capacity == p->count) { capa_city(p); } assert(p); if (p->count == max) { printf("已滿(mǎn),請(qǐng)先進(jìn)行刪除\n"); return; } else { printf("請(qǐng)輸入姓名:"); scanf("%s", p->data[p->count].name); printf("請(qǐng)輸入年齡:"); scanf("%d", &(p->data[p->count].age)); printf("請(qǐng)輸入性別(F\\M):"); scanf("%s", p->data[p->count].sex); printf("請(qǐng)輸入地址:"); scanf("%s", p->data[p->count].addr); printf("請(qǐng)輸入電話(huà):"); scanf("%s", p->data[p->count].num); p->count++; printf("\n增添成功!\n"); } } void show(book* p) { assert(p); if (p->capacity == p->count) { capa_city(p); } int i = 0; printf("%10s %5s %5s %10s %13s\n","姓名","年齡","性別","地址","電話(huà)"); for (i = 0; i < p->count; i++) { printf("%10s %5d %5s %10s %13s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].addr, p->data[i].num); } } int search(book* p, char name[]) { for (int i = 0; i < p->count; i++) { if (strcmp(name , p->data[i].name)==0) { return i; } else { return -1; } } } void delete(book* p) { assert(p); if (p->count == 0) { printf("\n為空,無(wú)法刪除!\n"); return; } else { printf("請(qǐng)輸入刪除對(duì)象:\n"); char name[max] = {0}; scanf("%s", &name); int f = search(p,name); if (f == -1) { printf("該對(duì)象不存在!\n"); } else { for (int j = f; j < p->count-1; j++) { p->data[j] = p->data[j + 1]; } p->count--; printf("\n刪除成功!\n"); } } } void find(book* p) { assert(p); if (p->count == 0) printf("\n目錄為空!\n"); else { char name[max] = { 0 }; printf("請(qǐng)輸入查找對(duì)象:\n"); scanf("%s", &name); int i = search(p, name); if (i != -1) { printf("聯(lián)系人存在,在第%d位\n", i + 1); } else { printf("聯(lián)系人不存在!\n"); } } } void fix(book* p) { assert(p); if (p->count == 0) { printf("為空,無(wú)法刪除!\n"); return; } else { printf("請(qǐng)輸入對(duì)象姓名:\n"); char name[max] = { 0 }; scanf("%s", &name); int i = search(p,name); if(i!=-1) { printf("該對(duì)象存在\n"); printf("請(qǐng)輸入修改內(nèi)容:\n"); printf("請(qǐng)輸入姓名:\n"); scanf("%s", p->data[i].name); printf("請(qǐng)輸入年齡:\n"); scanf("%d", &(p->data[p->count].age)); printf("請(qǐng)輸入性別(F\M):\n"); scanf("%c", &(p->data[p->count].sex)); printf("請(qǐng)輸入地址:\n"); scanf("%s", p->data[p->count].addr); printf("請(qǐng)輸入電話(huà):\n"); scanf("%s", p->data[p->count].num); printf("\n修改成功!\n"); } else { printf("該對(duì)象不存在!\n"); return 0; } } } int compare(const void* a, const void* b) { return strcmp(((book*)a)->data->name , ((book*)b)->data->name); } int compare2(const void* a, const void* b) { return strcmp(((book*)b)->data->name, ((book*)a)->data->name); } void sort(book* p) { printf("請(qǐng)選擇:\n"); printf("-----------------------------\n"); printf("----- 1.順序 | 2.逆序-----\n"); printf("-----------------------------\n"); int in; scanf("%d", &in); switch (in) { case 1: qsort(p->data, p->count, sizeof(p->data[0]), compare); case 2: qsort(p->data, p->count, sizeof(p->data[0]), compare2); } printf("\n 排序完成!\n"); }
今天就到這里吧,摸了家人們。
以上就是C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言靜態(tài)動(dòng)態(tài)通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的代碼分享
- C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼
- C語(yǔ)言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)
- C語(yǔ)言實(shí)現(xiàn)可保存的動(dòng)態(tài)通訊錄的示例代碼
- C語(yǔ)言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過(guò)程
- C語(yǔ)言與C++動(dòng)態(tài)通訊錄超詳細(xì)實(shí)現(xiàn)流程
- C語(yǔ)言動(dòng)態(tài)與靜態(tài)分別實(shí)現(xiàn)通訊錄詳細(xì)過(guò)程
- C語(yǔ)言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程詳解
相關(guān)文章
C++實(shí)現(xiàn)掃雷游戲(控制臺(tái)版)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷游戲,控制臺(tái)版的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C++入門(mén)到精通之循環(huán)語(yǔ)句的使用教程
這篇文章主要給大家介紹了關(guān)于C++中循環(huán)語(yǔ)句的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12深入剖析Android中init進(jìn)程實(shí)現(xiàn)的C語(yǔ)言源碼
這篇文章主要介紹了Android中init進(jìn)程實(shí)現(xiàn)的C語(yǔ)言源碼,init屬性服務(wù)在安卓中屬于系統(tǒng)的底層Linux服務(wù),需要的朋友可以參考下2015-07-07