当前位置: 首页 > news >正文

基于单链表的通讯录C语言实现

 关于单链表的详细了解请见博主的另一篇博客,本文旨在对单链表进行应用,采用C语言编写。

http://t.csdnimg.cn/iBpFa

一、驱动层

1.1 SList.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"
#include<string.h>typedef peoInfo SLTDataType;typedef struct SlistNode
{SLTDataType data;struct SlistNode* next;
}SLTNode;//链表销毁
void SLTDestory(SLTNode** pphead);// 尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
// 头删
void SLTPopFront(SLTNode** pphead);// 删除指定位置的节点
void SLTDelete(SLTNode** pphead, SLTNode* pos);

1.2 SList.c

#include"SList.h"//为避免重复无意义的操作,封装函数实现
SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc");exit(1);}newnode->data = x;newnode->next = NULL;return newnode;
}
// 尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);//判断是否为空节点if (*pphead == NULL){*pphead = newnode;}else{//找尾节点SLTNode* ptail = *pphead;while (ptail->next){ptail = ptail->next;}ptail->next = newnode;}}
//头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead);assert(*pphead);//链表只有一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* phead = *pphead;*pphead = (*pphead)->next;free(phead);}
}
// 删除指定位置的节点
void SLTDelete(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);SLTNode* prev = *pphead;if (*pphead == pos)          //如果是头节点{SLTPopFront(pphead);}else{//寻找前一个节点while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}}
//链表销毁
void SLTDestory(SLTNode** pphead)
{assert(pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* temp = pcur->next;free(pcur);pcur = temp;}*pphead = NULL;
}

二、调用层

2.1 Contact.h

#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100//用户数据
typedef struct PersonInfo
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}peoInfo;typedef struct SlistNode Contact;//添加通讯录数据
void ContactAdd(Contact** con);
//删除通讯录数据
void ContactDel(Contact** con);
//展示通讯录数据
void ContactShow(Contact* con);
//查找通讯录数据
void ContactFind(Contact* con);
//修改通讯录数据
void ContactModify(Contact** con);
//销毁通讯录数据
void ContactDestroy(Contact** con);

2.2 Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"
#include<string.h>Contact* FindByname(Contact* con, char* cmp)
{Contact* pcur = con;while (pcur){if (strcmp(pcur->data.name,cmp) == 0){return pcur;break;}pcur = pcur->next;}return NULL;
}//添加通讯录数据
void ContactAdd(Contact** con)
{peoInfo info;printf("请输入要添加的联系人姓名\n");scanf("%s", info.name);printf("请输入要添加的联系人性别\n");scanf("%s", info.sex);printf("请输入要添加的联系人年龄\n");scanf("%d", &info.age);printf("请输入要添加的联系人电话\n");scanf("%s", info.tel);printf("请输入要添加的联系人住址\n");scanf("%s", info.addr);SLTPushBack(con, info);
}
//删除通讯录数据
void ContactDel(Contact** con)
{char name[NAME_MAX];printf("请输入要删除的联系人姓名\n");scanf("%s", name);Contact* ret = FindByname(*con, name);if (ret != NULL){SLTDelete(con, ret);printf("删除成功!\n");}else{printf("数据不存在!\n");return;}
}
//展示通讯录数据
void ContactShow(Contact* con)
{Contact* pcur = con;printf("%s	%s	%s	%s	%s\n", "姓名", "性别", "年龄", "电话", "地址");while (pcur){printf("%s	", pcur->data.name);printf("%s	", pcur->data.sex);printf("%d	", pcur->data.age);printf("%s	", pcur->data.tel);printf("%s	", pcur->data.addr);printf("\n");pcur = pcur->next;}
}
//查找通讯录数据
void ContactFind(Contact* con)
{assert(con);char name[NAME_MAX];printf("请输入要查找的联系人姓名\n");scanf("%s", name);Contact* ret = FindByname(con, name);if (ret != NULL){printf("查找成功!\n");printf("%s	%s	%s	%s	%s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%s	", ret->data.name);printf("%s	", ret->data.sex);printf("%d	", ret->data.age);printf("%s	", ret->data.tel);printf("%s	", ret->data.addr);printf("\n");}else{printf("数据不存在!\n");return;}
}
//修改通讯录数据
void ContactModify(Contact** con)
{char name[NAME_MAX];printf("请输入要修改的联系人姓名\n");scanf("%s", name);Contact* ret = FindByname(*con, name);if (ret != NULL){printf("请输入新的联系人姓名\n");scanf("%s", ret->data.name);printf("请输入新的联系人性别\n");scanf("%s", ret->data.sex);printf("请输入新的联系人年龄\n");scanf("%d", &(ret->data.age));printf("请输入新的联系人电话\n");scanf("%s", ret->data.tel);printf("请输入新的联系人住址\n");scanf("%s", ret->data.addr);printf("修改成功!\n");}else{printf("数据不存在!\n");return;}
}
//销毁通讯录数据
void ContactDestroy(Contact** con)
{SLTDestory(con);
}

