实现通讯录(顺序表版本)

一、功能要求

(1)⾄少能够存储100个⼈的通讯信息

(2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等

(3)增加联系⼈信息

(4)删除指定联系⼈

(5)查找制定联系⼈

(6)修改指定联系⼈

(7)显⽰联系⼈信息

二、代码实现

所需的头文件与源文件

SeqList.hSeqList.c  //顺序表实现contact.hcontact.c //通讯录实现test.c    //测试

SeqList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"contact.h"// 动态顺序表 -- 按需申请typedef PeoInfo SLDataType;
//动态顺序表
typedef struct SeqList
{SLDataType* arr;int size;     // 有效数据个数int capacity; // 空间容量
}SL;//初始化
void SLInit(SL* ps);
//销毁
void SLDestroy(SL* ps);
//打印
void SLPrint(SL ps);
//扩容
void SLCheckCapacity(SL* ps);//头部插入 / 尾部插入
void SLPushFront(SL* ps, SLDataType x);
void SLPushBack(SL* ps, SLDataType x);
//头部插删除 / 尾部删除
void SLPopFront(SL* ps);
void SLPopBack(SL* ps);//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType x);

SeqList.c

#include"SeqList.h"//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}//销毁
void SLDestroy(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}//扩容
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){//申请空间(增容用realloc)//要先判断capacity是否为零,如果为真默认给4个空间,如果为假直接乘2(三目操作符)int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = ps->arr = (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);//等价于assert(ps != NULL)//插入数据之前要看空间够不够SLCheckCapacity(ps);//ps->arr[ps->size] = x;//++ps->size;ps->arr[ps->size++] = x;//可以一步到位也可以分两步写
}//头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);//先让顺序表中已有的数据整体往后挪动一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}//打印
void SLPrint(SL ps)
{for (int i = 0; i < ps.size; i++){printf("%d ", ps.arr[i]);}printf("\n");
}//头删
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 SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//顺序表不为空--ps->size;
}//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//插入数据:空间够不够?SLCheckCapacity(ps);//让pos及以后的数据整体往后挪动一位for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//arr[pos+1] = arr[pos]}ps->arr[pos] = x;ps->size++;
}//删除指定位置的数据
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

contact.h

#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100//前置声明typedef struct SeqList contact;//用户数据
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];}PeoInfo;//初始化通讯录
void ContactInit(contact* con);//添加通讯录数据
void ContactAdd(contact* con);//删除通讯录数据
void ContactDel(contact* con);//展示通讯录数据
void ContactShow(contact* con);//查找通讯录数据
void ContactFind(contact* con);//修改通讯录数据
void ContactModify(contact* con);//销毁通讯录数据
void ContactDestroy(contact* con);

contact.c

