C语言使用realloc函数实现通讯录源码分析
HaiFan. 人气:0一、ContactInit初始化
void ContactInit(Contact* ps)//初始化 { ps->size = 0; ps->capacity = 0; ps->data = NULL; }
初始化的时候,就不再使用memset函数了,因为是指针,所以要先把size,capacity置为0,data置为空。
二、ContactCheckCapacity检查通讯录内存是否够用
void ContactCheckCapacity(Contact* pc)//检查通讯录内存是否够用 { if (pc->size == pc->capacity) { int newcapacity = pc->capacity == 0 ? 4 : pc->capacity * 2; Cont* tmp = (Cont*)realloc(pc->data, newcapacity * sizeof(Cont) * 4); if (tmp == NULL) { perror("realloc"); exit(-1); } pc->data = tmp; pc->capacity = newcapacity; printf("增容成功\n"); } }
当size == capacity的时候,就证明通讯录的内存不够了,需要增容,在这里直接用的realloc函数进行增容。
三、ContactDistory释放动态开辟的空间
void ContactDistory(Contact* pc)//释放动态开辟的空间 { free(pc->data); pc->data = NULL; pc->capacity = pc->size = 0; }
使用动态内存分配的函数了之后,在退出通讯录的时候,不要忘记把开辟的空间给销毁,不然会造成内存泄漏。
四、源码
.h文件
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #define MAX_SIZE 1000 #define MAX_NAME 5 #define MAX_TELE 100 #define MAX_SEX 5 #define MAX_ADDRESS 50 typedef struct Contact { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char address[MAX_ADDRESS]; }Cont; typedef struct C { Cont *data; int size; int capacity; }Contact; void ContactInit(Contact* ps);//初始化 void ContactAdd(Contact* ps);//添加联系人 void ContactDel(Contact* ps);//删除联系人 void ContactShow(Contact* ps);//展示联系人 void ContactFind(Contact* ps);//查找联系人 void ContactSort(Contact* ps);//给联系人排序 void ContactModify(Contact* ps);//修改联系人 void ContactCheckCapacity(Contact* pc);//检查通讯录内存是否够用 void ContactDistory(Contact* pc);//释放动态开辟的空间
.c文件
#include "contact.h" void ContactInit(Contact* ps)//初始化 { ps->size = 0; ps->capacity = 0; ps->data = NULL; } void ContactCheckCapacity(Contact* pc)//检查通讯录内存是否够用 { if (pc->size == pc->capacity) { int newcapacity = pc->capacity == 0 ? 4 : pc->capacity * 2; Cont* tmp = (Cont*)realloc(pc->data, newcapacity * sizeof(Cont) * 4); if (tmp == NULL) { perror("realloc"); exit(-1); } pc->data = tmp; pc->capacity = newcapacity; printf("增容成功\n"); } } void ContactDistory(Contact* pc)//释放动态开辟的空间 { free(pc->data); pc->data = NULL; pc->capacity = pc->size = 0; } void ContactAdd(Contact* ps)//添加联系人 { assert(ps); ContactCheckCapacity(ps); //增加一个人的信息 printf("请输入名字:>"); scanf("%s", ps->data[ps->size].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ps->size].age)); printf("请输入性别:>"); scanf("%s", ps->data[ps->size].sex); printf("请输入地址:>"); scanf("%s", ps->data[ps->size].address); printf("请输入电话:>"); scanf("%s", ps->data[ps->size].tele); ps->size++; } int FindByName(Contact* ps,const char *str) { int pos = 0; while (pos < ps->size) { if (strcmp(ps->data[pos].name, str) == 0) { return pos; } pos++; } return -1; } void ContactFind(Contact* ps)//查找联系人 { assert(ps); printf("请输入要查找的联系人的姓名:"); char na[MAX_NAME]; scanf("%s", na); int ret = FindByName(ps, na); if (ret == -1) { printf("查无此人\n"); return; } printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "电话", "地址"); printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", ps->data[ret].name, ps->data[ret].age, ps->data[ret].sex, ps->data[ret].tele, ps->data[ret].address); return ; } void ContactDel(Contact* ps)//删除联系人 { assert(ps); printf("请输入要删除的联系人的姓名:"); char na[MAX_NAME]; scanf("%s", na); int ret = FindByName(ps, na); if (ret == -1) { printf("信息错误,列表无该联系人\n"); return; } else { for (int i = ret; i < ps->size - 1; i++) { ps->data[i] = ps->data[i + 1]; } } ps->size--; return; } void ContactShow(Contact* ps)//展示联系人 { int i = 0; printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < ps->size; i++) { printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", ps->data[i].name, ps->data[i].age, ps->data[i].sex, ps->data[i].tele, ps->data[i].address); } } int CmpByName(const void* a,const void* b) { return strcmp(((Contact*)a)->data->name, ((Contact*)b)->data->name); } //return strcmp(((S*)a)->name, ((S*)b)->name); void ContactSort(Contact* ps)//给联系人排序 { assert(ps); qsort(ps->data[0].name, ps->size, sizeof ps->data[0], CmpByName); printf("排序成功\n"); return; } void ContactModify(Contact* ps)//修改联系人 { assert(ps); printf("请输入要修改的联系人的姓名:"); char na[MAX_NAME]; scanf("%s", na); int ret = FindByName(ps, na); if (ret == -1) { printf("查无此人,无法修改\n"); return; } printf("请输入名字:>"); scanf("%s", ps->data[ret].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ret].age)); printf("请输入性别:>"); scanf("%s", ps->data[ret].sex); printf("请输入地址:>"); scanf("%s", ps->data[ret].address); printf("请输入电话:>"); scanf("%s", ps->data[ret].tele); printf("修改成功\n"); return; }
test.c文件
#include "contact.h" void menu() { printf("************************************\n"); printf("****** 1. 添加 2. 删除 ******\n"); printf("****** 3. 查找 4. 修改 ******\n"); printf("****** 5. 展示 6. 排序 ******\n"); printf("****** 7.退出 ******\n"); printf("************************************\n"); } enum Function { ADD = 1, DEL, FIND, MODIFY, SHOW, SORT, EXIT }; int main() { int input = 0; Contact con; ContactInit(&con); do { menu(); printf("请输入选项:"); scanf("%d", &input); switch (input) { case ADD: ContactAdd(&con); break; case DEL: ContactDel(&con); break; case FIND: ContactFind(&con); break; case MODIFY: ContactModify(&con); break; case SHOW: ContactShow(&con); break; case SORT: ContactSort(&con); break; case EXIT: ContactDistory(&con); printf("退出\n"); break; default: printf("输入错误,请重新出入\n"); break; } } while (input != 7); return 0; }
加载全部内容