基于顺序表的通讯录(纯代码)

news2024/9/28 3:19:42

1.SeqList.h

#pragma once
#include <stdio.h>
#include<assert.h>
#include<stdlib.h>
#include "Contact.h"

#define INIT_CAPACITY 4
//动态顺序表 按需申请
typedef PI SLDatetype;
typedef struct SeqList
{
	SLDatetype* a;
	int size;//有效数据个数
	int capacity;//空间容量
}SL;
//增删查改
void SeqInit(SL* s);
void SeqDestroy(SL* s);
void SLPushBack(SL* ps, SLDatetype x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDatetype x);
void SLPopFront(SL* ps);
void SLCheckCapacity(SL* ps);
void SLInsert(SL* ps, int pose, SLDatetype x);
void SLErase(SL* ps, int pose);

2.SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include<assert.h>
//扩容
void SLCheckCapacity(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		SLDatetype* tmp = (SLDatetype*)realloc(ps->a, sizeof(SLDatetype) * ps->capacity * 2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
}
//顺序表初始化
void SeqInit(SL* ps)
{
	ps->a = (SLDatetype*)malloc(sizeof(SLDatetype) * INIT_CAPACITY);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}
//顺序表销毁
void SeqDestroy(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}
//尾插
void SLPushBack(SL* ps, SLDatetype x)
{
	assert(ps);
	//扩容
	SLCheckCapacity(ps);
	ps->a[ps->size++] = x;
}
//尾删
void SLPopBack(SL* ps)
{
	//温柔检查
	/*if (ps->size == 0)
		return;*/
		//暴力检查
	assert(ps->size > 0);
	ps->size--;
}

//头插
void SLPushFront(SL* ps, SLDatetype x)
{
	assert(ps->a);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[0] = x;
	ps->size++;
}
//中间插入
void SLInsert(SL* ps, int pose, SLDatetype x)
{
	assert(ps);
	assert(pose >= 0 && pose <= ps->size);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pose)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[pose] = x;
	ps->size++;
}
//中间删除
void SLErase(SL* ps, int pose)
{
	assert(ps);
		assert((pose >= 0) && (pose < ps->size));
	int begin = pose + 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		++begin;
	}
	ps->size--;
}


//尾删
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size > 0);
	int begin = 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		++begin;
	}
	ps->size--;
}

3.Contact.c

#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
#include"SeqList.h"
//通讯录的初始化
void ContactInit(Contact* con)
{
	//实际上要进行的是顺序表的初始化
	//顺序表的初始化已经实现好了
	SeqInit(con);
}
//通讯录的销毁
void ContactDestroy(Contact* con)
{
	SeqDestroy(con);
}
//通讯录添加数据
void ContactAdd(Contact* con)
{
	//获取用户输入的内容:姓名+性别+年龄+电话+地址
	PI 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);
}
//通过名字查找联系人
int FindName(Contact* con, char name[])
{
	for (int i = 0; i < con->size;i++)
	{
		if (0 == strcmp(con->a[i].name, name))
		{
			//找到了
			return i;
		}
	}
	//没有找到
	return -1;
}
//通讯录删除数据
void ContactDel(Contact* con)
{
	//要删除的数据必须存在才能删除
	//查找
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名:\n");
	scanf("%s",name);
	int find = FindName(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("%s %s %d %s %s\n",
			con->a[i].name,
			con->a[i].gender,
			con->a[i].age,
			con->a[i].tel,
			con->a[i].addr
		);
	}
}
//通讯录的修改
void ContactModify(Contact* con)
{
	//要修改的联系人数据存在
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名:\n");
	scanf("%s",name);
	int find = FindName(con, name);
	if (find < 0)
	{
		printf("要删除的联系人数据不存在\n");
		return;
	}
	//直接修改
	printf("请输入新的联系人的姓名\n");
	scanf("%s", con->a[find].name);

	printf("请输入新的联系人的姓别\n");
	scanf("%s", con->a[find].gender);

	printf("请输入新的联系人的年龄\n");
	scanf("%d", &con->a[find].age);

	printf("请输入新的联系人的电话\n");
	scanf("%s", con->a[find].tel);

	printf("请输入新的联系人的住址\n");
	scanf("%s", con->a[find].addr);

	printf("修改成功\n");
}
//查找联系人
void ContactFind(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人的姓名:\n");
	scanf("%s", name);
	int find = FindName(con, name);
	if (find < 0)
	{
		printf("要查找的联系人数据不存在\n");
		return;
	}
	//直接打印
	printf("%s %s %d %s %s\n",
		con->a[find].name,
		con->a[find].gender,
		con->a[find].age,
		con->a[find].tel,
		con->a[find].addr
	);
}
4.Contact.h 
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
#include<string.h>
//定义联系人数据结构
//姓名 年龄 性别 电话 地址
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PI;
struct SeqList;
//给顺序表改个名字,叫通讯录
typedef struct SeqList Contact;

