通讯录的动态版本
通讯录的动态版本
- 一. 增加需求
- 二. 动手实施
- 三. 回收空间
- 四. 所有代码文件
- 1. 头文件
- 2. 主函数文件
- 3. 测试文件
一. 增加需求
在学习了动态开辟内存之后 我们对于通讯录产生了新的需求
要求我们做出一个动态增长的版本
即 随着我们储存联系人的增加 储存的空间增加
要求 :
1 初始空间为3
2 每次达到上限之后 扩容两个内存
二. 动手实施
我们首先要创建一个结构体
结构体的代码暂定为这样子
struct contact
{
struct address* date;
int sz;
int max;
};
既然结构体改变了 那么我们的初始化也需要改变一下
void inicontact(struct contact* pc)
{
pc->sz = 0;
pc-> max = 3;
pc->date = (struct address*)calloc(3,sizeof(struct address));
}
这样我们就初始化出来了 一块新的空间
那么这个时候我们开始设计增加联系人的功能
主要思路就是 如果联系人到了上线的话 那么realloc增容上线+2
另外 上线也加上2
代码表示如下
void addpeople(struct contact* pc)
{
if ((pc->sz)>=(pc->max))
{
pc=(struct address*)realloc(pc->date, (pc->max + 2)*sizeof(struct address));
printf("扩容成功\n");
pc->max += 2;
}
printf("请输入姓名\n");
scanf("%s", &(pc->date[pc->sz].name));
printf("请输入性别\n");
scanf("%s", &(pc->date[pc->sz].sex));
printf("请输入年龄\n");
scanf("%d", &(pc->date[pc->sz].age));
printf("请输入电话\n");
scanf("%s", &(pc->date[pc->sz].tel));
printf("请输入住址\n");
scanf("%s", &(pc->date[pc->sz].address));
printf("添加联系人完毕\n");
pc->sz++;
}
代码显示效果如下
三. 回收空间
其他要修改的地方只是一个回收动态开辟的空间 防止内存泄漏
void killpeople(struct contact* pc)
{
free(pc->date);
pc->date = NULL;
pc->max = 0;
pc->sz = 0;
}
代码很简单 只需要这样子就好啦
四. 所有代码文件
1. 头文件
#define _CRT_SECURE_NO_WARNINGS 1
#define max 3
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include <windows.h>
void menu();
void inicontact(struct contact * pc);
void addpeople(struct contact* pc);
void delpeople(struct contact* pc);
void srhpeople(struct contact* pc);
void revpeople(struct contact* pc);
void showpeople(struct contact* pc);
void sortpeople(struct contact* pc);
void killpeople(struct contact* pc);
int cmp(struct contact* pc);
struct address
{
char name[10];
char sex[5];
int age;
char tel[15];
char address[20];
};
struct contact
{
struct address *date;
int sz;
int max;
};
2. 主函数文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "address.h"
void menu()
{
printf("------------------------------------\n");
printf("--------请选择你要实现的功能--------\n");
printf("--------1.添加联系人信息------------\n");
printf("--------2.删除指定联系人信息--------\n");
printf("--------3.查找指定联系人信息--------\n");
printf("--------4.修改指定联系人信息--------\n");
printf("--------5.显示所有联系人信息--------\n");
printf("--------6.清空所有联系人------------\n");
printf("--------7.以名字排序所有联系人------\n");
}
// 初版初始化
//void inicontact(struct contact* pc)
//{
// pc->sz = 0;
// memset(pc->date, 0, 100*sizeof(struct address));
//}
//
void inicontact(struct contact* pc)
{
pc->sz = 0;
pc-> max = 3;
pc->date = (struct address*)calloc(3,sizeof(struct address));
}
// 初始版本的增加联系人
//void addpeople(struct contact* pc)
//{
// if (pc->sz==100)
// {
// printf("通讯录已满 无法继续添加");
// return 0;
// }
// printf("请输入姓名\n");
// scanf("%s", &(pc->date[pc->sz].name));
// printf("请输入性别\n");
// scanf("%s", &(pc->date[pc->sz].sex));
// printf("请输入年龄\n");
// scanf("%d", &(pc->date[pc->sz].age));
// printf("请输入电话\n");
// scanf("%s", &(pc->date[pc->sz].tel));
// printf("请输入住址\n");
// scanf("%s", &(pc->date[pc->sz].address));
// printf("添加联系人完毕\n");
// pc->sz++;
//}
void addpeople(struct contact* pc)
{
if ((pc->sz)>=(pc->max))
{
pc=(struct address*)realloc(pc->date, (pc->max + 2)*sizeof(struct address));
printf("扩容成功\n");
pc->max += 2;
}
printf("请输入姓名\n");
scanf("%s", &(pc->date[pc->sz].name));
printf("请输入性别\n");
scanf("%s", &(pc->date[pc->sz].sex));
printf("请输入年龄\n");
scanf("%d", &(pc->date[pc->sz].age));
printf("请输入电话\n");
scanf("%s", &(pc->date[pc->sz].tel));
printf("请输入住址\n");
scanf("%s", &(pc->date[pc->sz].address));
printf("添加联系人完毕\n");
pc->sz++;
}
void delpeople(struct contact* pc)
{
char name1[10];
int input1;
printf("请输入你要删除的联系人\n");
scanf("%s", &name1);
int i;
for ( i = 0; i <(pc->sz); i++)
{
if (strcmp(pc->date[i].name, name1) == 0)
{
printf("查到到联系人%s是否确认删除(1or0)\n", name1);
scanf("%d", &input1);
if (input1==1)
{
for (int j = i; j < ((pc->sz)-1); j++)
{
(pc->date[j]) = (pc->date[j + 1]);
pc->sz--;
}
printf("删除成功\n");
}
else
{
printf("成功取消\n");
}
}
}
if (i>=(pc->sz))
{
printf("联系人%s不存在\n", name1);
}
}
void srhpeople(struct contact* pc)
{
char name1[10];
printf("请输入你要查找的联系人\n");
scanf("%s", &name1);
int i;
for ( i = 0; i < (pc->sz); i++)
{
if (strcmp(pc->date[i].name, name1) == 0)
{
printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n",
"name", "sex", "age", "tel", "address");
printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n",
pc->date[i].name,
pc->date[i].sex,
pc->date[i].age,
pc->date[i].tel,
pc->date[i].address);
}
}
if (i > pc->sz)
{
printf("不存在此联系人%s\n", name1);
}
}
void revpeople(struct contact* pc)
{
char name1[10];
printf("请输入你要修改的联系人\n");
scanf("%s", &name1);
int i;
for ( i = 0; i < (pc->sz); i++)
{
if (strcmp(pc->date[i].name, name1) == 0)
{
printf("请输入姓名\n");
scanf("%s", &(pc->date[i].name));
printf("请输入性别\n");
scanf("%s", &(pc->date[i].sex));
printf("请输入年龄\n");
scanf("%d", &(pc->date[i].age));
printf("请输入电话\n");
scanf("%s", &(pc->date[i].tel));
printf("请输入住址\n");
scanf("%s", &(pc->date[i].address));
printf("修改联系人完毕\n");
}
}
if (i > pc->sz)
{
printf("不存在此联系人%s\n", name1);
}
}
void showpeople(struct contact* pc)
{
int i;
printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n",
"name", "sex", "age", "tel", "address");
for (i = 0; i < (pc->sz); i++)
{
printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n",
pc->date[i].name,
pc->date[i].sex,
pc->date[i].age,
pc->date[i].tel,
pc->date[i].address);
}
}
int cmp(void *e1,void *e2)
{
struct address* p1 = (struct address*)e1;
struct address* p2 = (struct address*)e2;
return strcmp(p1->name, p2->name);
}
void sortpeople(struct contact* pc)
{
qsort(pc, pc->sz, sizeof(struct address), cmp);
}
void killpeople(struct contact* pc)
{
free(pc->date);
pc->date = NULL;
pc->max = 0;
pc->sz = 0;
}
3. 测试文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "address.h"
int main()
{
struct contact c1;
inicontact(&c1);
int input=1;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
system("cls");
addpeople(&c1);
break;
case 2:
system("cls");
delpeople(&c1);
break;
case 3:
system("cls");
srhpeople(&c1);
break;
case 4:
system("cls");
revpeople(&c1);
break;
case 5:
system("cls");
showpeople(&c1);
break;
case 6:
system("cls");
inicontact(&c1);
break;
case 7:
system("cls");
sortpeople(&c1);
break;
case 0:
system("cls");
killpeople(&c1);
break;
default:
break;
}
}
while (input);
return 0;
}
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