C语言简单实现一个通讯录(数组/循环/指针/函数/结构体)

功能包括:  增、删、改、查、显示、排序

总共创建了三个文件:main.c 、 contact.c  、contact.h

  • 主函数main


引入头文件:使用 #define _CRT_SECURE_NO_WARNINGS 来禁用VS中一些安全相关的警告,然后引入自定义头文件 contact.h ,这个头文件可能包含了通讯录实现所需的结构体定义、函数声明等。
定义菜单函数: menu 函数负责在控制台打印出操作菜单,为用户提供了添加、删除、更新、查找、显示、排序和退出等功能选项。
主函数main实现:
变量声明与初始化:在 main 函数中,声明了一个整型变量 input 用于存储用户输入,同时创建了一个通讯录结构体变量 con ,并调用 initContact 函数对其进行初始化。
循环处理用户操作:使用 do - while 循环,不断显示菜单并获取用户输入。根据用户输入的选项,通过 switch 语句调用相应的功能函数,如添加联系人( AddContact )、删除联系人( DelContact )等。当用户选择0时,退出循环,程序结束。
功能函数调用:每个功能对应一个函数,这些函数在 contact.h 头文件中声明,具体实现可能在对应的源文件中。例如 AddContact 函数用于向通讯录中添加联系人信息, ShowContact 函数用于将通讯录中的联系人信息打印出来。

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
//删 改 查  三个都有查找的动作
//增删改查  通讯录
void menu(void)
{
	printf("*********************************\n");
	printf("*******1.Add      2.Delete*******\n");
	printf("*******3.Update   4.Find*********\n");
	printf("*******5.show     6.sort*********\n");
	printf("*********************************\n");
}
int main()
{
	
	int input = 0;
	//创建通讯录
	Contact con;
	//初始化通讯录
	initContact(&con); //初始化con

	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);//信息添加到con
			break;
		case 2:
			DelContact(&con);
			break;
		case 3:
			Modify_Contact(&con);
			break;
		case 4:
			SearchContact(&con);
			break;
		case 5:
			ShowContact(&con);//信息打印出来
			break;
		case 6:
			Sort(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}		
	} while (input);
	return 0;
}
  • 增、删、改、查、显示、排序实现

初始化通讯录: initContact 函数负责初始化通讯录,使用 assert 确保传入的指针有效,将通讯录中已存储的联系人数量 sz 设为0,并使用 memset 将存储联系人信息的数组 data 初始化为0。
添加联系人: AddContact 函数用于向通讯录添加联系人。首先检查通讯录是否已满,若未满则提示用户输入姓名、年龄、性别、地址和电话等信息,存入当前空闲位置,并将联系人数量 sz 加1。
显示联系人: ShowContact 函数以表格形式展示通讯录中所有联系人信息。通过 assert 保证传入指针有效,然后遍历联系人数组,按照指定格式输出每个联系人的各项信息。
查找联系人: find_Byname 函数根据姓名查找联系人,在联系人数组中逐个比较姓名,若找到匹配项则返回其在数组中的下标,否则返回-1。
删除联系人: DelContact 函数用于删除指定联系人。先检查通讯录是否为空,然后提示用户输入要删除的联系人姓名,调用 find_Byname 查找该联系人,若找到则将其后的联系人依次向前移动覆盖要删除的联系人,最后将联系人数量 sz 减1 。
查找联系人详情: SearchContact 函数根据用户输入的姓名查找并显示该联系人的详细信息。若未找到则提示用户。
修改联系人: Modify_Contact 函数根据用户输入的姓名查找要修改的联系人,若找到则提示用户重新输入各项信息,完成对该联系人信息的修改。
排序联系人: Sort 函数通过 qsort 对通讯录中的联系人按电话号码进行排序。 sort_by_tele 函数作为比较函数,用于 qsort 中比较两个联系人的电话号码,排序完成后重新打印通讯录内容。

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
//初始化通讯录
void initContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;//指向通讯录的成员
	//pc->data//初始化成我想要的内容
	memset(pc->data, 0, sizeof(pc->data));
}
//添加联系人
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == CONTACT_MAX)
	{
		printf("通讯录已满,无法添加");
		return;
	}
	//增加一个人的信息
	printf("请输入名字:->");
	scanf("%s",pc->data[pc->sz].name);//这里name是数组,不需要取地址
	printf("请输入年龄:->");
	scanf("%d", &pc->data[pc->sz].age);//变量   需要取地址
	printf("请输入性别:->");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:->");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:->");
	scanf("%s", pc->data[pc->sz].telep);

	pc->sz++;
}
void ShowContact(const Contact* ps)
{
	assert(ps);
	int i = 0;
	printf("%-10s\t%-10s\t%-10s\t%-20s\t%-10s\n",
		   "姓名", "年龄", "性别", "地址", "电话");
	for (i = 0; i < ps->sz; i++)
	{
		printf("%-10s\t%-10d\t%-10s\t%-20s\t%-10s\n",
			ps->data[i].name,
			ps->data[i].age,
			ps->data[i].sex,
			ps->data[i].addr,
			ps->data[i].telep);
	}
}

