简陋版C语言仿真通讯录之动态内存开辟版本
生活随笔
收集整理的這篇文章主要介紹了
简陋版C语言仿真通讯录之动态内存开辟版本
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)陋版C語(yǔ)言仿真通訊錄
https://blog.csdn.net/csdn_kou/article/details/80287640
簡(jiǎn)陋版C語(yǔ)言仿真通訊錄之動(dòng)態(tài)內(nèi)存開辟版本
給Contact結(jié)構(gòu)體增加一個(gè)容量,來表示什么時(shí)候增容
#define MAX_NAME 20 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[4]; }people;typedef struct Contact {people * data;int count;int capacity; }Contact, *pContact;初始化容量大小,這里我們做小一點(diǎn)可以看到增容效果
/*初始化*/ void InitContact(pContact pc) {pc->count = 0;pc->capacity = DEFAULT_SZ;pc->data = (people*)calloc(sizeof(people), pc->capacity); }檢查是否需要增容放在了增加數(shù)據(jù)的第一句作為判斷
/*增加數(shù)據(jù)*/ void check_cap(pContact pc) {if (pc->count == pc->capacity){people* p = (people *) realloc(pc->data,(pc->capacity+2)*sizeof(people));if (p != NULL){pc->data = p;p = NULL;}pc->capacity += 2;printf("增容成功");} }最后別忘了,動(dòng)態(tài)內(nèi)存開辟空間要釋放
void Free(pContact pc) {free(pc->data);pc->capacity = 0;pc->count = 0;pc->data = NULL;printf("釋放空間成功\n"); }完整代碼
main.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "contact.h"int main() {int input = 0;Contact my_con;InitContact(&my_con);do {menu();printf("please chose");scanf("%d", &input);//運(yùn)行第二遍是輸入字母默認(rèn)為1switch (input){case ADD:AddContact(&my_con);justice(&my_con);break;case SHOW:ShowContact(&my_con);break;case DEL:DelContact(&my_con);break;case EXIT:Free(&my_con);break;case SEARCH:Search(&my_con);break;case SORT:Sort(&my_con);break;default:fflush(stdin);fflush(stdout);//sync();//清除緩沖區(qū)//clear();//清除錯(cuò)誤狀態(tài)break;}} while (input);system("pause");return 0; }contact.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "contact.h"void menu() {printf("*************************\n");printf("**1.add 2.show*******\n");printf("**3.search 4.delete*****\n");printf("**5.sort 0.exit*******\n");printf("*************************\n"); }/*初始化*/ void InitContact(pContact pc) {pc->count = 0;pc->capacity = DEFAULT_SZ;pc->data = (people*)calloc(sizeof(people), pc->capacity); }/*增加數(shù)據(jù)*/ void check_cap(pContact pc) {if (pc->count == pc->capacity){people* p = (people *) realloc(pc->data,(pc->capacity+2)*sizeof(people));if (p != NULL){pc->data = p;p = NULL;}pc->capacity += 2;printf("增容成功");} }void AddContact(pContact pc) {check_cap(pc);if (pc->count < 1000){printf("請(qǐng)輸入名字>");scanf("%s", pc->data[pc->count].name);printf("請(qǐng)輸入年齡>");scanf("%d", &pc->data[pc->count].age);printf("請(qǐng)輸入性別>");scanf("%s", pc->data[pc->count].sex);pc->count++;}else{printf("存不下了");return;} }/*展示*/ void ShowContact(pContact pc) {printf("%-11s %-11s %-11s \n","姓名","年齡","性別");if (pc->count != 0){for (int i = 0; i < pc->count; i++){if (pc->data[i].age != 0){printf("%d|%-11s %-11d %-11s \n", i,pc->data[i].name,pc->data[i].age,pc->data[i].sex);}}}else{printf("通訊沒有號(hào)碼\n");return;} }/*刪除*/ void DelContact(pContact pc) {printf("請(qǐng)輸入要?jiǎng)h除的編號(hào)");int i = 0, num;scanf("%d", &num);for (i = num; i < pc->count; i++){pc->data[i] = pc->data[i + 1];}pc->count - 1; }/*判斷輸入的名字是不是重復(fù),如果重復(fù)就刪除*/ void justice(pContact pc) {for (int i = 0; i < pc->count - 1; i++){if (!strcmp(pc->data[pc->count - 1].name, pc->data[i].name)){printf("\n非法輸入\n");pc->data[pc->count - 1] = pc->data[pc->count];}} }/*比較*/ char compare(const void * a, const void * b) {return (*(char*)a - *(char*)b); }void Sort(pContact pc) {int i;qsort(pc->data, pc->count, sizeof(people), compare);for (i = 0; i<pc->count; i++)printf("%d|%-11s %-11d %-11s \n", i, pc->data[i].name, pc->data[i].age, pc->data[i].sex);return; }/*查找*/ int search_son(pContact pc, char *name) {int i, j;for (i = 0; i < pc->count; i++){if (!strcmp(name, pc->data[i].name)){return i;}}return -1; }void Search(pContact pc) {int i = 0;char name[20];//要給一個(gè)大小,要不然一直讀取位置時(shí)發(fā)生訪問沖突printf("name>");scanf("%s", &name);i = search_son(pc, name);if (i >= 0){printf("找到了,嗚啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦!\n");printf("%d|%-8s%8d%11s\n", i, pc->data[i].name, pc->data[i].age, pc->data[i].sex);printf("******************************************\n");}else{printf("Can't find it\n");}return; }void Free(pContact pc) {free(pc->data);pc->capacity = 0;pc->count = 0;pc->data = NULL;printf("釋放空間成功\n"); }contact.h
#ifndef __CONTACT_H__ #define __CONTACT_H__#define DEFAULT_SZ 3 /* 這個(gè)順序就是switch()的順序,注意逗號(hào)不是分號(hào),最后一個(gè)不寫符號(hào) */ enum OPTION {EXIT,ADD,SHOW,SEARCH,DEL,SORT };#define MAX_NAME 20 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[4]; }people;typedef struct Contact {people * data;int count;int capacity; }Contact, *pContact;void AddContact(pContact pc); void InitContact(pContact pc); void ShowContact(pContact pc); void DelContact(pContact pc); void justice(pContact pc); void Search(pContact pc); void Sort(pContact pc); void Free(pContact pc); #endif // !__CONTACT_H__總結(jié)
以上是生活随笔為你收集整理的简陋版C语言仿真通讯录之动态内存开辟版本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言模拟实现标准库函数之qsort()
- 下一篇: 成都大熊猫繁育研究基地熊猫吃饭时间