c语言实现—动态通讯录

一.前言

      上次带大家认识了一下顺序表,其实我们可以在顺序表的基础上实现一个通讯录的小项目,通讯录的本质仍然是顺序表,所以如果下面的代码你有问题的话,先去看看我的上篇文章哦~。

 

 

通讯录的功能大家应该都知道吧,这次我们就要用C语言实现一个通讯录的基本功能:

  • 储存人的信息

其中每个人的信息包括:
名字 性别 年龄 地址 电话号码

  • 增加人的信息
  • 删除指定人的信息
  • 修改指定人的信息
  • 查找指定人的信息
  • 查看通讯录的信息

二.功能实现

1.通讯录信息格式的初始化 

#pragma once
//#include<stdio.h>
//#include"SeqList.h"
#define NAME_MAX 100
#define GENDER_MAX 12
#define TEL_MAX 12
#define ADDR_MAX 100
//通讯录数据类型
typedef struct PersonInfo
{char name[NAME_MAX];int age;char gender[GENDER_MAX];char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;struct SeqList;
typedef struct SeqList Contact;
//通讯录提供的操作//通讯录的初始化和销毁
void ContactInit(Contact*pcon);
void ContactDestory(Contact* pcon);//增删修查
void ContactAdd(Contact* pcon);
void ContactDel(Contact* pcon);
void ContactModify(Contact* pcon);
void ContactFind(Contact* pcon);
void ContactShow(Contact* pcon);

2.通讯录初始化

void ContactInit(Contact* pcon)
{SLInit(pcon);
}
//SLInit(pcon)函数的伪代码如下
void SLInit(SL* ps) {ps->arr = NULL;ps->size = ps->capacity = 0;
}

3.添加联系人

void ContactAdd(Contact* pcon)
{Info info;printf("请输入联系人姓名:\n");scanf("%s", info.name);printf("请输入联系人年龄:\n");scanf("%d", &info.age);printf("请输入联系人性别:\n");scanf("%s", info.gender);printf("请输入联系人电话:\n");scanf("%s", info.tel);printf("请输入联系人地址:\n");scanf("%s", info.addr);//保存数据到通讯录里(通讯录)SLPushBack(pcon,info);
}

4.删除联系人

void ContactDel(Contact* pcon)
{//删除之前先查找printf("请输入联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pcon,name);if (findIndex <0){printf("要删除的联系人不存在\n");return;}SLErase(pcon, findIndex);printf("联系人删除成功\n");}
//FindByName(pcon,name)函数的伪代码如下
int  FindByName(Contact*pcon,char name[])
{for (int i=0;i<pcon->size;i++){if (strcmp(pcon->arr[i].name, name) == 0){return i;}}return -1;
}

5.修改联系人信息

void ContactModify(Contact* pcon)
{printf("请输入联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pcon, name);if (findIndex < 0){printf("要修改的联系人不存在\n");return;}//找到了printf("请输入联系人姓名:\n");scanf("%s", pcon->arr[findIndex].name);printf("请输入联系人年龄:\n");scanf("%d", &pcon->arr[findIndex].age);printf("请输入联系人性别:\n");scanf("%s", pcon->arr[findIndex].gender);printf("请输入联系人电话:\n");scanf("%s", pcon->arr[findIndex].tel);printf("请输入联系人地址:\n");scanf("%s", pcon->arr[findIndex].addr);printf("联系人修改成功\n");}

6.查找联系人信息

void ContactFind(Contact*pcon)
{char name[NAME_MAX];printf("请输入要查找的联系人的姓名\n");scanf("%s",name);int findIndex = FindByName(pcon, name);if (findIndex < 0){printf("要查找的联系人不存在\n");return;}printf("%s %s %s %s %s\n","姓名","年龄","性别","电话","住址");printf("%s %d %s %s %s\n",pcon->arr[findIndex].name,pcon->arr[findIndex].age,pcon->arr[findIndex].gender,pcon->arr[findIndex].tel,pcon->arr[findIndex].addr);}

 7.打印通讯录信息

void ContactShow(Contact* pcon)
{printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "住址");for (int i = 0; i < pcon->size; i++){printf("%s %d %s %s %s\n",pcon->arr[i].name,pcon->arr[i].age,pcon->arr[i].gender,pcon->arr[i].tel,pcon->arr[i].addr);}
}

三.SeqList.h

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"//静态顺序表//#define N 100
//struct SeqList
//{
//	SLDataType a[N];
//	int size;
//};//动态顺序表//typedef int SLDataType;
typedef Info SLDataType;typedef struct SeqList
{SLDataType* arr; //存储数据的底层结构int capacity;    //记录顺序表的空间大小int size;        //记录顺序表当前有效的数据个数
}SL;//typedef struct SeqList SL;//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps); //保持接口一致性//顺序表的头部/尾部插入
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);//顺序表的头部/尾部删除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//指定位置之前插入数据
//删除指定位置数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType x);

四.SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
//初始化和销毁
void SLInit(SL* ps) {ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLCheckCapacity(SL* ps) {if (ps->size == ps->capacity) {int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));if (tmp == NULL) {perror("realloc fail!");exit(1);}//扩容成功ps->arr = tmp;ps->capacity = newCapacity;}
}//顺序表的头部/尾部插入
void SLPushBack(SL* ps, SLDataType x) {//断言--粗暴的解决方式//assert(ps != NULL);assert(ps);//if判断--温柔的解决方式//if (ps == NULL) {//	return;//}//空间不够,扩容SLCheckCapacity(ps);//空间足够,直接插入ps->arr[ps->size++] = x;//ps->size++;
}
void SLPushFront(SL* ps, SLDataType x) {assert(ps);//判断是否扩容SLCheckCapacity(ps);//旧数据往后挪动一位for (int i = ps->size; i > 0; i--) //i = 1{ps->arr[i] = ps->arr[i - 1]; //ps->arr[1] = ps->arr[0]}ps->arr[0] = x;ps->size++;
}//顺序表的头部/尾部删除
void SLPopBack(SL* ps) {assert(ps);assert(ps->size);//顺序表不为空//ps->arr[ps->size - 1] = -1;ps->size--;
}
void SLPopFront(SL* ps) {assert(ps);assert(ps->size);//不为空执行挪动操作for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);//pos及之后的数据往后挪动一位,pos空出来for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1]; //ps->arr[pos+1] = ps->arr[pos]}ps->arr[pos] = x;ps->size++;
}
//删除指定位置数据
void SLErase(SL* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);//pos以后的数据往前挪动一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->arr[i-2] = ps->arr[i-1];}ps->size--;
}
//查找x
//int SLFind(SL* ps, SLDataType x)
//{
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (ps->arr[i] == x)
//			return i;
//	}
//	return -1;
//}
void SLDestroy(SL* ps) {assert(ps);if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLPrint(SL* ps) {for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

五.Contact.h

#pragma once
//#include<stdio.h>
//#include"SeqList.h"
#define NAME_MAX 100
#define GENDER_MAX 12
#define TEL_MAX 12
#define ADDR_MAX 100
//通讯录数据类型
typedef struct PersonInfo
{char name[NAME_MAX];int age;char gender[GENDER_MAX];char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;struct SeqList;
typedef struct SeqList Contact;
//通讯录提供的操作//通讯录的初始化和销毁
void ContactInit(Contact*pcon);
void ContactDestory(Contact* pcon);//增删修查
void ContactAdd(Contact* pcon);
void ContactDel(Contact* pcon);
void ContactModify(Contact* pcon);
void ContactFind(Contact* pcon);
void ContactShow(Contact* pcon);

六.Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
#include"SeqList.h"
//通讯录的初始化和销毁
void ContactInit(Contact* pcon)
{SLInit(pcon);
}
void ContactDestory(Contact* pcon)
{SLDestroy(pcon);
}//增删修查
void ContactAdd(Contact* pcon)
{Info info;printf("请输入联系人姓名:\n");scanf("%s", info.name);printf("请输入联系人年龄:\n");scanf("%d", &info.age);printf("请输入联系人性别:\n");scanf("%s", info.gender);printf("请输入联系人电话:\n");scanf("%s", info.tel);printf("请输入联系人地址:\n");scanf("%s", info.addr);//保存数据到通讯录里(通讯录)SLPushBack(pcon,info);
}
int  FindByName(Contact*pcon,char name[])
{for (int i=0;i<pcon->size;i++){if (strcmp(pcon->arr[i].name, name) == 0){return i;}}return -1;
}
//void ContactFind(Contact* pcon)
//{
//
//}
void ContactDel(Contact* pcon)
{//删除之前先查找printf("请输入联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pcon,name);if (findIndex <0){printf("要删除的联系人不存在\n");return;}SLErase(pcon, findIndex);printf("联系人删除成功\n");}
void ContactModify(Contact* pcon)
{printf("请输入联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pcon, name);if (findIndex < 0){printf("要修改的联系人不存在\n");return;}//找到了printf("请输入联系人姓名:\n");scanf("%s", pcon->arr[findIndex].name);printf("请输入联系人年龄:\n");scanf("%d", &pcon->arr[findIndex].age);printf("请输入联系人性别:\n");scanf("%s", pcon->arr[findIndex].gender);printf("请输入联系人电话:\n");scanf("%s", pcon->arr[findIndex].tel);printf("请输入联系人地址:\n");scanf("%s", pcon->arr[findIndex].addr);printf("联系人修改成功\n");}void ContactShow(Contact* pcon)
{printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "住址");for (int i = 0; i < pcon->size; i++){printf("%s %d %s %s %s\n",pcon->arr[i].name,pcon->arr[i].age,pcon->arr[i].gender,pcon->arr[i].tel,pcon->arr[i].addr);}
}
void ContactFind(Contact*pcon)
{char name[NAME_MAX];printf("请输入要查找的联系人的姓名\n");scanf("%s",name);int findIndex = FindByName(pcon, name);if (findIndex < 0){printf("要查找的联系人不存在\n");return;}printf("%s %s %s %s %s\n","姓名","年龄","性别","电话","住址");printf("%s %d %s %s %s\n",pcon->arr[findIndex].name,pcon->arr[findIndex].age,pcon->arr[findIndex].gender,pcon->arr[findIndex].tel,pcon->arr[findIndex].addr);}

七.Contest.c

#define _CRT_SECURE_NO_WARNINGS 1
//#include"Contact.h"
#include"SeqList.h"
void menu()
{printf("*****************通讯录***************\n");printf("*******1.添加联系人  2.删除联系人*****\n");//ctrl+dprintf("*******3.修改联系人  4.查找联系人*****\n");//ctrl+dprintf("*******5.查看通讯录  0.  退 出  ******\n");//ctrl+dprintf("**************************************\n");
}
int main()
{int op = 0;//创建通讯录结构Contact con;ContactInit(&con);do{menu();printf("请输入需要的操作\n");scanf("%d",&op);switch (op){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("通讯录退出中\n");break;default:break;}} while (op);//销毁通讯录ContactDestory(&con);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chroot: failed to run command ‘/bin/bash’: No such file or directory

1. 问题描述及原因分析 在busybox的环境下&#xff0c;执行 cd rootfs chroot .报错如下&#xff1a; chroot: failed to run command ‘/bin/bash’: No such file or directory根据报错应该rootfs文件系统中缺少/bin/bash&#xff0c;进入查看确实默认是sh&#xff0c;换成…

【微信小程序】浮动按钮拖动功能

在开发过程中无意间想到了这个功能。一番查询之后找到这个功能相关的代码片段。拷贝过来之后各种报错&#xff0c;经过自己的整改以可以使用。 功能图片&#xff1a; 中间的微信按钮可以拖动 wxml&#xff1a;页面代码 <button catchtouchmove"buttonMove" cat…

五、Kotlin 函数进阶

1. 高阶函数 1.1 什么是高阶函数 以下 2 点至少满足其一的函数称为高阶函数&#xff1a; 形参列表中包含函数类型的参数 //参数 paramN 可以是&#xff1a;函数引用、函数类型变量、或 Lambda 表达式。 fun funName(param1: Type1, param2: Type2, ... , paramN: (p1: T1, p2…

2.数据结构 顺序表(自留笔记)

文章目录 一.静态顺序表&#xff1a;长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下&#xff1a;2.下面是写一段Print&#xff0c;打印数字看看&#xff1a;3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用&#xff1a;利用顺序表写一…

Linux:用户切换指令su

相关文章 Linux专栏https://blog.csdn.net/weixin_45791458/category_12234591.html su是一个常用的用户切换命令&#xff0c; 用于在不同的用户身份之间切换&#xff0c;下面是它的用法。 用法&#xff1a; su [-] [-lmpVh] [-s shell] [-c command] [-w list] [username] 选…

【网络协议测试】畸形数据包——圣诞树攻击(DOS攻击)

简介 TCP所有标志位被设置为1的数据包被称为圣诞树数据包&#xff08;XMas Tree packet&#xff09;&#xff0c;之所以叫这个名是因为这些标志位就像圣诞树上灯一样全部被点亮。 标志位介绍 TCP报文格式&#xff1a; 控制标志&#xff08;Control Bits&#xff09;共6个bi…

淘宝扭蛋机小程序:新时代的互动营销与娱乐体验

随着科技的快速发展&#xff0c;小程序已经成为人们日常生活中不可或缺的一部分。在众多的小程序中&#xff0c;淘宝扭蛋机小程序以其独特的互动性和趣味性&#xff0c;吸引了大量用户。本文将深入探讨淘宝扭蛋机小程序的特色、用户体验以及未来发展。 一、淘宝扭蛋机小程序的…

API网关-Apisix RPM包方式自动化安装配置教程

文章目录 前言一、简介1. etcd简介2. APISIX简介3. apisix-dashboard简介 二、Apisix安装教程1. 复制脚本2. 增加执行权限3. 执行脚本4. 浏览器访问5. 卸载Apisix 三、命令1. Apisix命令1.1 启动apisix服务1.2 停止apisix服务1.3 优雅地停止apisix服务1.4 重启apisix服务1.5 重…

jenkins发布失败

今天用jenkins发布项目时失败了&#xff0c;而前几天还好好的。 云控制台看了下&#xff0c;发现根本就没打包。 报错如下&#xff1a; 从控制台可以看出&#xff0c;项目依赖没有下载下来&#xff0c;所以打包失败了。 根本原因是&#xff1a;在配置中给yarn指定的淘宝仓库…

python爬虫采集下载中国知网《出版来源导航》论文文献下载_PDF文档_数据采集知网爬虫论文Python3

时隔一年&#xff0c;很久没更新博客了。今天给大家带来一个python3采集中国知网 &#xff1a;出版来源导航 这个是网址是中国知网的&#xff0c;以下代码仅限于此URL&#xff08;出版来源导航&#xff09;采集&#xff0c;知网的其他网页路径采集不一定行&#xff0c;大家可以…

活字格V9获取图片失败bug,报错404,了解存储路径,已改为批量上传和批量获取

项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 完成了批量上传功能&#xff0c;这插件真的很方便 于是写了个批量获取附件的js代码&#xff0c;我真厉害 项目场景&#xff1a; 活字格V9版本获取图片链接Upload 【9.0.103.0】图片上传的存储路…

操作系统(4)---虚拟机

虚拟机又叫虚拟机管理程序或者虚拟机监控程序&#xff08;Virtual Machine Monitor/Hypervisor&#xff0c;VMM&#xff09;&#xff0c;使用虚拟化技术&#xff0c;将一台物理机器虚拟化为多台虚拟机器 (Virtual Machine,VM)&#xff0c;每个虚拟机器都可以独立运行一个操作系…

C语言中各种类型指针所能访问的字节

其实学习语言的最简单的方法就是学习代码&#xff0c;所以下面来看一段代码就明白了&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int a 0x11223344;int* pa &a;char* pc &a;double* pd &a;printf("%p\n", …

数据结构——链式二叉树(2)

目录 &#x1f341;一、二叉树的销毁 &#x1f341;二、在二叉树中查找某个数&#xff0c;并返回该结点 &#x1f341;三、LeetCode——检查两棵二叉树是否相等 &#x1f315;&#xff08;一&#xff09;、题目链接&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&a…

【干货】【常用电子元器件介绍】【电阻】(二)--敏感电阻器

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。   电子电路中除了采用普通电阻器外&#xff0c;还有一些敏感电阻器&#xff08;如热敏电阻器、压敏电阻器、光敏电阻器等&#xff09;也被广泛地应用。然而…

C# 使用 SapNwRfc 调用SAP RFC

好久没写过相关代码&#xff0c;今天又来贡献一篇 C# 使用 SapNwRfc 调用SAP RFC。用VS2022的WINFORM应用程序&#xff0c;使用NuGet中的SapNwRfc类库&#xff0c;call SAP系统中的RFC&#xff0c;传入7个参数&#xff0c;得到RFC返回的2张表的数据。 一、VS2022中新建WINFORM…

Nodejs前端学习Day1_补档

我给day1搞没了&#xff0c;还是觉得该补一个&#xff0c;有用 文章目录 前言一、学习目标二、学习目录三、为什么JavaScript代码可以在浏览器中运行四、为什么JavaScript可以操作DOM和BOM五、浏览器中的JavaScript运行环境总结 前言 补档 一、学习目标 二、学习目录 三、为什…

RustDesk私有化部署,自建远程桌面搭建教程

以linux操作系统为例&#xff1a; 解压安装 # 使用wget进行下载1.1.8-2版本&#xff08;最新版本可以看上述发布地址&#xff09; wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-amd64.zip # 使用unzip解压 unzip rust…

Hive3.1.3基础

参考B站尚硅谷 目录 什么是HiveHive架构原理 Hive安装Hive安装地址Hive安装部署安装Hive启动并使用Hive MySQL安装安装MySQL配置MySQL 配置Hive元数据存储到MySQL配置元数据到MySQL Hive服务部署hiveserver2服务metastore服务编写Hive服务启动脚本&#xff08;了解&#xff09…

EventSource 长链接执行

EventSource 说明文档MDN 其他参考文档 一、利用node启服务 import fs from fs import express from express const app express() // eventSource 仅支持 get 方法 // 服务器端发送的数据必须是纯文本格式&#xff0c;不能是二进制数据。 app.get(/api, (req, res) > …