通讯录项目(终)

Start And Stick

上一期我们将通讯录的项目的基本功能已经实现,这一篇文章我们将对通讯录进行完善。

目录

Start And Stick

上期回顾:

上期必要代码:

数据打印:

代码讲解:

头部插入数据:

代码讲解:

任意位置数据修改:

代码讲解:

最代码整合:

sqlist.h文件:

slist.c文件:

test.c文件:


上期回顾:

通讯录(上)icon-default.png?t=N7T8http://t.csdnimg.cn/Vg3o3

话不多说我们开始代码实现:

上期必要代码:

typedef struct pereon
{char name[20];int age;char gender[2];char phone[13];
}PE;typedef PE WANG;typedef struct sqlist {WANG* a;int cp;int numbers;
}SL;

数据打印:

//数据打印
void SLprint(SL* p1) {assert(p1);printf("%s %s %s %s\n", "姓名", "年龄", "性别", "电话");for (int i = 0; i < p1->numbers; i++){printf("%-s %-d %-s %-s\n",p1->a[i].name,p1->a[i].age,p1->a[i].gender,p1->a[i].phone);}
}

代码讲解:

这里打印字符串需要用%s,打印整形需要用%d。这里我们需要着重讲解的是:

p1->a[i]表示的意思。首先根据运算先后顺序p1->a先结合,结合后可以看作:WANG*a。之后可以看作a[i],也就是*(a+i)。这里*(a+i)又可以看作PE,对其进行引用可以。

数据销毁:

//数据销毁
void SLdestory(SL* p1) {assert(p1);free(p1->a);p1->a = NULL;p1->cp = p1->numbers = 0;}

对结点进行释放内存,同时对数据进行初始化。

头部插入数据:

这里会有读者问为啥头部插入数据要放在这一篇文章讲呢,肯定是有一点特殊啊!!

//数据头部插入
void SLheaddeposit(SL*p1)
{int mz = p1->cp == 0 ? 2 : 2 * p1->cp;if (p1->cp == p1->numbers) {p1->a = (WANG*)realloc(p1->a, mz * sizeof(WANG));p1->cp = mz;}assert(p1);WANG p2 = inform();//将原本的数据移动for (int i = p1->numbers; i>=0 ; i--){if (i == 0){p1->a[i] = p2;}p1->a[i] = p1->a[i - 1];}
}

代码讲解:

我们这里还是要判断是否要申请空间,也就和前面一样。接下来我们需要将录入的新数据先存入我们所定义的零时变量p2中,之后我们需要将原本的数据从后开始移动,以防止数据的覆盖问题。

任意位置数据修改:

最后我们来实现任意指定位置的数据删除和插入,因为两者的思路差不多所以我们仅实现一个:

这里我们来实现任意位置的数据插入:

void SLanydeposit(SL*p1)
{assert(p1);int m = 0;printf("请输入想要插入数据的下标:");scanf("%d", &m);//录入数据,PE p = inform();//将原本的数据移动,插入数据for (int i = p1->numbers; i >= m; i--){if (i == m){p1->a[i] = p;}else{p1->a[i] = p1->a[i - 1];}}
}

代码讲解:

这里我们需要考虑一个事情:如果i=p1->numbers=0,这里我们的m只能为0。所以for循环也可以处理该数据的插入。

这里代码的目录和选择可以根据自己的喜好来进行更改。

最代码整合:

最后我们进行代码的整合,test.c文件和sqlist.h我们就不再讲解了。

sqlist.h文件:

#pragma once#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>typedef struct pereon
{char name[20];int age;char gender[2];char phone[13];
}PE;typedef PE WANG;typedef struct sqlist {WANG* a;int cp;int numbers;
}SL;//数据存放PE inform();//数据尾部插入
void SLdeposit(SL* p1);//数据删除
void SLdelete(SL* p1);//数据查找
int SLfind(SL* p1);//数据打印
void SLprint(SL* p1);//数据销毁
void SLdestory(SL* p1);//图表打印
void menu();//数据初始化
void SLinit(SL* p1);//数据头部插入
void SLheaddeposit(SL* p1);//任意位置数据前的插入
void SLanydeposit(SL* p1);

slist.c文件:

