【初阶数据结构】通讯录项目(可用作课程设计)

文章目录

  • 概述
  • 1. 通讯录的效果
  • 2. SeqList.h
  • 3. Contact.h
  • 4. SeqList.c
  • 5. Contact.c
  • 6. test.c

概述

通讯录项目是基于顺序表这个数据结构来实现的。如果说数组是苍蝇小馆,顺序表是米其林的话,那么通讯录就是国宴。

换句话说,通讯录就是顺序表中存储结构体数据的。

那我在这里就给出所有的代码,具体细节这里就不再多说了,代码中都有注释。需要的可以自己复制粘贴。
哈哈

1. 通讯录的效果

添加数据
展示数据

修改数据
查找
删除数据
退出
至于功能6大家可以执行测试。

下面,我将分文件展示每个文件的所有代码,有需要的读者可以自行的拷贝。

文件

2. 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 SLPrint(SL s);//顺序表的初始化
void SLInit(SL* ps);//顺序表的销毁
void SLDestory(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);

3. Contact.h

#include<string.h>typedef struct PersonInfo
{char name[NAME_MAX]; //姓名char gender[GENDER_MAX]; //性别int age; //年龄char tel[TEL_MAX]; //电话char addr[ADDR_MAX]; //住址
}PeoInfo;//核心:要用到顺序表的相关的方法,对通讯录的操作实际上就是对顺序表的操作
// 为了方便后面的操作,我们给顺序表起个别名为contact
//前置声明
//typedef SL contact;//这样写看似没有什么问题,但是你并编译之后就会发现一堆的报错
//原因在于,此操作为前置声明,就是在还未定义该结构之前,但是我要提前使用该声明就可以使用。
//适用场景为:多文件编写,头文件之间包含关系。
typedef struct SeqList contact;//初始化通讯录
void InitContact(contact* con);
//添加通讯录数据
void AddContact(contact* con);
//删除通讯录数据
void DelContact(contact* con);
//展⽰通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact* con);
//销毁通讯录数据
void DestroyContact(contact* con);
//保存通讯录数据到文件中
void SaveContact(contact* con);

4. SeqList.c

#define _CRT_SECURE_NO_WARNINGS	
#include"SeqList.h"void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLDestory(SL* ps)
{if (ps->arr) //相当于ps->arr != NULL{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}//void SLPrint(SL s)
//{
//	int i = 0;
//	for (i = 0; i < s.size; i++)
//	{
//		printf("%d ",s.arr[i]);
//	}
//	printf("\n");
//}void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){//空间不够用,扩容SL* tmp = NULL;int newscapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;tmp = (SL*)realloc(ps->arr, newscapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");exit(EXIT_FAILURE);}//扩容成功ps->arr = tmp;ps->capacity = newscapacity;}
}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);//第一步:要把所有的数据都往后挪动一位int i = 0;for (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 -> arr);//这里通过ps->size的关系就可以直接控制,不再访问这个数据,也就是删除了ps->size--;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->arr);int i = 0;//用后一个数据覆盖前一个数据,从第一个数据开始for (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);SLCheckCapacity(ps);int i = 0;for (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(ps->arr);int i = 0;for (i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

5. Contact.c

