C语言笔记26 •顺序表应用•

基于动态顺序表实现通讯录项目

1.通讯录其实也就是顺序表,就是把里面存的数据类型变了一下 ,所以有一些方法对于顺序表适用,对于通讯录也是适用的(初始化,销毁,内存空间扩容)。

2.要用到顺序表相关的方法,对通讯录的操作实际就是对顺序表进行操作。所以实现的过程中需要调用顺序表的头文件和实现文件。

3.顺序表的介绍可以看上篇博客:C语言笔记25 •顺序表介绍•-CSDN博客

4.实现通讯录这个项目也是创建三个文件:                                                                                         

通讯录的头文件:Contact.h

通讯录的实现文件:Contact.c

通讯录的测试文件:Contact_test.c

顺序表头文件:SeqList.h    

顺序表实现文件:SeqList.c

5.具体看以下代码:

//Contact.h#pragma once
//定义联系人信息所需要的宏
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100//定义联系人的 数据结构
//姓名 性别 年龄 电话 住址
typedef struct personInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}peoInfo;   //重定义结构体//typedef struct personInfo peoInfo; //重定义结构体typedef struct SeqList Contact;//前置声明  不能typedef SL Contact;其一是SL也是顺序表重定义的名称,其二这样需要加载头文件SeqList.h (SeqList.h也调用了Contact.h)这两个头文件相互调用会矛盾 ,解决方法就是“前置声明”void ContactInit(Contact* con);//通讯录初始化void ContactDesTroy(Contact* con);//通讯录销毁void ContactAdd(Contact* con);//通讯录添加数据void ContactDel(Contact* con);//通讯录删除数据void ContactModify(Contact* con);//通讯录的修改void ContactFind(Contact* con);//通讯录查找void ContactShow(Contact* con);//展示通讯录数据

//Contact.c#define _CRT_SECURE_NO_WARNINGS 1
#include <string.h>
#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.gender);printf("请输入要添加联系人的年龄\n");scanf("%d", &info.age);printf("请输入要添加联系人的电话\n");scanf("%s", info.tel);printf("请输入要添加联系人的地址\n");scanf("%s", info.addr);//往通讯录中添加联系人数据SLPushback(con, info);
}
void ContactShow(Contact* con)//展示通讯录数据
{printf("姓名 性别 年龄 电话 地址\n");for (int i = 0; i < con->size; i++){printf("%3s %4s %5d %5s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}
int findperson(Contact* con, char name[])
{for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0){return i;}}return -1;
}
void ContactDel(Contact* con)//通讯录删除数据
{char name[NAME_MAX];printf("请输入你要删除联系人的姓名\n");scanf("%s", name);if (findperson(con, name) >= 0){SLErase(con, findperson(con, name));printf("删除成功\n");ContactShow(con);}else{printf("对不起,删除失败,通讯录中不存在该联系人\n");}
}void ContactModify(Contact* con)//通讯录的修改
{//检查修改的联系人数据是否存在char name[NAME_MAX];printf("请输入要修改的用户姓名:\n");scanf("%s", name);int find = findperson(con, name);if (find < 0){printf("要修改的联系人数据不存在!\n");return;}//修改的联系人数据存在,直接修改printf("请输入要修改联系人的姓名\n");scanf("%s", con->arr[find].name);printf("请输入要修改联系人的性别\n");scanf("%s", con->arr[find].gender);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");ContactShow(con);
}
void ContactFind(Contact* con)//通讯录查找
{//检查修改的联系人数据是否存在char name[NAME_MAX];printf("请输入要查找的用户姓名:\n");scanf("%s", name);int find = findperson(con, name);if (find < 0){printf("要查找的联系人数据不存在!\n");return;}//存在printf("姓名 性别 年龄 电话 地址\n");printf("%3s %4s %5d %5s %4s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}
//SeqList.h    #pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include"Contact.h"//typedef int SLDataType;//顺序表中数据的类型
typedef peoInfo SLDataType;//通讯录中自定义的 数据类型  要包含定义peoInfo的头文件 不然会报错找不到自定义的数据类型typedef struct SeqList
{SLDataType* arr;int size;int capacity;}SL;
//typedef struct SeqList SL;//顺序表初始化
void SLInit(SL* ps);
//顺序表销毁
void SLDestroy(SL* ps);//数据打印
void SLprint(SL sl);//插入数据之前先看空间够不够
void SLCheckCapacity(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 = 0;ps->capacity = 0;
}
//顺序表销毁
void SLDestroy(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}//插入数据之前先看空间够不够
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size)//空间不够了  需要申请内存{int Newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* temp = realloc(ps->arr, Newcapacity * sizeof(SLDataType));if (temp == NULL){perror("realloc");exit(1);//return 1;}ps->arr = temp;//内存申请成功ps->capacity = Newcapacity;}
}
//数据打印
//void SLprint(SL sl)
//{
//	for (int i = 0; i < sl.size; i++)
//	{
//		printf("%d ", sl.arr[i]);
//	}
//	printf("\n");
//}
//尾部插入
void SLPushback(SL* ps, SLDataType x)
{assert(ps);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];//arr[1]=arr[0]}ps->arr[0] = x;ps->size++;//长度+1
}//尾部删除
void SLPopBack(SL* ps)
{assert(ps);ps->size--;//--ps->size
}
//头部删除
void SLPopFront(SL* ps)
{assert(ps);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);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);for (int i = pos; i< ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}
//查找
//int SLFind(SL* ps, SLDataType x)
//{
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (ps->arr[i] == x)
//		{
//			//printf("找到了!\n");
//			return i;//找到了
//		}
//	}
//	return -1;//找不到
//	//printf("找不到您所要查找的数据!\n");
//}

