C语言实现动态版通讯录的示例代码

目录
  • 前言
  • contact.c
  • contact.h
  • test.c

前言

大家好~今天是通讯录的动态版本实现,希望对大家对知识的掌握有所提升!

contact.c

#include"contact.h"

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
	if (NULL == pc->data)
	{
		printf("InitContact: :%s\n", strerror(errno));
		return;
	}
	pc->capacity = DEFAULT_SZ;
}

static void CheckCapacity(Contact* pc)
{
	if (pc->capacity == pc->sz)
	{
		PeoInfo* prt = (PeoInfo*)realloc(pc->data, (pc->capacity + INCREASE_SZ) * sizeof(PeoInfo));
		if (NULL == prt)
		{
			printf("AddContact: :%s\n", strerror(errno));
			return;
		}
		else
		{
			pc->data = prt;
			pc->capacity += INCREASE_SZ;
			printf("增容成功\n");
		}
	}
}

//增加联系人信息
void AddContact(Contact* pc)
{
	assert(pc);

	CheckCapacity(pc);
	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].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("增加联系人信息成功\n");

}

void DestroyContact(Contact* pc)
{
	assert(pc);
	free(pc->data);
	pc->data = NULL;
}

//打印联系人信息
void PrintContact(Contact* pc)
{
	assert(pc);
	if (0 == pc->sz)
	{
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[i].name,
			pc->data[i].age, pc->data[i].sex,
			pc->data[i].tele, pc->data[i].addr);
	}
}

static int Find_By_NAME(const Contact* pc,char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

//删除联系人信息
void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除信息\n");
		return;
	}
	else
	{
		printf("请输入要删除联系人的姓名:>");
		scanf("%s", name);

		int pos = Find_By_NAME(pc, name);
		if (pos == -1)
		{
			printf("要删除的联系人不存在\n");
			return;
		}
		int i = 0;
		for (i = pos; i < (pc->sz - 1); i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除联系人信息成功\n");
	}

}

//查找联系人信息
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找联系人的姓名:>");
	scanf("%s", name);

	int pos = Find_By_NAME(pc, name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在\n");
		return;
	}

	printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[pos].name,
		pc->data[pos].age, pc->data[pos].sex,
		pc->data[pos].tele, pc->data[pos].addr);

}

//修改联系人信息
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改联系人的姓名:>");
	scanf("%s", name);

	int pos = Find_By_NAME(pc, name);
	if (pos == -1)
	{
		printf("要修改的联系人不存在\n");
		return;
	}
	else
	{
		printf("请输入修改后人员的名字:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入修改后人员的年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入修改后人员的性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入修改后人员的地址:>");
		scanf("%s", pc->data[pos].addr);
		printf("请输入修改后人员的电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("修改联系人员信息成功\n");
	}
}

//排序联系人信息
static int cmp_Per_by_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}

void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_Per_by_name);
	PrintContact(pc);
}

//清空联系人信息
void ClearContact(Contact* pc)
{
	assert(pc);
	InitContact(pc);
	printf("清空成功\n");
}

contact.h

#pragma once

//头文件的包含
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>

//定义结构体类型
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000
#define DEFAULT_SZ 3
#define INCREASE_SZ 2

//创建通讯录
typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

//动态版本
typedef struct Contact
{
	PeoInfo* data;//存放人的信息,维护通讯录的指针
	int sz;//记录通讯录中实际联系人的个数
	int capacity;//当前通讯录的容量
}Contact;

//初始化通讯录
void InitContact(Contact* pc);

//增加联系人信息
void AddContact(Contact* pc);

//打印联系人信息
void PrintContact(Contact* pc);

//删除联系人信息
void DelContact(Contact* pc);

//查找联系人信息
void SearchContact(const Contact* pc);

//修改联系人信息
void ModifyContact(Contact* pc);

//排序联系人信息
void SortContact(Contact* pc);

//清空联系人信息
void ClearContact(Contact* pc);

//释放通讯录动态内存
void DestroyContact(Contact* pc);

test.c

#include"contact.h"

menu()
{
	printf("********************************************\n");
	printf("*********   1.add       2.del      *********\n");
	printf("*********   3.search    4.modify   *********\n");
	printf("*********   5.sort      6.print    *********\n");
	printf("*********   7.clear     0.exit     *********\n");
	printf("********************************************\n");
}

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT,
	CLEAR
};

