数据结构系列-通讯录项目

  🌈个人主页: 会编辑的果子君

💫个人格言:“成为自己未来的主人~”  

 

#pragma once#define NAME_MAX 100
#define GENDER_MAX 10
#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 ContactDesTroy(Contact* pcon);
//增加,删除,修改,查找,查看通讯录
void ContactAdd(Contact* pcon);
void ContactDel(Contact* pcon);
void ContactModify(Contact* pcon);
void ContactFind(Contact* pcon);
void ContactShow(Contact* pcon);
#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
//初始化和销毁
void SLInit(SL* ps) {ps->arr = NULL;ps->capacity = ps->size = 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);SLCheckCapacity(ps);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 SLPopBack(SL* ps) {assert(ps);assert(ps->size);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] = 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->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->capacity = ps->size = 0;
}void SLPrint(SL* ps) {for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
#include"SeqList.h"//通讯录的初始化和销毁
void ContactInit(Contact* pcon) {SLInit(pcon);
}void ContactDesTroy(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 ContactDel(Contact* pcon) {//删除之前一定要先查找//找到了,可以删除//找不到,不可以删除printf("请输入要删除的联系人姓名:");char name[NAME_MAX];scanf("%s", name);int fineIndex = FindByName(pcon, name);if (fineIndex < 0) {printf("要删除的联系人不存在!");return;}//执行删除操作SLErase(pcon, fineIndex);printf("联系人删除成功!\n");
}void ContactModify(Contact* pcon) {//修改之前要先查找//找到了,执行修改操作//没有找到,不能执行修改操作char name[NAME_MAX];printf("请输入要修改的联系人姓名:");scanf("%s", name);int findIndex = FindByName(pcon, name);if (findIndex < 0) {printf("要修改的联系人不存在!\n");return;}//找到了,执行修改操作printf("请输入联系人姓名:\n");scanf("%s", pcon->arr[findIndex]);printf("请输入联系人年龄:\n");scanf("%s", pcon->arr[findIndex]);printf("请输入联系人性别:\n");scanf("%s", pcon->arr[findIndex]);printf("请输入联系人电话:\n");scanf("%s", pcon->arr[findIndex]);printf("请输入联系人住址:\n");scanf("%s", pcon->arr[findIndex]);printf("联系人修改成功!\n");
}void ContactShow(Contact* pcon) {printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < pcon->size; i++) {printf("%s %s %d %s %s\n",pcon->arr[i].name,pcon->arr[i].gender,pcon->arr[i].age,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 %s %d %s %s\n",pcon->arr[findIndex].name,pcon->arr[findIndex].gender,pcon->arr[findIndex].age,pcon->arr[findIndex].tel,pcon->arr[findIndex].addr);
}
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"//静态顺序表//typedef int SLDataType;
//#define N 100
//struct SeqList {
//
//	SLDataType a[N];
//	int size;
//};//动态顺序表typedef Info SLDataType;
typedef struct SeqList {SLDataType* arr;     //存储数据的底层int capacity;        //记录顺序表的空间int size;           //记录顺序表当前的有效空间
}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);
#define _CRT_SECURE_NO_WARNINGS
#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 = -1;//创建通讯录结构对象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 != 0);//销毁通讯录ContactDesTroy(&con);return 0;
}

 

 

 

 

 

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

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

相关文章

修改Qt生成iOS应用的原生底层,编译QtBase下的ios子模块

1.下载Qt源码 2.找到ios.pro子工程 3.使用QtCreaor12打开ios.pro工程 4.出现工程下只有一个.pro文件解决 复制修改好的toolchain.prf文件进行替换. 修改方法:

更改elementui的箭头图片以及位置

//更改箭头位置 .el-tree-node__content > .el-tree-node__expand-icon {position: absolute;right: 12px; }//更改箭头图片 .el-tree-node__expand-icon {transform: rotate(-90deg); } .el-tree-node__expand-icon.expanded {transform: rotate(0deg); } // 有子节点 且已…

协议-http协议-基础概念01-发展历程-http组成-http是什么-相关的应用-相关的协议

发展历程-http组成-http是什么-相关的应用-相关的协议 参考来源&#xff1a; 极客时间-透视HTTP协议(作者&#xff1a;罗剑锋)&#xff1b; 01-HTTP的发展历程 1989 年&#xff0c;任职于欧洲核子研究中心&#xff08;CERN&#xff09;的蒂姆伯纳斯 - 李&#xff08;Tim Ber…

【C++】类和对象之常引用与运算符重载

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 常引用3. 运算符重载 1. 前言 在之前的文章中提到了常引用&#xff0c;再来看运算符重载之前&#xff0c;先来看看常引用的使用。 2. 常引用 在使用引用的时候可…

TCP/IP-常用网络协议自定义结构体

1、TCP/IP模型&#xff1a; 2、TCP/IP- 各层级网络协议&#xff08;从下往上&#xff09;&#xff1a; 1&#xff09;数据链路层&#xff1a; ARP: 地址解析协议&#xff0c;用IP地址获取MAC地址的协议&#xff0c;通过ip的地址获取mac地 …

POST参数里加号+变成空格的问题处理

今天遇到个这样的问题&#xff0c;从前端传到后端的加密报文&#xff0c;里面包含了号&#xff0c;但在后端日志输出看出&#xff0c;变成空格。这个是由于经过RSA加密后引起的 解决办法&#xff1a; 1.前端转码&#xff1a;使用encodeURIComponent对参数进行转码 2.后端解码…

深入理解Lucene:开源全文搜索引擎的核心技术解析

欢迎关注微信公众号&#xff1a;一休哥助手。多种功能等待你的使用。1. 介绍 Lucene是什么&#xff1f; Lucene是一个开源的全文搜索引擎库&#xff0c;提供了强大的文本搜索和检索功能。它由Apache软件基金会维护和开发&#xff0c;采用Java语言编写&#xff0c;因其高性能、…

Docker(运维工具)—— 学习笔记

快速构建、运行、管理应用的工具 一、安装docker 参考Install Docker Engine on Ubuntu | Docker Docs 二、快速入门 1、镜像和容器 docker镜像可以做到忽略操作系统的差异&#xff0c;跨平台运行&#xff0c;忽略安装的差异 当我们利用Docker安装应用时&#xff0c;Dock…

如何使用Fastapi上传文件?先从请求体数据讲起

文章目录 1、请求体数据2、form表单数据3、小文件上传1.单文件上传2.多文件上传 4、大文件上传1.单文件上传2.多文件上传 1、请求体数据 前面我们讲到&#xff0c;get请求中&#xff0c;我们将请求数据放在url中&#xff0c;其实是非常不安全的&#xff0c;我们更愿意将请求数…

QML | JavaScript函数[自定义方法\导入JavaScript文件中的函数\关联信号和JavaScript 函数]

1、JavaScript函数 在前面的方法特性一节中已经讲解了函数的使用,这里再从JavaScript的角度讲解一些需要注意的方面。程序逻辑可以在JavaScript函数中进行定义。这些函数可以定义在QML文档里面(例如前面讲到的自定义方法),也可以定义在外部导人的JavaScript文件中。 (1)自…

拒绝机械风,让ChatGPT像真人一样对话!

拒绝机械风&#xff0c;让ChatGPT像真人一样对话 在这个信息爆炸的时代&#xff0c;人工智能技术的快速发展让我们的生活变得更加便捷。 特别是在自然语言处理领域&#xff0c;ChatGPT的出现无疑是一次革命性的进步。 然而&#xff0c;虽然ChatGPT在很多方面表现出了惊人的能…

学习笔记-李沐动手学深度学习(七)(19-21,卷积层、填充padding、步幅stride、多输入多输出通道)

总结 19-卷积层 【补充】看评论区建议的卷积动画视频 数学中的卷积 【链接】https://www.bilibili.com/video/BV1VV411478E/?fromsearch&seid1725700777641154181&vd_sourcee81e116c4ffe5e79d4bc44738263eda4 【可判断是否为卷积的典型标志】两个函数中自变量相加…