//Contact_test.c#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
#include "SeqList.h"void contact_test()
{Contact con;//创建的通讯录对象  实际上就是 顺序表对象,等价于SL slContactInit(&con);//顺序表初始化ContactAdd(&con);// 往通讯录中添加联系人数据ContactAdd(&con);// 往通讯录中再次添加联系人数据//ContactShow(&con);//展示通讯录数据//ContactDel(&con);//通讯录删除数据//ContactModify(&con);//通讯录修改数据ContactFind(&con);//通讯录查找联系人ContactDesTroy(&con);//顺序表销毁
}void menu()
{printf("******************通讯录******************\n");printf("*******1.增加联系人   2.删除联系人********\n");printf("*******3.修改联系人   4.查找联系人********\n");printf("*******5.展示联系人   0.   退出  *********\n");printf("******************************************\n");
}
int main()
{Contact con;ContactInit(&con);//contact_test();int input = 1;do{menu();printf("请输入您要进行的项目:\n");scanf("%d", &input);switch (input){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:printf("输入错误,请重新选择您的操作!\n");break;}} while (input);ContactDesTroy(&con);//顺序表销毁return 0;
}

6.运行界面: 

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

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

相关文章

【设计模式】行为型-策略模式

策略模式&#xff0c;如春风吹过&#xff0c;随心所欲&#xff0c;变幻无穷&#xff0c;每一丝风都是一种选择。 文章目录 一、订单处理二、策略模式三、策略模式的核心组成四、运用策略模式五、策略模式的应用场景六、小结推荐阅读 一、订单处理 场景假设&#xff1a;有一个…

MySQL高级-索引-设计原则小结

文章目录 1、设计原则2、索引小结2.1、索引概述2.2、索引结构2.3、索引分类2.4、索引语法2.5、SQL性能分析2.6、索引使用2.7、索引设计原则 1、设计原则 针对于数据量较大&#xff0c;且查询比较频繁的表建立索引。针对于常作为查询条件&#xff08;where&#xff09;、排序&am…

2毛钱的SOT23-5封装28V、1.5A、1.2MHz DCDC转换器用于LCD偏置电源和白光LED驱动等MT3540升压芯片

前言 之前发了一个TI的BOOST升压芯片&#xff0c;用于LCD偏置电压或LED驱动&#xff0c;请访问以下链接。 6毛钱SOT-23封装28V、400mA 开关升压转换器&#xff0c;LCD偏置电源和白光LED应用芯片TPS61040 国产半导体厂家发展迅猛&#xff0c;今天推荐一个公司带“航天”的升压…

Java基础知识整理笔记

目录 1.关于Java概念 1.1 谈谈对Java的理解&#xff1f; 1.2 Java的基础数据类型&#xff1f; 1.3 关于面向对象的设计理解 1.3.1 面向对象的特性有哪些&#xff1f; 1.3.2 重写和重载的区别&#xff1f; 1.3.3 面向对象的设计原则是什么&#xff1f; 1.4 关于变量与方…

搭建 MySQL MHA

搭建 MySQL MHA 搭建 MySQL MHA实验拓扑图实验环境实验思路MHA架构故障模拟 实验部署数据库安装主从复制部署时间同步主服务器配置从服务器配置创建链接 MHA搭建安装依赖的环境安装 node 组件安装 manager 组件配置无密码认证在 manager 节点上配置 MHA管理 mysql 节点服务器创…

面试突击:Java 集合知识体系梳理

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。在 Java 开发中&#xff0c;集合类对象绝对是被使用最频繁的对象之一。因此&#xff0c;深入了解集合类对象的底层数…