#define _CRT_SECURE_NO_WARNINGS	
#include"SeqList.h"
#include"Contact.h"void InitContact(contact* con)
{SLInit(con);
}void AddContact(contact* con) //尾插
{assert(con);PeoInfo pefo;printf("请输入姓名:\n");scanf("%s",pefo.name);printf("请输入性别:\n");scanf("%s", pefo.gender);printf("请输入年龄:\n");scanf("%d", &pefo.age);printf("请输入电话:\n");scanf("%s", pefo.tel);printf("请输入住址:\n");scanf("%s", pefo.addr);//复用顺序表的方法SLPushBack(con,pefo);printf("数据已经成功添加!\n");
}int Find(contact* con,PeoInfo pefo)
{int i = 0;for (i = 0; i < con->size; i++){if (!strcmp(con->arr[i].tel, pefo.tel)){return i;}}return -1;
}void DelContact(contact* con)
{assert(con);PeoInfo pefo;printf("请输入想要删除联系人的电话:\n");scanf("%s",pefo.tel);int find = Find(con, pefo);if (find < 0){//没有找到printf("要删除的数据已经不存在\n");return;}//找到了SLErase(con,find);printf("数据已经删除\n");
}void ShowContact(contact* con)
{printf("姓名\t性别\t年龄\t电话\t住址\n");for (int i = 0; i < con->size; i++){printf("%s\t", con->arr[i].name); //姓名printf("%s\t", con->arr[i].gender); //性别printf("%d\t", con->arr[i].age); //年龄printf("%s\t", con->arr[i].tel); //电话printf("%s\t", con->arr[i].addr); //住址printf("\n");}}void FindContact(contact* con)
{PeoInfo pefo;printf("请输入要查找通讯人的电话:\n");scanf("%s",pefo.tel);int find = Find(con, pefo);if (find < 0){printf("要查找的联系人数据不存在\n");return;}//找到了printf("姓名\t性别\t年龄\t电话\t住址\n");printf("%s\t", con->arr[find].name); //姓名printf("%s\t", con->arr[find].gender); //性别printf("%d\t", con->arr[find].age); //年龄printf("%s\t", con->arr[find].tel); //电话printf("%s\t", con->arr[find].addr); //住址printf("\n");}void ModifyContact(contact* con)
{assert(con);PeoInfo pefo;printf("请输入要修改联系人的姓名:\n");scanf("%s",pefo.name);int i = 0;for (i = 0; i < con->size; i++){if (!strcmp(con->arr[i].name, pefo.name)){//匹配printf("请输入姓名:\n");scanf("%s", con->arr[i].name);printf("请输入性别:\n");scanf("%s", con->arr[i].gender);printf("请输入年龄:\n");scanf("%d", &con->arr[i].age);printf("请输入电话:\n");scanf("%s", con->arr[i].tel);printf("请输入住址:\n");scanf("%s", con->arr[i].addr);break;}}if (i == con->size){printf("被修改的数据不存在\n");}}void DestroyContact(contact* con)
{assert(con);SLDestory(&con);
}void SaveContact(contact* con)
{assert(con);int i = 0;//打开文件FILE* fp = fopen("contact.txt","w");if (fp == NULL){perror("fopen fail");exit(1);}//写文件fprintf(fp,"姓名\t性别\t年龄\t电话\t住址\n");for (i = 0; i < con->size; i++){fprintf(fp,"%s\t%s\t%d\t%s\t%s\n",con->arr[i].name,con->arr[i].gender, con->arr[i].age, con->arr[i].tel, con->arr[i].addr );}printf("数据已经安全存储\n");//关闭文件fclose(fp);fp = NULL;
}

6. test.c

#include"SeqList.h"
void meun()
{printf("*********************************************\n");printf("****************   通讯录   *****************\n");printf("******* 1.添加联系人   2.删除联系人 *********\n");printf("******* 3.修改联系人   4.查找联系人 *********\n");printf("******* 5.展示通讯录   6.保存数据   *********\n");printf("*******           0.退出            *********\n");printf("*********************************************\n");}int main()
{int input = 0;contact con;InitContact(&con);do {meun();printf("请输入你的操作:\n");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:ModifyContact(&con);break;case 4:FindContact(&con);break;case 5:ShowContact(&con);break;case 6:SaveContact(&con);break;case 0:printf("程序已安全退出!\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

以上就是本次通讯录的全部代码了,如果又不理解的地方,可以在评论区提问。

最后,觉得本文写的不错的话,别忘了给偶点赞哦!
哈哈

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

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

相关文章

个人可识别信息(PII) AI 去除 API 数据接口

个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息&#xff08;PII&#xff09; 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 /…

【剑指 offer】镜像二叉树

目 录 描述&#xff1a; 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像 思路&#xff1a; 仔细观察可以发现&#xff0c;所谓的二叉树镜像本质是自顶向下(or自底向上)进行左右子树交换的过程 public class Solution {public void Mirror(TreeNode root) {if(root nu…

音视频开发继续学习

RGA模块 RGA模块定义 RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。比方说&#xff1a;要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频&#xff0c;此时就要用到RGA模块了。 RGA模块结构体定义 RGA区域属性结构体 imgType&am…

LeetCode-3148. 矩阵中的最大得分

本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教. 1.题干 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&…

提高办公效率,四款语音转文字工具推荐!

无论是在会议记录、采访速记还是日常笔记中&#xff0c;语音转文字技术都展现出了其独特的价值。接下来是就为大家推荐几款市面上广受好评的语音转文字工具&#xff01; 365在线转文字 链接&#xff1a;https://www.pdf365.cn/ 365在线转文字是一款非常实用的在线语音转文字…

【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例

这两天在做那个CodeMonky的胡闹厨房的案例&#xff0c;一直困扰我的是关于Lobby和Relay的相关网络服务&#xff0c;需要挂加速器并且延迟不低&#xff0c;所以我一直在寻找一些其他替代方案&#xff0c;想起来之前做一个UEC的网络枪战时做过一个内网穿透的方法&#xff0c;所以…

机械行业数字化生产供应链产品解决方案(十二)

我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术&#xff0c;打造了一套智能化的生产和供应链管理系统&#xff0c;实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析&#xff0c;优化生产计划和资源配置&#…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第二篇:项目登录功能的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

怎么等比例调整图片尺寸大小?调整图片尺寸的8个方法

在数字时代&#xff0c;图片已成为我们日常生活与工作中不可或缺的一部分。从社交媒体分享到专业设计项目&#xff0c;图片的质量和外观直接影响着信息的传达与接收。因此&#xff0c;在处理图片时&#xff0c;保持其原始的纵横比&#xff0c;即等比例调整图片尺寸&#xff0c;…

梅丽尔·斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越”

梅丽尔斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越” 2024-08-14 20:38 发布于&#xff1a;河北省 该中心将为美国演员工会和美国电视广播艺人协会的艺术家提供资源和机会&#xff0c;而且全部免费 同时命名的还有汤姆汉克斯和丽塔威尔逊放映室、妮可…

PHP 无参数RCE总结

在这篇文章中&#xff0c;我总结了在参与CTF比赛过程中积累的关于PHP无参数远程代码执行&#xff08;RCE&#xff09;的经验。由于一直以来时间有限&#xff0c;今天终于有机会整理这些知识点。 可能用到的函数&#xff08;PHP的内置函数&#xff09; localeconv() 函数返回一…

安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统是由安美世纪(北京)科技有限公司开发的一套专为酒店设计的宽带管理系统。该系统旨在提升酒店宽带服务的运营效率和安全性&#xff0c;为酒店客人提供稳定、高速、便捷的上网体验。 0x02 漏洞概述 安美数字酒店宽带运营系统 weather.php …

Ansible自动化运维中剧本角色(roles)来完成apache服务操作

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; Ansible…

Kafka服务端日志详解

文章目录 服务端日志Topic消息存储方式主体介绍log文件追加记录消息index和timeindex索引文件 日志文件清理Kafka的文件高效读写机制Kafka的文件结构顺序写磁盘零拷贝 合理配置刷盘频率客户端消费进度管理 服务端日志 Kafka的日志信息是通过conf/server.properties文件中的log…

互联网红利消退,AI 大模型接棒新红利

在科技发展的浪潮中&#xff0c;互联网曾经是推动经济增长和社会变革的强大引擎&#xff0c;为无数企业和个人带来了巨大的红利。然而&#xff0c;随着时间的推移&#xff0c;互联网红利似乎正在逐渐消退&#xff0c;而与此同时&#xff0c;AI 大模型正以其强大的创新能力和广泛…

搜索旋转排序数组

搜索旋转排序数组 没思路。 看了下全网的思路,一个个来o&#xff0c;多做点题就知道了二分不仅仅只能用在有序的数组中。 这道题很关键的一个值就是nums[0]。 法一&#xff1a;先用二分找到旋转点&#xff0c;旋转点两边都是的&#xff0c;判断要搜索的值在哪边&#xff0c;…

玩转haproxy --花十分钟看看,全是干货

Haproxy是一款开源集群软件&#xff08;在上一篇文章中提到过集群的相关知识&#xff0c;往期点击http://t.csdnimg.cn/qWtQG&#xff09;是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的&#xff0c;是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 …

Linux Day1 系统编程和文件操作

系统编程内容 文件I/O (输入/输出): 1&#xff09;使用标准库函数如fopen, fclose, fread, fwrite, fgetc, fputc, fgets, fprintf, fscanf等进行文件操作。 2&#xff09;使用open, close, read, write等系统调用来实现底层文件操作。 进程管理: 1&#xff09;使用fork, e…

安卓用户专属福利:OfficeSuite中文高级版,让你的工作更轻松!

OfficeSuite – 世界顶级移动办公软件&#xff01;Google Play商店下载最多的办公软件应用&#xff0c;迄今为止&#xff0c;智能手机平台上&#xff0c;功能最强大、兼容性最好的移动Office办公套件。创建&#xff0c;查看和编辑Word&#xff0c;Excel和PowerPoint文档&#x…

ThinkPHP5漏洞分析之代码执行

漏洞概要 本次漏洞存在于 ThinkPHP 的缓存类中。该类会将缓存数据通过序列化的方式&#xff0c;直接存储在 .php 文件中&#xff0c;攻击者通过精心构造的 payload &#xff0c;即可将 webshell 写入缓存文件。缓存文件的名字和目录均可预测出来&#xff0c;一旦缓存目录可访问…