#include"contact.h"
#include"SeqList.h"//初始化通讯录
void ContactInit(contact* con)
{//实际上就是顺序表的初始化//顺序表的初始化已经实现好了直接调用就行SLInit(con);
}//销毁通讯录数据
void ContactDestroy(contact* con)
{SLDestroy(con);}//添加通讯录数据
void ContactAdd(contact* con)
{//获取用户输入的内容:姓名 性别 年龄 电话 地址PeoInfo info;printf("请输入要添加的联系人姓名:\n");scanf("%s", info.name);printf("请输入要添加的联系人性别:\n");scanf("%s", info.sex);printf("请输入要添加的联系人年龄:\n");scanf("%d", &info.age);printf("请输入要添加的联系人电话:\n");scanf("%s", info.tel);printf("请输入要添加的联系人地址:\n");scanf("%s", info.addr);//往通讯录中添加联系人数据SLPushBack(con, info);
}int FindByName(contact* con,char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name)){//找到了return i;}}//没有找到return -1;
}//删除通讯录数据
void ContactDel(contact* con)
{//要删除的数据必须存在才可以删除//查找char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要删除的联系人数据不存在\n");return;}//要删除的联系人数据存在———>知道了要删除的联系人对应的下标SLErase(con, find);printf("删除成功\n");
}//展示通讯录数据
void ContactShow(contact* con)
{//表头:姓名 性别 年龄 电话 地址printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");//遍历通讯录,按照打印每个联系人数据for (int i = 0; i < con->size; i++){printf("%3s %2s %d %6s %s\n",con->arr[i].name,con->arr[i].sex,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}//修改通讯录数据
void ContactModify(contact* con)
{//要修改的联系人数据存在char name[NAME_MAX];printf("请输入要修改的用户姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要修改的联系人数据不存在\n");return;}//修改printf("请输入新的姓名\n");scanf("%s", con->arr[find].name);printf("请输入新的性别\n");scanf("%s", con->arr[find].sex);printf("请输入新的年龄\n");scanf("%d", &con->arr[find].age);printf("请输入新的电话\n");scanf("%s", con->arr[find].tel);printf("请输入新的地址\n");scanf("%s", con->arr[find].addr);printf("修改成功\n");
}//查找通讯录数据
void ContactFind(contact* con)
{char name[NAME_MAX];printf("请输入要查找的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的联系人数据不存在\n");return;}//再次打印表格printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %2s %d %6s %s\n",con->arr[find].name,con->arr[find].sex,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}

test.c

#include"SeqList.h"void menu()
{printf("****************通讯录***************\n");printf("*****1.增加联系人  2.删除联系人******\n");printf("*****3.修改联系人  4.查找联系人******\n");printf("*******5.展示联系人  0.    退出******\n");printf("*************************************\n");}int main()
{int op = -1;contact con;ContactInit(&con);do {menu();printf("请输入您的操作:\n");scanf("%d", &op);//根据不同的选择执行不同的操作switch (op){case 1:ContactAdd(&con);break;case 2:ContactAdd(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("退出通讯录...\n");break;default:printf("输入错误,请重新选择操作\n");break;}} while (op != 0);ContactDestroy(&con);return 0;
}

效果如图

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

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

相关文章

X年后,ChatGPT会替代底层程序员吗?

能不能替代&#xff0c;真的很难说&#xff0c;因为机器换掉人&#xff0c;这其实是一个伦理问题。 其实说白了&#xff0c;任何行业在未来都会被AI或多或少的冲击到&#xff0c;因为ChatGPT做为一个可以持续提升智能的AI&#xff0c;在某些方面的智能程度超过人类并不是什么难…

数据结构-基本概念

1.什么是数据结构&#xff1f; 数据 数据&#xff0c;是对客观事物的符号表示&#xff0c;在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 结构 &#xff08;1&#xff09;线性结构&#xff08;比如图书目录文件&#xff0c;一对一的关系&#x…

Unity Meta Quest MR 开发(五):空间锚点

文章目录 &#x1f4d5;教程说明 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 开发者社区&#xff0c;博主目前在内担任 XR 开发的讲师。该社区提供专人答疑、完整进阶教程、从零到一项目孵化保姆服务&…

文件及相关文件函数的使用

目录 前言 文件的概述 文件类型 如何用C语言来操作文件呢&#xff1f; 文件缓冲区 文件的打开与关闭 文件的打开——fopen&#xff08;&#xff09;函数 文件的关闭——fclose&#xff08;&#xff09;函数 文件结束检测——feof()函数 文件的顺序读写 文件字符输出函…

用虚拟机安装gnu radio

首先在虚拟机上安装的ubuntu18.04 按照Pluto SDR环境搭建libiio/GNU Radio/gr-iio&#xff08;Ubuntu&#xff09;-CSDN博客 依次安装libiio、libad9361-iio、gnuradio的3.8版本&#xff0c;以及对应的gr-iio 前面的依赖关系很重要 sudo apt-get install build-essential l…

kubernetes集群添加到jumpserver堡垒机里管理

第一步、在kubernetes集群中获取一个永久的token。 jumpserver堡垒机用api的来管理kubernetes&#xff0c;所以需要kubernetes的token&#xff0c;这个token还需要是一个永久的token&#xff0c;版本变更&#xff1a;Kubernetes 1.24基于安全方面的考虑&#xff08;特性门控Le…

JVM字节码与类的加载——class文件结构

文章目录 1、概述1.1、class文件的跨平台性1.2、编译器分类1.3、透过字节码指令看代码细节 2、虚拟机的基石&#xff1a;class文件2.1、字节码指令2.2、解读字节码方式 3、class文件结构3.1、魔数&#xff1a;class文件的标识3.2、class文件版本号3.3、常量池&#xff1a;存放所…

在 K8s 上跑腾讯云 Serverless 函数,打破传统方式造就新变革

目录 目录 前言 Serverless 和 K8s 的优势 1、关于Serverless 函数的特点 2、K8s 的特点 腾讯云 Serverless 函数在 K8s 上的应用对企业服务的影响 1、弹性扩展和高可用性 2、成本优化和资源利用 3、简化部署和管理 拓展&#xff1a;腾讯云云函数 SCF on K8s 番外篇…

HarmonyOS实战开发-如何实现蓝牙设备发现、配对、取消配对功能。

介绍 蓝牙技术是一种无线数据和语音通信开放的全球规范&#xff0c;它是基于低成本的近距离无线连接&#xff0c;为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。本示例通过ohos.bluetooth 接口实现蓝牙设备发现、配对、取消配对功能。实现效果如下&#xff1a…

PIL图像,NumPy ndarray,torch.Tensor。Tensor是什么

目录 PIL图像、NumPy ndarray和torch.Tensor PIL图像 NumPy ndarray torch.Tensor Tensor是什么

计算机网络 实验指导 实验9

实验9 三层交换机综合实验 1.实验拓扑图 名称相连的接口IP地址网关PC1F0/3172.1.1.2/28172.1.1.1/28PC2F0/4172.1.1.18/28172.1.1.17/28PC3F0/5172.1.1.34/28172.1.1.33/28PC4F0/3172.1.1.3/28172.1.1.1/28PC5F0/4172.1.1.19/28172.1.1.17/28PC6F0/5172.1.1.35/28172.1.1.33/2…

算法思想 - 贪心算法

贪心算法是一种常用的求解最优化问题的算法思想。它通过每一步的局部最优选择&#xff0c;希望最终达到全局最优解。 贪心算法的核心思想是在求解过程中做出当前情况下的最优选择&#xff0c;并相信这个选择对全局来说也是最优的。它不考虑子问题的解决过程&#xff0c;只关注…

ROS 2边学边练(16)-- 自定义msg和srv文件

前言 在前面的文章我们在学习主题&#xff08;topic&#xff09;和服务&#xff08;service&#xff09;通信方法时&#xff0c;使用的一直是ROS 2提供好的消息结构文件&#xff08;xxx.msg&#xff09;和服务结构文件&#xff08;xxx.srv&#xff09;&#xff0c;稀里糊涂的就…

【数据结构】1.时间和空间复杂度

目录 1.如何衡量一个算法的好坏 2.算法效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 3.3常见时间复杂度计算举例 4.空间复杂度 1.如何衡量一个算法的好坏 下面求斐波那契数列的算法是好还是不好&#xff0c;为什么&#xff1f;该如何衡量一个算法的好坏呢…

编程新手必看,学习python中列表数据类型内容(9)

Python中的列表是一种可变的、有序的数据结构&#xff0c;它允许存储不同类型的数据项&#xff0c;并支持多种操作。具体如下&#xff1a; 创建列表&#xff1a;可以通过一对方括号[]来创建一个空列表&#xff0c;或者在方括号内放入初始元素来创建一个非空列表。例如&#xff…

链表实验.

#include<stdio.h> #include<stdlib.h>// 定义单链表节点结构体 struct Node {int data;struct Node* next; };struct Node* initList() {struct Node* list (struct Node*)malloc(sizeof(struct Node));list->data 0;list->next NULL;return list; }void…

特征提取算法

特征提取算法 0. 写在前边1. Harris算法1.1 写在前面1.2 Harris算法的本质1.3 Harris算法的简化 2. Harris3D2.1 Harris3D算法问题定义2.2 Harris3D with intensity2.3 Harris3D without intensity 3. ISS特征点的应用 0. 写在前边 本篇将介绍几种特征提取算法&#xff0c;特征…

笔记 | 软件工程:需求分析

1 需求分析 #需求分析 1.1 需求分析概述 初步软件需求存在的问题&#xff1a;不具体&#xff0c;不清晰&#xff0c;关系不明朗&#xff0c;存在潜在缺陷&#xff0c;没有区分不同软件需求&#xff08;有必要鉴别不同软件需求项的重要性差别&#xff0c;区分不同软件需求的开…

【C语言】——指针八:指针运算笔试题解析

【C语言】——指针八&#xff1a;指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…

Python基于Tkinter的加法游戏

定制魏:QTWZPW,获取更多源码等 目录 题目概述 详细设计 函数设计 总体设计 重要代码