通讯录项目(终)

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

深入理解MySQL中的范围访问方法:单索引与多索引优化策略

深入理解MySQL中的范围访问方法&#xff1a;单索引与多索引优化策略 范围查询方法是数据库查询优化的一种重要手段&#xff0c;它通过利用索引来减少需要检查的数据行数&#xff0c;从而提高查询的执行效率。 范围查询使用单个索引来检索表中包含在一个或多个索引值区间内的子…

CSS 多色正方形上升

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

896.单调数列(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 如果数组是单调递增或单调递减的&#xff0c;那么它是 单调 的。 如果对于所有 i < j&#xff0c;nums[i] < nums[j]&#xff0c;那么数组 nums 是单调递增的。 如…

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

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

Midjourney图片生成描述词记录(今天一天)

抄别人的描述词 /imagine prompt:https://&#xff08;你的图片地址&#xff09;.jpg Super handsome boy IP by pop mart , green suit, no hair, bald head, Scenes in spring , pastel color , mockup , fine luster , clean background ,3D render , Soft focus , oc , bl…

NodeJS Express在线人数统计

NodeJS开发中&#xff0c;要在Express中实现一个在线人数统计系统&#xff0c;可以用下面的思路&#xff1a; 数据结构: 使用一个对象来存储每个 IP 地址的最后访问时间。 当有请求到来时: 1、检查该 IP 地址是否已存在于对象中。 2、如果存在&#xff0c;更新其访问时间。…

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

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

如何“做好冲突管理”?

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

linux如下显示目录和子目录的树形结构

目 录 一、需求 二、解决方法 三、tree工具的安装 1. centos中安装tree 2&#xff0c;在Ubuntu系统中安装tree 3&#xff0c;使用源码编译安装 四、tree的语法 1、语法 2、常用选项 一、需求 应用程序的目录中包含一些子目录&#xff0c;目录嵌套很多&am…

10个必学的Python编程小技巧

10个必学的Python编程小技巧 一、列表推导式&#xff08;List Comprehension&#xff09;二、生成器表达式&#xff08;Generator Expression&#xff09;三、使用enumerate()遍历列表四、使用zip()同时遍历两个列表五、使用setattr()和getattr()动态操作对象属性六、使用with语…

数据监控-Prometheus/Grafana

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

【大厂AI课学习笔记】1.1.1人工智能导论

这个系列&#xff0c;之前是百度的学习笔记&#xff0c;后来他们网站打不开了&#xff0c;现在换为另一个大厂的。 第一节 人工智能导论 1.1 人工智能导论 1.1.1 人工智能概念的诞生 AI&#xff0c;Artificial Intelligence 1956年&#xff0c;美国达特茅斯会议提出。 定义…

2024/1/28 备战蓝桥杯 1-3

目录 特殊日期 0特殊日期 - 蓝桥云课 (lanqiao.cn) 最大距离 0最大距离 - 蓝桥云课 (lanqiao.cn) 最长递增 0最长递增 - 蓝桥云课 (lanqiao.cn) 缩位求和 0缩位求和 - 蓝桥云课 (lanqiao.cn) ISBN号码 0ISBN号码 - 蓝桥云课 (lanqiao.cn) 串的处理 0串的处理 - 蓝桥…

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

文章目录 前言进入平台功能探索余额数据集管理 先训为快讯飞星火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…