热敏晶振:成本效益的选择与温补晶振的比较

在精密电子系统的设计中&#xff0c;晶振作为时间基准源&#xff0c;其频率稳定性直接影响到整个系统的性能。其中&#xff0c;温补晶振(Temperature Compensated Crystal Oscillator&#xff0c;简称TCXO)与热敏晶振(Thermistor Compensated Crystal Oscillator)作为在特殊温度…

面试-java异常体系

1.java异常体系 error类是指与jvm相关的问题。如系统崩溃&#xff0c;虚拟机错误&#xff0c;内存空间不足。 非runtime异常不处理&#xff0c;程序就没有办法执行。 一旦遇到异常抛出&#xff0c;后面的异常就不会进行。 (1)常见的error以及exception 2.java异常要点分析…

kubekey 安装高可用 kubernetes 集群

1. 准备环境 1.1 机器准备 4 台机器&#xff0c;操作系统&#xff1a;Ubuntu 24.04/RHEL8/CentOS9 10.111.3.53 master1 10.111.3.54 master2 10.111.3.55 master3 10.111.3.57 node41.2 安装依赖和配置 所有节点都需要执行&#xff1a; Ubuntu: apt-get install -y soca…

【AI大模型】Transformers大模型库(十四):Datasets Viewer

目录 一、引言 二、Datasets Viewer数据查看器 2.1 概述 2.2 示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服务。 &#x1f917; Transformers 提供了数以千计的预训练…

如何使用大模型进行文本分类任务?

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&…

openlayer 鼠标点击船舶,打开船舶简单弹框

背景&#xff1a; 对创建的地图对象&#xff0c;可以添加上监听事件&#xff0c;常用的有&#xff1a;地图点击事件、鼠标移动事件。 通过监听这些事件&#xff0c;又可以区分不同图层的不同要素&#xff0c;获取不同数据&#xff1b; 根据这些数据&#xff0c;又可以发起网络请…

【介绍下SCSS的基本使用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

React的Props、生命周期

Props 的只读性 “Props” 是 React 中用于传递数据给组件的一种机制&#xff0c;通常作为组件的参数进行传递。在 React 中&#xff0c;props 是只读的&#xff0c;意味着一旦将数据传递给组件的 props&#xff0c;组件就不能直接修改这些 props 的值。所以组件无论是使用函数…

Linux编程---给函数取别名

0 Preface/Foreword 1 代码 1.1 源代码 #include <stdio.h> #include <string.h> int sum(int a, int b);int sum_alias(int a, int b) __attribute__ ((alias("sum"))); int main() { int ret 0; ret sum(5, 5) sum_alias(5, 5); …

线性相关,无关?秩?唯一解(只有零解),无穷解(有非零解)?D=0,D≠0?

目录 线性有关无关 和 唯一解&#xff08;只有零解&#xff09;&#xff0c;无穷解&#xff08;有非零解&#xff09;之间的关系 D0&#xff0c;D≠0&#xff1f; 和 秩 的关系 串起来&#xff1a; 线性相关&#xff0c;无关&#xff1f;秩&#xff1f;唯一解&#xff08;只…

华为认证hcna题库背诵技巧有哪些?hcna和hcia有什么区别?

大家都知道华为认证hcna是有题库供考生刷题备考的&#xff0c;但题库中海量的题目想要在短时间背诵下来可并不是一件容易的事情&#xff0c;这就需要我们掌握一定的技巧才行。华为认证hcna题库背诵技巧有哪些? hcna和hcna这二者又有什么区别呢?今天的文章将为大家进行详细解…

datax入门(datax的安装与简单使用)——01

datax入门&#xff08;datax的安装与简单使用&#xff09;——01 1. 官网2. 工具部署&#xff08;通过下载DataX工具包&#xff09;2.1 下载、解压2.2 配置2.2.1 查看配置模版2.2.2 根据模版配置json2.2.3 启动DataX 3. datax的简单使用3.1 mysql2stream3.2 mysql2mysql3.2.1 拼…

PyCharm 2024.1最新变化

PyCharm 2024.1 版本带来了一系列激动人心的新功能和改进&#xff0c;以下是一些主要的更新亮点: Hugging Face 模型和数据集文档预览&#xff1a;在 PyCharm 内部快速获取 Hugging Face 模型或数据集的详细信息&#xff0c;通过鼠标悬停或使用 F1 键打开文档工具窗口来预览。 …

Discourse OpenAI 生成图片

正如一些讨论的&#xff0c;生成图片是比较贵的。 差不多到了 1 元 一张图了。 就 OpenAI 生成了上面 4 张图&#xff0c;费用 0.4 美元。 Discourse OpenAI 生成图片 - Discourse - iSharkFly