实现动态开辟内存的通讯录
在实现动态开辟内存时首先得了解动态内存分配
1.malloc和free
函数原型
void *malloc( size_t size );
void free( void *pointer );
malloc分配一块连续的内存,参数以字节数为单位,如果空间申请失败,则函数返回NULL,free常和malloc结合使用并成对出现。
2.realloc
void realloc( void *ptr, size_t size )//扩容
void *calloc( size_t num_elements, size_t element_size )//内存分配,并在分配前将空间初始化为0;
contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>
#define INIT_MAX 2
#define RISE_MAX 2
typedef struct PeInfo
{
char name[20];
int age;
char sex[10];
char tele[15];
char addr[30];
}PeInfo;
typedef struct Contact
{
PeInfo *contact;
int capacity;
int sz;
}Contact, *pContact;
void init_con(pContact p);//初始化通讯录
void Add_con(pContact p);// 添加联系人信息
void Dele_con(pContact p);//删除指定联系人信息
void Find_con(pContact p);//查找指定联系人信息
void Revise_con(pContact p);//修改指定联系人信息
void Display_con(pContact p);//显示所有联系人信息
void Empty_con(pContact p);//清空所有联系人
void Sort_con(pContact p);//以名字排序所有联系人
void Exit_con(pContact p);//结束程序
void adj(pContact p, int i);//写入数据 m
void Inc_capa(pContact p);//扩容函数
#endif //__CONTACT_H__
contact.c
#include"contact.h"
void init_con(pContact p)//初始化通讯录
{
p->contact =(PeInfo*)malloc(INIT_MAX*sizeof(PeInfo));//开辟空间
if(p->contact == NULL)//错误报告
{
perror("out of memory\n");
exit(EXIT_FAILURE);
}
p->capacity = INIT_MAX; //初始化
p->sz = 0; //初始化
//memset(p->contact, 0, INIT_MAX);
}
void Inc_capa(pContact p)//扩容函数
{
PeInfo *tmp = (PeInfo*)realloc(p->contact, (p->capacity + RISE_MAX)*sizeof(PeInfo)); //当内存不够时,扩充大小为(p->capacity + RISE_MAX)*sizeof(PeInfo))个字节的内存
assert(p);
if(tmp == NULL)
{
perror("out of memory\n");
exit(EXIT_FAILURE);
}
p->capacity += RISE_MAX;
p->contact=tmp;
printf("增容成功\n");
}
void adj(pContact p, int i)//写入数据
{
printf("请输入姓名:\n");
scanf("%s", p->contact[i].name);
printf("请输入年龄:\n");
scanf("%d", &(p->contact[i].age));
printf("请输入性别:\n");
scanf("%s", p->contact[i].sex);
printf("请输入电话:\n");
scanf("%s", p->contact[i].tele);
printf("请输入住址:\n");
scanf("%s", p->contact[i].addr);
}
void Add_con(pContact p)// 添加联系人信息
{
if(p->sz == p->capacity)
{
Inc_capa(p);
}
adj(p, p->sz);//写入数据
p->sz++;
}
void Dele_con(pContact p)//删除指定联系人信息
{
int i=0;
int j=0;
char ch=0;
char name[20]={0};
if(p->sz==0)
{
printf("通讯录为空\n");
return;
}
while(1)
{
printf("输入删除对象姓名:");
scanf("%s", name);
for(i=0; i<p->sz; i++)
{
if(strcmp(name, p->contact[i].name)==0)
break;
}
if(i==p->sz)
{
printf("不存在\n");
return;
}
else
{
for(j=i; j<(p->sz-1); j++)
{
p->contact[j]=p->contact[j+1];
}
printf("删除成功\n");
p->sz--;
return;
}
}
}
void Find_con(pContact p)//查找指定联系人信息
{
int i=0;
char name[20]={0};
printf("所查找人姓名:");
scanf("%s", name);
for(i=0; i<p->sz; i++)
{
if(strcmp(name, p->contact[i].name)==0)
{
printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
printf("%15s%10d%10s%15s%20s\n",p->contact[i].name, p->contact[i].age, p->contact[i].sex,
p->contact[i].tele, p->contact[i].addr);
return;
}
}
if(i==p->sz)
printf("不存在\n");
return;
}
void Revise_con(pContact p)//修改指定联系人信息
{
int i=0;
char name[20]={0};
if(p->sz==0)
{
printf("通讯录为空");
return;
}
printf("输入修改对象姓名:");
scanf("%s", name);
for(i=0; i<p->sz; i++)
{
if(strcmp(name, p->contact[i].name)==0)
{
printf("要修改人信息:\n");
printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
printf("%15s%10d%10s%15s%20s\n",p->contact[i].name,
p->contact[i].age, p->contact[i].sex,
p->contact[i].tele, p->contact[i].addr);
printf("修改为:\n");
adj(p, i);
printf("修改完成\n");
return;
}
}
if(i==p->sz)
printf("不存在\n");
return;
}
void Display_con(pContact p)//显示所有联系人信息
{
int i=0;
printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
if(p->sz==0)
{
printf("空\n ");
return ;
}
for(i=0; i<p->sz; i++)
{
printf("%15s%10d%10s%15s%20s\n",p->contact[i].name,
p->contact[i].age, p->contact[i].sex,
p->contact[i].tele, p->contact[i].addr);
}
}
void Empty_con(pContact p)//清空所有联系人
{
p->sz=0;
free(p);
}
void Sort_con(pContact p)//按字母排序所有联系人
{
int i = 0;
int j = 0;
for(i=0;i<p->sz-1;i++)
{
for(j=0;j<p->sz-1-i;j++)
{
if(strcmp(p->contact[j].name,p->contact[j+1].name)>0)
{
PeInfo temp;
temp = p->contact[j];
p->contact[j] = p->contact[j+1];
p->contact[j+1] = temp;
}
}
}
printf("排序完成\n");
return;
}
void Exit_con(pContact p)//结束程序
{
free(p->contact);
p->contact = NULL;
exit(0);
}
test.c
#include"contact.h"
void menu()//菜单打印
{
printf("**************************\n");
printf("***** 通 讯 录 *****\n");
printf("**************************\n");
printf("***** 1.添加 2.删除 *****\n");
printf("***** 3.查找 4.修改 *****\n");
printf("***** 5.列表 6.清空 *****\n");
printf("***** 7.排序 8.退出 *****\n");
printf("**************************\n");
}
int main()
{
Contact con;
int input = 0;
init_con(&con);
do{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
Add_con(&con);
break;
case 2:
Dele_con(&con);
break;
case 3:
Find_con(&con);
break;
case 4:
Revise_con(&con);
break;
case 5:
Display_con(&con);
break;
case 6:
Empty_con(&con);
break;
case 7:
Sort_con(&con);
break;
case 8:
Exit_con(&con);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while(1);
return 0;
}
代码实现效果如和1.0无差别,没有新的功能的增加。
若有不当之处,恳请留言指正