#define _CRT_SECURE_NO_WARNINGS 1
#include"sqlist.h"//数据初始化
void SLinit(SL* p1)
{p1->a = NULL;p1->cp = p1->numbers = 0;
}//数据录入
PE inform()
{printf("请输入数据:");PE inof;printf("请输入name:");scanf("%s", inof.name);printf("请输入age:");scanf("%d", &inof.age);printf("请输入gender:");scanf("%s", inof.gender);printf("请输入phone number:");scanf("%s", inof.phone);return inof;
}//数据头部插入
void SLheaddeposit(SL*p1)
{int mz = p1->cp == 0 ? 2 : 2 * p1->cp;if (p1->cp == p1->numbers) {p1->a = (WANG*)realloc(p1->a, mz * sizeof(WANG));p1->cp = mz;}assert(p1);WANG p2 = inform();//将原本的数据移动for (int i = p1->numbers; i>=0 ; i--){if (i == 0){p1->a[i] = p2;}p1->a[i] = p1->a[i - 1];}
}//数据尾部插入
void SLdeposit(SL* p1)
{int mz = p1->cp == 0 ? 2 : 2 * p1->cp;if (p1->cp == p1->numbers) {p1->a = (WANG*)realloc(p1->a, mz * sizeof(WANG));p1->cp = mz;}assert(p1);p1->a[p1->numbers] = inform();p1->numbers++;
}//数据删除
void SLdelete(SL* p1)
{assert(p1);int i = SLfind(p1);if(i>=0);{for (int m = i; m < p1->numbers-1; m++){p1->a[m] = p1->a[m + 1];}printf("删除成功\n");p1->numbers--;}if (i == -1) {printf("no people is this name\n");}
}//数据查找
int SLfind(SL*p1)
{assert(p1);printf("please write your name:");char name[20];scanf("%s", name);for (int i = 0; i < p1->numbers; i++){int m=strcmp(name, p1->a[i].name);if (m == 0)printf("%s %s %s %s\n", "姓名", "年龄", "性别", "电话");printf("%-s %-d %-s %-s\n",p1->a[i].name,p1->a[i].age,p1->a[i].gender,p1->a[i].phone);return i;}printf("查找失败\n");return -1;
}//数据打印
void SLprint(SL* p1) {assert(p1);printf("%s %s %s %s\n", "姓名", "年龄", "性别", "电话");for (int i = 0; i < p1->numbers; i++){printf("%-s %-d %-s %-s\n",p1->a[i].name,p1->a[i].age,p1->a[i].gender,p1->a[i].phone);}
}//数据销毁
void SLdestory(SL* p1) {assert(p1);free(p1->a);p1->a = NULL;p1->cp = p1->numbers = 0;}//图表打印
void menu()
{printf("**************\n");printf("****通讯录****\n");printf("*1.增加联系人*\n");printf("*2.删除联系人*\n");printf("*3.查找联系人*\n");printf("*4.显示联系人*\n");printf("**0.退出服务**\n");printf("**************\n");printf("**************\n");
}
//任意位置数据前的插入
void SLanydeposit(SL*p1)
{assert(p1);int m = 0;printf("请输入想要插入数据的下标:");scanf("%d", &m);//录入数据,PE p = inform();//将原本的数据移动,插入数据for (int i = p1->numbers; i >= m; i--){if (i == m){p1->a[i] = p;}else{p1->a[i] = p1->a[i - 1];}}
}

test.c文件:


#include"sqlist.h"int main()
{int choice = 0;SL connect;SL* p1 = &connect;SLinit(p1);do{menu();printf("Please make your owen choice: ");scanf("%d", &choice);switch (choice){case 1:SLdeposit(p1);break;case 2:SLdelete(p1);break;case 3:SLfind(p1);break;case 4:SLprint(p1);break;case 0:printf("退出成功");break;default:printf("输入错误");break;}} while (choice);return 0;
}

到这里我们的结构体实现通讯录就结束了,我们江湖再见。

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

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

相关文章

【Linux】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 Linux 目录&#xff1a; &#xff08;一&#xff09;CentOS 7 安装&配置Python

CSS 多色正方形上升

<template><view class="loop cubes"><view class="item cubes"></view> <!-- 方块1 --><view class="item cubes"></view> <!-- 方块2 --><view class="item cubes"></vie…

day23 其他事件(页面加载事件、页面滚动事件)

目录 页面加载事件页面/元素滚动事件页面滚动事件——获取位置 页面加载事件 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件为什么使用&#xff1a; 有时候需要等页面资源全部处理完毕再做一些事老代码喜欢把script写在head中&…

20.2K Star,一个简洁美观、易用的云盘系统

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 现在的网盘动不动就限速&#xff0c;涨价&#xff0c;非常不爽&#x…

如何“做好冲突管理”?

一、工作实际案例 产品经理在主导跨部门需求项目时&#xff0c;项目在验收阶段&#xff0c;产品经理与业务人员完成初步验收&#xff0c;接下来需要开发同学解决验收问题。 开发小组长反馈&#xff1a;经开发内部评估&#xff0c;按当前项目排期&#xff0c;因上线时间紧张&a…

数据监控-Prometheus/Grafana

一、数据监控Prometheus 1、什么是Prometheus Prometheus是由SoundCloud开源监控告警解决方案,从2012年开始编写代码,到2015年github上开源以来,吸引不少用户以及公司的使用。Prometheus作为新一代的开源解决方案,很多理念与Google SRE的运维之道不谋而合。 2、Promet…

讯飞大模型定制训练平台尝鲜