//通讯录的初始化
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);
#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include"Contact.h"
void menu()
{
	printf("*******************************\n");
	printf("******       通讯录      ******\n");
	printf("******  1.添加   2.删除  ******\n");
	printf("******  3.查找   4.修改  ******\n");
	printf("******  5.阅览   6.清空  ******\n");
	printf("******      0.退出       ******\n");
	printf("*******************************\n");
}


//void ContactTest()
//{
//	Contact con;//创建的通讯录对象,实际上是顺序表对象,等价于SL 
//	ContactInit(&con);
//	ContactDestroy(&con);
//	ContactAdd(&con);
//}
int main(void)
{
	Contact con;
	ContactInit(&con);
	int input;
	do
	{
		menu();
		printf("请选择:--->\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			 ContactAdd(&con);     //增加
			break;
		case 2:
			ContactDel(&con);      //删除
			break;
		case 3:
			ContactFind(&con); //查找
			break;
		case 4:
			ContactModify(& con);   //修改
			break;
		case 5:
			ContactShow(&con);    //显示
			break;
		case 6:
			ContactDestroy(&con);   //销毁
			break;
		default:
			printf("选择错误");
			break;
		}
	} while (input);
	return 0;
}

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

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

相关文章

25 Vue3之如何开发移动端并适配

开发移动端最主要的就是适配各种手机 vw vh是相对viewport 视口的单位&#xff0c;配合meta标签可以直接使用&#xff0c;无需计算 1vw1/100视口宽度 1vh1/100视口高度 当前屏幕视口是375像素&#xff0c;1vw就是3.75px postCss 提供了 把Css 转换AST的能力&#xff0c;类…

LeetCode --- 416周赛

题目列表 3295. 举报垃圾信息 3296. 移山所需的最少秒数 3297. 统计重新排列后包含另一个字符串的子字符串数目 I 3298. 统计重新排列后包含另一个字符串的子字符串数目 II 一、举报垃圾信息 直接用哈希表统计bannedWords中的单词&#xff0c;遍历message中出现的垃圾信息…

WiFi无线连接管理安卓设备工具:WiFiADB

介绍 WiFi ADB 使您能够通过 WiFi TCP/IP 连接直接在设备上轻松调试和测试 Android 应用&#xff0c;无需使用 USB 数据线。在启用 WiFi 上的 ADB 后&#xff0c;打开控制台将电脑连接到设备。 手机和电脑在同一个WiFi然后电脑上运行adb connect x.x.x.x:x命令即可 下载 谷…

Go语言开发后台框架不能只有CRUD还需有算法集成基础功能-GoFly框架集成了自然语言处理(NLP)分词、关键词提取和情感分析

前言 Go语言开发框架&#xff0c;我们要把Go的优势体现在框架中&#xff0c;不仅CRUD常规操作&#xff0c;还要把常用即有算力自己集成到框架中&#xff0c;而不是去购买第三方提供服务接口。作为开发者可以拓宽自己代码面&#xff0c;获取更多成就感&#xff0c;同时也提供自…

戴尔PowerEdge R840服务器亮黄灯 不开机

最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后&#xff0c;无法正常开机的问题&#xff0c; 大概故障现象是 插上电源线 按卡机按钮无响应&#xff0c;无法开机&#xff0c;无显示输出&#xff0c;工程师到现场检修&#xff0c;经过idrac中日志分析&#…

