各位大佬,在上篇博客我完成了通讯录的编写。那么今天给大家带来运用动态内存管理版本的通讯录。
在上一篇博客中我们创造了一个可以容纳100人的数组来存放联系人,但只能存放100人。那么我们使用动态内存是可以存放更多人的。
因此我们先使用malloc函数创造可存放3个人的空间,如果还要存放可以再利用realloc再添加。
首先我们要先将struct contact改进原来的data数组改为指针他指向的是存放数据的空间。然后再加入一个变量capcity,用来表示容量。
struct contact
{
struct peop* data;
int sz;
int capcity;
};
其次需要改进的是我们的初始化函数,在初始化函数中我们应该直接利用malloc开辟空间。而capcity我们直接初始化为3表示刚开始可以存放3个联系人的信息。
void initializecon(struct contact* pc)
{
pc->data = (struct peop*)malloc(3 * sizeof(struct peop));
pc->sz = 0;
pc->capcity = 3;
}
那么在我们添加完3个联系人之后,我们就需要用到realloc函数了,realloc函数需要两个参数分别为需要改变的内存地址和改变后的空间大小。改变后的空间大小这里很容易就写成要添加的空间大小了,希望大家可以多多留意,一定是改变后的空间大小!
int chack_peop(struct contact* pc)
{
if(pc->sz == pc->capcity)
{
struct peop* ptr = (struct peop*)realloc(pc->data, (pc->capcity + 2) * sizeof(struct peop));
printf("增加空间成功!!\n");
if (ptr != NULL)
{
pc->data = ptr;
pc->capcity += 2;
printf("增容成功\n");
return 1;
}
else
{
perror("AddContact()");
return 0;
}
}
else
return 1;
}
添加空间成功后就会返回1或者刚开始的空间没有占满也会返回1,如果开辟失败会返回0。
所以我们在添加联系人函数中需要改变一下,将原先的if else语句改为接受chack_peop函数值如果为零直接从函数退出,若不为零再进行联系人的信息输入。
void Addpeop(struct contact* pc)
{
int ret = chack_peop(pc);
if(ret == 0)
{
return;
}
printf("请输入联系人信息\n");
printf("请输入性名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone_num);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].home);
printf("成功增加联系人\n");
pc->sz++;
}
当然,malloc出来的空间是需要释放的,所以需要再加入一个退出函数quit,他的作用就是将创建出来的空间释放,再将sz和capcity置零。
void quit(struct contact* pc)
{
free(pc->data);
pc->data = NULL;
pc->data = 0;
pc->capcity = 0;
}
好了现在我们的通讯录就改进完成了。
下面是源码:
contact,h
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_PHONE_NUM 12
#define MAX_HOME 30
struct peop
{
char name[MAX_NAME];
char sex[MAX_SEX];
char phone_num[MAX_PHONE_NUM];
int age;
char home[MAX_HOME];
};
struct contact
{
struct peop* data;
int sz;
int capcity;
};
void initializecon(struct contact* pc);
void Addpeop(struct contact* pc);
void Cutpeop(struct contact* pc);
void Showpeop(const struct contact* pc);
void Findpeop(const struct contact* pc);
void Exchangepeop(struct contact* pc);
void Sortpeop(const struct contact* pc);
void quit(const struct contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化
void initializecon(struct contact* pc)
{
pc->data = (struct peop*)malloc(3 * sizeof(struct peop));
pc->sz = 0;
pc->capcity = 3;
}
int chack_peop(struct contact* pc)
{
if(pc->sz == pc->capcity)
{
struct peop* ptr = (struct peop*)realloc(pc->data, (pc->capcity + 2) * sizeof(struct peop));
printf("增加空间成功!!\n");
if (ptr != NULL)
{
pc->data = ptr;
pc->capcity += 2;
printf("增容成功\n");
return 1;
}
else
{
perror("AddContact()");
return 0;
}
}
else
return 1;
}
void Addpeop(struct contact* pc)
{
int ret = chack_peop(pc);
if(ret == 0)
{
return;
}
printf("请输入联系人信息\n");
printf("请输入性名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone_num);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].home);
printf("成功增加联系人\n");
pc->sz++;
}
void Showpeop(const struct contact* pc)
{
int i;
for (i = 0; i < pc->sz; i++)
{
printf("%s,%s,%d,%s,%s\n", pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].phone_num,
pc->data[i].home);
}
}
static int find_peop(struct contact* pc,char name[])
{
int i = 0;
int ret = 0;
for(i;i<pc->sz;i++)
{
if(0 == strcmp(pc->data[i].name,name))
{
return i;
}
}
return -1;
}
void Cutpeop(struct contact* pc)
{
char cut_name[MAX_NAME];
printf("请输入要删除的联系人");
scanf("%s", &cut_name);
int ret = find_peop(pc, cut_name);
if(ret == -1)
{
printf("想要删除的联系人不存在!");
}
else
{
for(int i = ret;i<pc->sz-1;i++)
{
pc->data[i] = pc->data[i+1];
}
pc->sz--;
printf("成功删除");
}
}
void Findpeop(const struct contact* pc)
{
char name[MAX_NAME];
printf("请输入想要查找的人的名字");
scanf("%s", &name);
int ret = find_peop(pc, name);
if (ret == -1)
{
printf("查找的联系人不存在!");
}
else
{
printf("%s,%s,%d,%s,%s\n", pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].phone_num,
pc->data[ret].home);
}
}
void Exchangepeop(struct contact* pc)
{
char ex_name[MAX_NAME];
printf("请输入想要修改的联系人姓名");
scanf("%s", &ex_name);
int ret = find_peop(pc, ex_name);
if (ret == -1)
{
printf("想要修改的联系人不存在!");
}
else
{
printf("请输入性名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone_num);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].home);
}
}
int Cmpname(const void* e1, const void* e2)
{
return strcmp(((struct peop*)e1)->name, ((struct peop*)e2)->name);
}
void Sortpeop(struct contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct peop), Cmpname);
}
void quit(struct contact* pc)
{
free(pc->data);
pc->data = NULL;
pc->data = 0;
pc->capcity = 0;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("********************************\n");
printf("******1.add 2.cut *********\n");
printf("******3.find 4.exchange*******\n");
printf("******5.show 6.sort ********\n");
printf("******0.quit********************\n");
printf("********************************\n");
}
int main()
{
int a = 0;
struct contact con;
initializecon(&con);//初始化
printf("请选择:\n");
do
{
menu();
scanf("%d", &a);
switch (a)
{
case 1:
Addpeop(&con);
break;
case 2:
Cutpeop(&con);
break;
case 3:
Findpeop(&con);
break;
case 4:
Exchangepeop(&con);
break;
case 5:
Showpeop(&con);
break;
case 6:
Sortpeop(&con);
break;
case 0:
quit(&con);
break;
default:
break;
}
} while (a);
return 0;
}
版权归原作者 诗仙女rg 所有, 如有侵权,请联系我们删除。