文章目录 前言进入平台功能探索余额数据集管理 先训为快讯飞星火3.0Chinese-Aplaca-2-7BLlama2-7BInternLM-7BBloomz-7Bfalcon-7BBloomz-3B 前言 众所周知&#xff0c;国产大模型如千问、书生、易等等都有开源大模型&#xff0c;但是出场时效果就很不错的讯飞星火大模型却迟迟…

OpenHarmony关系型数据库

1 概述 关系型数据库(Relational Database, 以下简称RDB)是一种基于关系模型来管理数据的数据库&#xff0c;是在SQLite基础上提供一套完整的对本地数据库进行管理的机制&#xff0c;为开发者提供无需编写原生SQL语句即可实现数据增、删、改、查等接口&#xff0c;同时开发者也…

通讯录小项目(上)

Start And Stick 通讯录的实现有很多种方式&#xff0c;今天我们将用结构体实现简单的通讯录项目功能。包括通讯录的增、删、查、改等功能。 思路&#xff1a; 此次代码文件分别为&#xff1a; 文件名用途sqlist.h用于函数和结构体的声明sqlist.c用于函数的实现test.c用于通讯…

DevOps系列文章之 Git命令:过滤日志

使用git log命令查找特定提交历史的高级技巧。其中的一些技巧配合格式化日志命令使用有奇效。 按照数量过滤 使用git log命令时最基本的过滤方式就是按照可以显示的日志条数进行过滤。如果你只对最近几次提交感兴趣&#xff0c;这会节省在页面上查看所有提交的麻烦。 git lo…

Vue3在css中使用v-bind绑定js/ts变量,也可以在scss和less中使用方式

主要介绍Vue3中的新增的v-bind()的常用使用方式&#xff0c;主要包括在css,less,scss中的使用&#xff0c;可以参考官方文档查看&#xff1a;Vue3官方文档 特别提醒 如果你想在scss中或者less中使用&#xff0c;可能会报各种乱七八糟的错误&#xff0c;最快最好用的方式就是单…

RBD —— 不同材质破碎

目录 Working with concrete Chipping Details Proxy geometry Constraints Working with glass Chipping Proxy geometry Constraints Resolving issues with glass fracturing Working with wood Clustering Using custom cutters Working with concrete Concr…

【RT-DETR有效改进】EfficientFormerV2移动设备优化的视觉网络(附对比试验效果图)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

THM学习笔记——john

John the Ripper是目前最好的哈希破解工具之一。 John基本语法&#xff1a; john [options] [path to file] john&#xff1a;调用John the Ripper程序。 [path to file]&#xff1a;包含你要尝试破解的哈希的文件&#xff0c;如果它们在同一个目录中&#xff0c;你就不需要命名…

理解虚拟内存

虚拟内存管理 分页管理 将用户程序的地址空间分为若干个固定大小的区域&#xff0c;称为“页面”。典型的页面大小为 1KB。相应地&#xff0c;也将内存空间分为若干个物理块&#xff0c;页和块的大小相同。然后通过映射表&#xff0c;把连续的虚拟内存空间&#xff0c;映射到离…

C++: 内联函数

目录 概念&#xff1a; 与宏的对比&#xff1a; 函数膨胀&#xff1a; 内联函数的特性&#xff1a; 概念&#xff1a; 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数…

Feign 体系架构解析

正所谓麻雀虽小五脏俱全&#xff0c;HTTP 调用看着简单&#xff0c;实则下面隐藏的是一套非常复杂的流程。 从上古时代 jspservlet&#xff0c;到后面的 SpringMVC&#xff0c;在 HTTP 请求解析和封装上同样是煞费苦心。 我们在学习中经常会碰到这种 case&#xff0c;有些开源…

阿里云一键部署搭建幻兽帕鲁联机服务器教程

幻兽帕鲁&#xff08;Palworld&#xff09;是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;许多玩家会选择自行搭建游戏联机服务器&#xff0c;但是如何部署搭建幻兽帕鲁联机服务器成为一个难题&#xff0c;阿里云提供了一种高效且简便的一键部署方案&#…

qt初入门7:进度条,定时器,时间控件练习

参考课本demo&#xff0c;空闲时间练习一下进度条&#xff0c;定时器&#xff0c;日期相关控件和使用。 1&#xff1a;demo运行结果 2&#xff1a;进度条控件梳理 进度条显示控件实际上是QProgressBar, 显示的进度可以通过代码控制&#xff0c;也可以通过其他控件上获取到的值…

学习PyQt5

1、布局之后&#xff0c;无法移动对象到指定区域&#xff0c;无法改变对象大小。 原因&#xff1a;因为CtrlA选中了整个窗口&#xff0c;然后布局的时候就相当于整个窗口都按照这种布局&#xff0c;如选了水平布局&#xff0c;按钮一直在中间&#xff0c;无法拖到其它位置。 …