int find_Byname(const Contact* pc, char name[])
{
	assert(pc && name);
	int i = 0;
	int del = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//返回下标i
			break;//这里不能写return;
		}
	}
	return -1;
}
void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除");
		return;
	}
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);
	int pos = find_Byname(pc , name);
	if (-1 == pos)
	{
		printf("要删除的人不存在");
		return;
	}
	int i = 0;
	//删除
	for (i = pos; i < pc->sz-1; i++)
	{//↑//为什么ret为初始值?因为要删除下标的数据(也就是ret这个数据需要改动)
		pc->data[i] = pc->data[i + 1];
		
	}
	pc->sz--;
	printf("删除成功!\n");
}
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要查找的人名字:->");
	scanf("%s",name);
	//pc  把const数据赋非const数据 不安全,所以find_Byname函数参数也要加const↓
	int pos = find_Byname(pc, name);
	if (-1 == pos)
	{
		printf("要查找的人不存在");
		return;
	}
	//打印信息
	printf("%-10s\t%-10s\t%-10s\t%-20s\t%-12s\n",
		"姓名", "年龄", "性别", "地址", "电话");

	printf("%-10s\t%-10d\t%-10s\t%-20s\t%-12s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].addr,
			pc->data[pos].telep);

}
void Modify_Contact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字:>");
	scanf("%s", name);
	int pos = find_Byname(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在");
		return;
	}
	//pos  修改这个  “下标”的内容
	printf("请输入名字:->");
	scanf("%s", pc->data[pos].name);//这里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].telep);
	printf("修改完成!");

}
//--------------------------------
int sort_by_tele(const void* e1, const void* e2)
{
	return strcmp(((const PepIndfo*)e1)->telep , ((const PepIndfo*)e2)->telep);//字符串对比
}
void Sort(Contact* pc)
{
	assert(pc);
	int sz = pc->sz;
	qsort(pc->data, sz, sizeof(pc->data[0]), sort_by_tele);
	
	int i = 0;
	printf("%-10s\t%-10s\t%-10s\t%-20s\t%-10s\n",
		"姓名", "年龄", "性别", "地址", "电话");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-10d\t%-10s\t%-20s\t%-10s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].telep);
	}
	
}


  • 声明函数,定义结构体

宏定义:使用 #define 定义了一系列常量,如 CONTACT_MAX 表示通讯录最大容量, NAME_MAX 等用于限制联系人各项信息的最大长度,方便统一管理和修改。
结构体定义:
PepIndfo 结构体用于存储单个联系人的信息,包括姓名、年龄、性别、地址和电话号码,每个成员都有对应最大长度的字符数组或整型变量。
Contact 结构体包含一个 PepIndfo 类型的数组 data ,用于存储多个联系人信息,以及一个 int 类型的 sz ,记录当前已存储的联系人数量。
函数声明:剩下的就是函数声明。

#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

#define CONTACT_MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELEP_MAX 20

typedef struct PepIndfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char telep[TELEP_MAX];
}PepIndfo;
PepIndfo ad = { "dsd",23,"ds","dwe","efs" };
typedef struct Contact
{
	PepIndfo data[CONTACT_MAX];
	int sz;//已经存了几个人的信息
}Contact;

void initContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//显示联系人信息
void ShowContact(const Contact* ps);
//删除联系人
void DelContact(Contact* pc);
//查找联系人
void SearchContact(const Contact* pc);
//修改联系人
void Modify_Contact(Contact* pc);

void Sort(Contact* pc);
int sort_by_tele(const void* e1, const void* e2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天学习了么!?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值