当前位置: 首页 > news >正文

通讯录的动态版本

通讯录的动态版本

  • 一. 增加需求
  • 二. 动手实施
  • 三. 回收空间
  • 四. 所有代码文件
    • 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;
}

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯

相关文章:

  • Docker搭建Kafka集群
  • WPS增加正则处理函数,简直如虎添翼
  • opencloudos容器镜像优化
  • 二.go语言条件与循环
  • 高阶函数1
  • 电子信息考研择校
  • 互联网数据管理平台
  • 本科行政管理毕业论文什么题目好写点?
  • kmp の 笔记
  • 最新网站证书提示风险的原因和几个解决方法
  • lambda表达式(C++11)
  • java计算机毕业设计图书共享系统源代码+数据库+系统+lw文档
  • 用Python生成Hilbert矩阵
  • 云计算与云原生
  • JBoss安装并部署war包
  • python3.6+scrapy+mysql 爬虫实战
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • DataBase in Android
  • ES6系统学习----从Apollo Client看解构赋值
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP 的 SAPI 是个什么东西
  • Python爬虫--- 1.3 BS4库的解析器
  • python学习笔记 - ThreadLocal
  • Zepto.js源码学习之二
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于使用markdown的方法(引自CSDN教程)
  • 普通函数和构造函数的区别
  • 前言-如何学习区块链
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 世界上最简单的无等待算法(getAndIncrement)
  • 微服务框架lagom
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ###C语言程序设计-----C语言学习(3)#
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (3)llvm ir转换过程
  • (a /b)*c的值
  • (Matlab)使用竞争神经网络实现数据聚类
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)一些感悟
  • .Net - 类的介绍
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Micro Framework初体验
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net 中viewstate的原理和使用
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .net下的富文本编辑器FCKeditor的配置方法
  • ::before和::after 常见的用法