通讯录项目(终)

news2025/1/16 1:46:29

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.coloradmin.cn/o/1416951.html

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

相关文章

黑马程序员-瑞吉外卖-day5

修改实体类 package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode;i…

常见の算法5

位图 一个int类型32字节&#xff0c;可以表示0-31这32个数出没出现过&#xff0c;出现过1没出现0&#xff0c;再扩大一点搞个数组&#xff0c;就可以表示0-1023出没出现过&#xff0c;一个long类型可储存64位 如何把10位组成的数&#xff0c;第四位由1改成零 package class05…

【深度学习:开源BERT】 用于自然语言处理的最先进的预训练

【深度学习&#xff1a;开源BERT】 用于自然语言处理的最先进的预训练 是什么让 BERT 与众不同&#xff1f;双向性的优势使用云 TPU 进行训练BERT 结果让 BERT 为您所用 自然语言处理 &#xff08;NLP&#xff09; 面临的最大挑战之一是训练数据的短缺。由于 NLP 是一个具有许多…

绿联私有云DX4600升级DX4600 Pro试用体验 | 全方位解读“卷王”NAS的进化史

哈喽小伙伴们好&#xff0c;我是Stark-C~ 想必很多关注数码圈的朋友都知道绿联这个品牌吧&#xff1f;作为一个深耕数码科技领域数十载的国民大品牌&#xff0c;绿联现在可谓是在数码行业全面开花&#xff0c;并且取得的成就大家也是有目共睹。它家的产品基本都是以高性价比著…

详解SpringCloud微服务技术栈:ElasticSearch实践1——RestClient操作索引库与文档

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;ElasticSearch原理精讲、安装、实践 &#x1f4da;订阅专栏&#xff1a;微服务技术全家…

C++ 数论相关题目 表达整数的奇怪方式(中国剩余定理)

给定 2n 个整数 a1,a2,…,an 和 m1,m2,…,mn &#xff0c;求一个最小的非负整数 x &#xff0c;满足 ∀i∈[1,n],x≡mi(mod ai) 。 输入格式 第 1 行包含整数 n 。 第 2…n1 行&#xff1a;每 i1 行包含两个整数 ai 和 mi &#xff0c;数之间用空格隔开。 输出格式 输出最小…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步&#xff1a;全局安装&#xff1a;npm install -g create-react-app 第二步&#xff1a;切换到想创建项目的目录&#xff0c;使用命令create-react-app hello-react 第三步&#xff1a;进入项目目录&#xff0c;cd hello-react 第四步&#xff1a;启…

内部类 --java学习笔记

内部类 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;那么这个类就是内部类当一个类的内部包含了一个整体的事务&#xff0c;且这个事务没必要单独设计时&#xff0c;就可以把…

Java面试题:JMM与锁的理论

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 今天是《面霸的自我修养》的第二弹&#xff0c;内容是Java并发编程中关于Java内存模型&#xff08;Java Memory Model&#xff09;和锁的基础理论相关的问题。这两块内…

网工必备工具:不懂它,何谈高手之位?

点开之前&#xff0c;你脑子里闪出来的工具是什么&#xff1f;ping&#xff1f;又或是arp、tracert、route……&#xff1f; 今天要给你分享的是非常经典的Linux网络抓包工具Tcpdump。 它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。 Tcpdump 适用…

【语录】岁月

中年 写中年&#xff0c;应该是年少励志三千里 踌躇百步无寸功&#xff0c;转眼高堂已白发 儿女蹒跚学堂中&#xff0c;不如意事常八九&#xff0c;可与人言无二三 可是诸位&#xff0c;不用悲伤&#xff0c;稻盛和夫说&#xff0c; 人生并不是一场物质的盛宴&#xff0c;而是…

12.Golang中类的表示与封装

目录 概述类的表示代码结果 类的封装代码结果 结束 概述 Golang中类的表示与封装 类的表示 代码 注释掉的代码&#xff0c;并不能拿来当赋值或获取值来使用。 package mainimport "fmt"// 类大写则代表&#xff0c;可以被其它包使用 type Hero struct {// 属性方法大…

30岁以就业为目标学前端,快歇着吧;反之50岁都不晚。

Hi&#xff0c;我是贝格前端工场&#xff0c;首先声明声明我们不搞前端培训&#xff0c;有很多老铁在留言中问我关于前端学习的问题&#xff0c;最普遍的一个问题就是30岁以后学前端晚了吗&#xff1f;今天借着此篇文章回答一下。 一、30岁学前端的三种人 首先抛开年龄不说&am…

【计算数组连续值的移动距离】及【计算遥控器按键总次数】

计算数组连续值的移动距离及计算遥控器按键总次数 计算数组连续值的移动距离计算遥控器按键总次数 计算数组连续值的移动距离 /*** 计算数组连续值的移动距离* 给定一个乱序的整数数组&#xff0c;数组中值为1~n&#xff0c;请计算出所有数字移动到比其大1的数字位置的距离和。…

【vue2】路由之 Vue Router

文章目录 一、安装二、基础使用1、简单的示例2、动态路由2.1 定义动态路径参数2.2 获取动态路径的参数2.3 捕获所有路由 3、嵌套路由4、编程式的导航4.1 router.push4.2 router.replace4.3 router.go(n) 5、命名路由6、重定向 三、进阶1、导航守卫1.1 全局前置守卫1.2 全局后置…

1Panel CloudFlare证书申请失败的解决方案

在升级1Panel后&#xff0c;使用 CloudFlare DNS验证时&#xff0c;会提示 [*.biliwind.com] [*.biliwind.com] acme: error presenting token: cloudflare: failed to find zone biliwind.com.: ListZonesContext command failed: Invalid request headers (6003) 为解决此问…

如何在Arxiv上预发表自己的手稿

1. 使用latex编辑好自己的手稿。可以使用latex软件或者overleaf。尽量避免警告&#xff0c;否则会在上传到arxiv时出现意外的错误。 2. https://arxiv.org/登陆并注册arxiv账号 3. 点击 开始新的提交&#xff08;START NEW SUBMISSION&#xff09; 4. 主要的问题是参考文献的导…

C++:auto 关键字 范围for

目录 auto 关键字&#xff1a; 起源&#xff1a; auto的使用细则&#xff1a; auto不能推导的场景&#xff1a; 范围for&#xff1a; 范围for的使用条件&#xff1a; C的空指针&#xff1a; 注意&#xff1a; auto 关键字&#xff1a; 起源&#xff1a; 随着程序越…

全角色服务、全场景支撑、全业务应用的新一代智慧教室

新一代智慧教室以“数智化助力高质量人才培养”为核心目标&#xff0c;以AI赋能的智能硬件为基础构建多形态智慧教学环境&#xff0c;以中台为支撑实现数据、设备、系统、业务的互联互通、开放共享&#xff0c;以平台全面覆盖教学应用&#xff0c;采集、汇聚、挖掘、分析课前课…

【周赛】第382场周赛

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 从这一场&#xff08;第382场周赛&#xff09;周赛开始记录&#xff0c;目标是尽快达到准确快速AC前三道题&#xff0c;每场比赛…