当前位置: 首页 > news >正文

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

文章目录

  • 概述
  • 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;
}

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 突破传统看车局限,3DCAT实时云渲染为东风日产奇骏赋能
  • Django 安装指南
  • ui自动化难点
  • UE5学习笔记9-创建一个小窗口提示人物是否和武器重叠
  • 【人工智能】Transformers之Pipeline(十):视频分类(video-classification)
  • C语言常用的数据结构
  • Python | Leetcode Python题解之第331题验证二叉树的前序序列化
  • PPPoE基础笔记
  • String 事务
  • 大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明
  • 安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现
  • redis面试(十五)公平锁队列重排
  • 封装clickHouse线程池与ibeetl解析SQL并对结果转进行转化
  • 监控电脑屏幕被拍照的原理是什么?如此有趣的电脑防偷窥知识,你一学就会!
  • MAC 终端上传文件到云服务器
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 0基础学习移动端适配
  • CSS中外联样式表代表的含义
  • exif信息对照
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaWeb(学习笔记二)
  • Meteor的表单提交:Form
  • 基于HAProxy的高性能缓存服务器nuster
  • 入口文件开始,分析Vue源码实现
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 译米田引理
  • 译有关态射的一切
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 容器镜像
  • #NOIP 2014# day.1 T2 联合权值
  • $forceUpdate()函数
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (31)对象的克隆
  • (4)logging(日志模块)
  • (55)MOS管专题--->(10)MOS管的封装
  • (day18) leetcode 204.计数质数
  • (Java入门)抽象类,接口,内部类
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)项目管理杂谈-我所期望的新人
  • (转载)Linux 多线程条件变量同步
  • .apk文件,IIS不支持下载解决
  • .form文件_SSM框架文件上传篇
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET开源快速、强大、免费的电子表格组件
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • /etc/skel 目录作用