三、主函数

3.1 main.c

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include"SList.h"
#include"Contact.h"void menu()
{printf("******************通讯录******************\n");printf("*******1.增加联系人   2.删除联系人********\n");printf("*******3.修改联系人   4.查找联系人********\n");printf("*******5.展示联系人   0.   退出  *********\n");printf("******************************************\n");
}int main()
{int a = -1;SLTNode* con = NULL;do {menu();printf("请选择您的操作:\n");scanf("%d", &a);switch (a){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 (a != 0);ContactDestroy(&con);return 0;
}

相关文章:

基于单链表的通讯录C语言实现

关于单链表的详细了解请见博主的另一篇博客&#xff0c;本文旨在对单链表进行应用&#xff0c;采用C语言编写。 http://t.csdnimg.cn/iBpFa 一、驱动层 1.1 SList.h #pragma once#include<stdio.h> #include<stdlib.h> #include<assert.h> #include"…...

【深度学习】YOLO-World: Real-Time Open-Vocabulary Object Detection,目标检测

介绍一个酷炫的目标检测方式&#xff1a; 论文&#xff1a;https://arxiv.org/abs/2401.17270 代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 文章目录 摘要Introduction第2章 相关工作2.1 传统目标检测2.2 开放词汇目标检测 第3章 方法3.1 预训练公式&#xff1a…...

debian安装和基本使用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Debian系统简介 2、Debian与其他Lin…...

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…...

优优嗨聚集团:如何优雅地解决个人债务问题,一步步走向财务自由

在快节奏的现代生活中&#xff0c;个人债务问题似乎已成为许多人不得不面对的挑战。正确处理个人债务&#xff0c;不仅关系到个人信用和财务状况&#xff0c;更是实现财务自由的重要一步。本文将为您提供一些实用的建议&#xff0c;帮助您优雅地解决个人债务问题&#xff0c;走…...

SpringCloud实用篇(四)——Nacos

Nacos nacos官方网站&#xff1a;https://nacos.io/ nacos是阿里巴巴的产品&#xff0c;现在是springcloud的一个组件&#xff0c;相比于eureka的功能更加丰富&#xff0c;在国内备受欢迎 nacos的安装 下载地址&#xff1a;https://github.com/alibaba/nacos/releases/ 启动…...

【嵌入式基础知识学习】AD/DA—数模/模数转换

AD/DA—数模/模数转换概念 数字电路只能处理二进制数字信号&#xff0c;而声音、温度、速度和光线等都是模拟量&#xff0c;利用相应的传感器&#xff08;如声音用话筒&#xff09;可以将它们转换成模拟信号&#xff0c;然后由A/D转换器将它们转换成二进制数字信号&#xff0c…...

Swift中的结构体

Swift中的结构体是一种自定义的数据类型&#xff0c;可用于存储多个相关的值。结构体可以包含属性和方法&#xff0c;从而使其具有特定的功能。 结构体与类相似&#xff0c;但有一些重要的区别。最重要的区别是&#xff0c;结构体是值类型&#xff0c;而类是引用类型。这意味着…...

Selenium - java - 屏幕截图

文档地址 Selenium 浏览器自动化项目 | Selenium 安装 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.19.1</version></dependency>使用 创建WebDriver实例 …...

【论文阅读——SplitFed: When Federated Learning Meets Split Learning】

级别CCFA 1.摘要 联邦学习&#xff08;FL&#xff09;和分割学习&#xff08;SL&#xff09;是两种流行的分布式机器学习方法。两者都采用了模型对数据的场景&#xff1b;客户端在不共享原始数据的情况下训练和测试机器学习模型。由于机器学习模型的架构在客户端和服务器之间…...

Python使用方式介绍

1.安装与版本和IDE 1.1 python2.x和python3.x区别 python2在2020已经不再维护&#xff0c;目前主流开发使用python3. 二者语法上略有区别&#xff1a;输入输出、数据处理、异常和默认编码等&#xff0c;如:python3中字符串为Unicode字符串&#xff0c;使用UTF-8编码&#xff…...

浅述python中NumPy包

NumPy&#xff08;Numerical Python&#xff09;是Python的一种开源的数值计算扩展&#xff0c;提供了多维数组对象ndarray&#xff0c;是一个快速、灵活的大数据容器&#xff0c;可以用来存储和处理大型矩阵&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;并针对数组运…...

jvm的面试回答

1、jvm由本地方法栈、虚拟机栈、方法区、程序计数器、堆组成&#xff0c;其中堆和方法区是线程间共享的&#xff0c;程序计数器、虚拟机栈和本地方法栈是线程私有的。 2、虚拟机栈&#xff1a; 保存每个java方法的调用、保存局部变量表、等 栈可能出现内存溢出&#xff0c;如果…...

打不动的蓝桥杯

打不动的蓝桥杯 2024-4-13 今天的蓝桥杯打得很烂&#xff0c;8题写了4题&#xff0c;100分可能有20来分吧。我写了的题好像都很简单&#xff0c;没什么竞争力。又觉得我知道的东西不止这么点&#xff0c;没能发挥。 这次比赛&#xff0c;首先&#xff0c;有强烈的陌生感。pytho…...

学习笔记——C语言基本概念文件——(13)

1、文件操作 1.1、文件概念 文件&#xff1a;实现数据存储的载体 1.2、文件的分类 按照数据的组织形式分类&#xff1a; 1.字符文件/文本文件 2.二进制文件 按照用途分类&#xff1a; 1.系统文件 2.库文件--标准库文件/非标准库文件&#xff08;第三方库&#xff09; 3.用…...

【MySQL】事务篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 目录 本系列专栏 1. 什么是事务 2. 事务的特征 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 隔离性&…...

tsconfig.json文件常用配置

最近在学ts&#xff0c;因为tsconfig的配置实在太多啦&#xff0c;所以写此文章用作记录&#xff0c;也作分享 作用&#xff1f; tsconfig.jsono是ts编译器的配置文件&#xff0c;ts编译器可以根据它的信息来对代码进行编译 初始化一个tsconfig文件 tsc -init配置参数解释 …...

【Linux】tcpdump P1 - 网络过滤选项

文章目录 选项 -D选项 -c X选项 -n选项 -s端口捕获 port选项 -w总结 tcpdump 实用程序用于捕获和分析网络流量。系统管理员可以使用它来查看实时流量或将输出保存到文件中稍后分析。本文将演示在日常使用 tcpdump时可能想要使用的几种常见选项。 选项 -D 使用-D 选项的 tcpdu…...

网络篇04 | 应用层 mqtt(物联网)

网络篇04 | 应用层 mqtt&#xff08;物联网&#xff09; 1. MQTT协议介绍1.1 MQTT简介1.2 MQTT协议设计规范1.3 MQTT协议主要特性 2 MQTT协议原理2.1 MQTT协议实现方式2.2 发布/订阅、主题、会话2.3 MQTT协议中的方法 3. MQTT协议数据包结构3.1 固定头&#xff08;Fixed header…...

Transformer模型-decoder解码器,target mask目标掩码的简明介绍

今天介绍transformer模型的decoder解码器&#xff0c;target mask目标掩码 背景 解码器层是对前面文章中提到的子层的包装器。它接受位置嵌入的目标序列&#xff0c;并将它们通过带掩码的多头注意力机制传递。使用掩码是为了防止解码器查看序列中的下一个标记。它迫使模型仅使用…...

群晖相册AI识别解锁指南:让无GPU设备也能享受智能相册功能

群晖相册AI识别解锁指南&#xff1a;让无GPU设备也能享受智能相册功能 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 你是否拥有DS918或DS3615xs等群…...

60.人工智能实战:大模型 SLO 怎么制定?从“感觉系统还行”到可量化的质量、延迟、成本与安全指标

人工智能实战:大模型 SLO 怎么制定?从“感觉系统还行”到可量化的质量、延迟、成本与安全指标 一、问题场景:业务问系统稳不稳定,团队只能说“还可以” 大模型系统上线后,业务方经常会问: 现在系统稳定吗? 效果有没有变好? 成本是否可控? 用户体验怎么样?如果团队只…...

Python 爬虫高级实战:异地多机房爬虫协同采集

前言 随着爬虫业务规模扩张&#xff0c;单机、单机房部署模式逐渐暴露出单点故障、IP 池单一、地域访问延迟高、目标站点区域风控封禁、单机房带宽资源瓶颈等一系列问题。单一机房所有爬虫出口 IP 归属同一运营商、同一地域&#xff0c;极易被目标站点基于地域、IP 段整体封禁…...

5-11测试文章白001

5-11测试文章白0015-11测试文章白0015-11测试文章白001...

AI 文档工作流里,那道正在被悄然割裂的“思想透明度”

在 AI 辅助的知识库构建、产品规格编写或 Agent 提示工程里&#xff0c;一份长文档从草稿到最终交付的过程&#xff0c;正面临一场隐形断裂。创作者先在纯文本里苦苦打磨思路&#xff0c;AI 却直接吐出一份排版精美、图文并茂的 HTML——看起来分享效率拉满&#xff0c;实际却把…...

从Arduino到STM32:GRBL固件选型、下载与刷写全攻略(2024版)

从Arduino到STM32&#xff1a;2024年GRBL固件选型与刷写实战指南 在DIY激光雕刻机和CNC设备的构建过程中&#xff0c;控制器的选择与GRBL固件的配置往往是决定项目成败的关键环节。面对市场上琳琅满目的硬件平台——从经典的Arduino Uno到性能更强的STM32系列开发板&#xff0…...

Android开发避坑:支付宝SDK返回4000错误,别急着改代码,先检查这个线程问题

Android开发深度解析&#xff1a;支付宝SDK返回4000错误的线程陷阱与系统级排查 当你在Android应用中集成支付宝支付功能时&#xff0c;是否遇到过这样的场景&#xff1a;一切配置看似正确&#xff0c;但调用支付接口后却收到了resultStatus:4000的错误提示&#xff0c;附带一句…...

VideoDownloadHelper深度解析:破解主流视频平台下载限制的技术实战

VideoDownloadHelper深度解析&#xff1a;破解主流视频平台下载限制的技术实战 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法保存…...

QMCDecode:解锁QQ音乐加密文件,三步实现音乐格式自由转换

QMCDecode&#xff1a;解锁QQ音乐加密文件&#xff0c;三步实现音乐格式自由转换 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&am…...

GitHub中文化插件终极实战指南:5分钟实现高效中文开发体验

GitHub中文化插件终极实战指南&#xff1a;5分钟实现高效中文开发体验 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese GitHub作为全球…...