int main()
{

	int input = 0;

	//创建通讯录
	Contact Con;
	//初始化通讯录
	InitContact(&Con);

	do
	{
		menu();
		printf("请输入你的选项:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&Con);
			break;
		case DEL:
			DelContact(&Con);
			break;
		case SEARCH:
			SearchContact(&Con);
			break;
		case MODIFY:
			ModifyContact(&Con);
			break;
		case SORT:
			SortContact(&Con);
			break;
		case PRINT:
			PrintContact(&Con);
			break;
		case CLEAR:
			ClearContact(&Con);
			break;
		case EXIT:
			DestroyContact(&Con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);

	return 0;
}

以上就是C语言实现动态版通讯录的示例代码的详细内容,更多关于C语言动态通讯录的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言静态动态两版本通讯录实战源码

    目录 正片开始 静态版本 头文件( phonebook.h) 接口(test.c) 功能板块(phonebook.c) 1. 初始化: 2. 增添: 3.查找 4.删除 5.修改 6.排序 7.全览 静态版全部代码 test.c(接口) phonebook.h(头文件) phonebook.c(功能) 动态版 动态初始化: 扩容函数 动态版全部代码 test.c phonebook.h 正片开始 这里为了方便对照,我搬出整个程序的前后修改版本,并分别作为静态和动态版本,实际差距并不大,提供出来只

  • C语言模拟实现动态通讯录

    目录 1.模拟实现通讯录总体架构一览图 2.文件执行任务 3.分模块实现 测试模块 test.c 头文件 功能函数声明 contact.h 功能函数逐一实现 1.模拟实现通讯录总体架构一览图 2.文件执行任务 3.分模块实现 测试模块 test.c 1.为了更好地展示,制作一个菜单,在菜单中有 添加,删除,查找,修改,排序,清空,退出的选项. 2.因为起先要进入程序一趟,所以用do····while循环(输入选项来看具体操作,退出还是其他操作) #include "contact.h"

  • C语言实现可保存的动态通讯录的示例代码

    目录 一.Contact.h 二.Contact.c 1.判断是否增容 2.初始化通讯录 3.打印 4.增加联系人信息 5.通过名字查找 6.删除联系人信息 7.查找信息 8.修改信息 9.排序 10.清空通讯录 11.保存通讯录为文件 三.text.c 四.错误写法分享 五.动图展示 一.Contact.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <assert.h> #

  • C语言静态与动态通讯录的实现流程详解

    目录 静态通讯录 contact.h contact.c test.c 动态通讯录 contact.h contact.c qsort.c test.c 本次通讯录的代码已经放到我的Gitee仓库中,感兴趣的小伙伴可以去看看 Gitee 静态通讯录 在我们学习完C语言的结构体.指针以及动态内存管理之后,我们就可以实现一些有意思的小项目了,通过这些小项目可以加深我们对于相关知识的理解. 静态通讯录主要要求有 静态大小,可以记录10个人的信息(大小自己定) 记录的信息如下:名字.性别.年龄.电话.住

  • C语言实现通讯录的方法(包括静态版本和动态版本)

    目录 1.静态通讯录的实现 实现的方法: 2.动态通讯录的实现 实现的方法: 3.总结 1.静态通讯录的实现 实现的方法: 我们采用的方法就是工程形势,实现将功能和定义以及测试分成三个文件,其中定义放在.h文件,实现和测试放在.c文件当中. (1)contact.h文件的基本实现: #pragma once//防止头文件重复定义 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #defin

  • C语言实现可增容动态通讯录详细过程

    目录 创建可自动扩容的通讯录 添加用户信息 删除用户信息 查找联系人 修改用户信息 以名字将用户排序 销毁通讯录 创建可自动扩容的通讯录 这里我们想实现通讯录自动扩容,不够了能扩大内存,变得稍微有点智能,就不得不用到开辟内存的函数malloc和realloc,这两个函数又和free离不开关系 所以这里我给大家简单的介绍一下这三个库函数 malloc:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针 void *malloc( size_t size ); 如果开辟成功,则返回一个指

  • C语言实现动态版通讯录的示例代码

    目录 前言 contact.c contact.h test.c 前言 大家好~今天是通讯录的动态版本实现,希望对大家对知识的掌握有所提升! contact.c #include"contact.h" //初始化通讯录 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo)); if (NULL == pc-

  • C语言实现静态版通讯录的示例代码

    目录 前言 通讯录需求分析 功能介绍 实现思路 代码实现 test.c contact.c contact.h 效果图 前言 大家好~今天要实现一个非常有意思的东西–通讯录. 通讯录需求分析 为了实现通讯录管理系统,为此,要保证实现以下的功能: 能够存放1000个联系人的信息.每个人的信息包含:名字.年龄.性别.电话.地址.除此之外,还是实现:增加人的信息.删除人的信息.修改指定人的信息.查找指定人的信息.清空联系人的信息.显示联系人的信息.排序通讯录的信息. 功能介绍 1.增加联系人信息 2.

  • C语言实现可排序通讯录的示例代码

    目录 1.目的 2.分部流程 1.初始化通讯录 2.添加联系人 3.判断联系人是否存在 4.判断通讯录是否已满 5.判断通讯录是否为空 6.通讯录扩容 7.核心函数 8.查找联系人 9.修改联系人 10.清空通讯录 11.删除联系人 12.显示通讯录 13.比较联系人 14.通讯录排序 3.总代码展示 1.目的 写一个实用型通讯录,它有如下功能: 显示目录 void ShowMenu() { printf("#######################\n"); printf(&qu

  • C语言实现动态顺序表的示例代码

    目录 顺序表概念及结构 基本操作 功能实现 程序运行 顺序表概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 分类: 一般分为静态顺序表和动态顺序表: 静态顺序表:数组大小是固定的用完了无法增容:同时我们无法控制给数组开多少空间合适,开少了,空间不够:开多了,有回会存在空间浪费: 动态顺序表:空间是可以变动的,空间满了我们就增容:解决了静态顺序表的空间不足问题,同时也在一定程度上减少了空间浪费: 因此本篇博客主要实现

  • 基于C语言实现静态通讯录的示例代码

    目录 一.项目要求 二.Contact.h 三.Contact.c 1.静态函数 2.初始化通讯录 3.打印 4.增加联系人信息 5.通过名字查找 6.删除联系人信息 7.修改信息 8.排序通讯录 9.清空通讯录 四.text.c 五.动图展示 一.项目要求 实现一个通讯录 通讯录可以用来存储100个人的信息,每个人的信息包括:姓名.性别.年龄.电话.住址 提供方法: 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 清空所有联系人 以名字排序所有联

  • C语言实现线性动态(单向)链表的示例代码

    目录 什么是链表 为什么不用结构体数组 链表的操作 创建表 删除元素 插入元素 代码及运行结果 什么是链表 链表是数据结构里面的一种,线性链表是链表的一种,线性链表的延伸有双向链表和环形链表.在编程语言中优化数据结构可以在处理大数据时大大降低程序的空间复杂性和时间复杂性.这里我只用一个简单的例子——线性单向链表为例,说明C语言是如何实现该结构的. 链表的元素是由结构体来实现struct table *p.结构体中有一个成员是结构体指针struct table *next,而这个结构体指针的类型和

  • C语言实现通讯录的示例代码

    目录 一.Contact.h文件 二.Contact.c文件 三.test.c文件 一.Contact.h文件 包含函数的声明 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #define MAX 100 #define MAX_NAME 20 #defi

  • C语言实现静态版通讯录的代码分享

    目录 前言 通讯录设计的关键思想点分析 通讯录界面(meun)设计 增加信息功能实现代码 删除信息功能实现代码 查询信息功能实现代码 修改信息功能实现代码 按年龄升序排序信息功能实现代码 显示信息功能实现代码 通讯录完整代码 测试过程展示 前言 哈喽各位友友们,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!我仅已此文,手把手带领大家在学习C语言知识的同时,并实现一个静态版的通讯录!主要运用了结构体,一维数组,函数,分支与循环语句等等知识,以及分文件书写项目思想.都是精华内容,可不

  • C语言实现职工工资管理系统的示例代码

    目录 一.需求分析 二.项目环境 2.1.项目创建过程 2.2.向项目添加头文件与源文件 三.职工工资管理系统模块功能 3.1.系统总体设计框图 3.2.系统模块总体设计 3.3.设计系统菜单功能 3.4.设计系统输入模块 3.5.设计系统查询模块 3.6.设计系统修改模块 3.7.设计系统删除模块 3.8.设计系统统计模块 3.9.设计系统输出模块 3.10.设计系统追加模块 3.11.设计系统退出模块 总结 一.需求分析 1.随着计算机的飞速发展,它的应用已经十分广泛,它在人们的生产.生活.

随机推荐