商标是什么?为何对企业至关重要?

商标作为企业的核心标识&#xff0c;不仅是区分商品与服务的关键&#xff0c;更是企业品牌塑造、市场区分和消费者信任建立的基石。那么&#xff0c;商标究竟是什么&#xff1f;它又为何对企业如此重要呢&#xff1f; 商标的定义及类型 商标&#xff08;Trademark&#xff09;…

Python获取百度翻译的两种方法

一、引言 百度是我们常用的搜索工具&#xff0c;其翻译是与爱词霸合作&#xff0c;总体看其反应速度较快&#xff0c;可以作为项目中重要的翻译工具。根据大家的需要&#xff0c;现提供两种Python获取百度翻译的两种办法&#xff1a; 二、requests法 我们引用requests模块&a…

构建5G-TSN测试平台:架构与挑战

论文标题&#xff1a;Building a 5G-TSN Testbed: Architecture and Challenges 作者信息&#xff1a; Anna Agust-Torra, Marc Ferr-Mancebo, David Rincn-Rivera, Cristina Cervell Pastor, Sebasti Sallent-Ribes&#xff0c;来自西班牙巴塞罗那的加泰罗尼亚理工大学&…

裁剪视频如何让画质不变?一文教会你

当我们想要从一段视频中提取精华&#xff0c;裁剪视频就成了必不可少的技能。 但是&#xff0c;如何做到在裁剪过程中不损害画质&#xff0c;保持视频原有的清晰度和流畅度呢&#xff1f; 这不仅需要技巧&#xff0c;还需要对视频编辑有一定的了解。 本文将为你介绍四种裁剪…

Redis篇(数据类型)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;常用 一、String类型 1. 简介 2. 常见命令 3. Key结构 4. 操作String 5. 实例 二、Hash类型 1. 简介 2. 常见命令 3. 3操作hash 4. 实例 三、List类型 1. 简介 2. 特征 3. 应用场景 4. 常见命令 5. 操作list …

13.安卓逆向-frida基础-编写hook脚本1

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

外国电影演员识别系统源码分享

外国电影演员识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

AI产品经理必知:核心人工智能技术概览

第一章&#xff1a;AI产品经理是否需要懂技术及其程度 在当今AI行业快速发展的背景下&#xff0c;作为一位AI产品经理&#xff0c;理解并掌握一定的AI技术知识不仅是锦上添花&#xff0c;更是不可或缺的素质。那么&#xff0c;AI产品经理究竟需要懂到何种程度的技术呢&#xf…

国内车市销量激增,理想成功超越BBA

文/王俣祺 导语&#xff1a;随着“金九银十”的到来&#xff0c;国内汽车市场迎来了一个充满活力的开局。乘用车市场的销量已经迎来新的突破&#xff0c;彰显出中国汽车市场的韧性和潜力。尤为引人注目的是&#xff0c;新能源汽车销量同样激增&#xff0c;成为推动市场增长的重…

C++--IO流

目录 1. C语言的输入与输出 2. 流是什么 3. CIO流 4 stringstream的简单介绍 1. C语言的输入与输出 C 语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf() 。 scanf(): 从标准输入设备 ( 键 盘 ) 读取数据&#xff0c;并将值存放在变量中 。 printf(): 将…

C++ : 多态

1. 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学…

通过队列实现栈

请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int to…

基于微信小程序爱心领养小程序设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

基于Hive和Hadoop的电信流量分析系统

本项目是一个基于大数据技术的电信流量分析系统&#xff0c;旨在为用户提供全面的通信数据和深入的流量使用分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

无人船在海洋勘探领域的应用!

一、具体应用 海底地形测绘&#xff1a; 无人船可以搭载多波束测深仪等先进设备&#xff0c;进行高精度的海底地形测绘。这些设备能够生成详细的海底地形图&#xff0c;为海洋工程设计和施工提供详尽的水下地形资料。 海底资源勘探&#xff1a; 通过搭载磁力仪、重力仪等地…