基于单链表的通讯录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;
}

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

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

相关文章

pytest教程-25-生成覆盖率报告插件-pytest-cov

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest多重断言插件pytest-assume,本小节我们讲解一下pytest生成覆盖率报告插件pytest-cov。 测量代码覆盖率的工具在测试套件运行时观察你的代码&#xff0c;并跟踪哪些行被运行&#xff0c;…

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

【我的小工具】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

C语言操作符详解(三)

一、表达式求值 1.1整型提升 C语言中整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 如何进行整型提升呢&#xff1f; 1. 有符号整数提升是按…

不入耳开放式耳机哪个品牌好?2024年热销榜前五名品牌推荐

为何开放式耳机近年来如此火爆&#xff1f;首先&#xff0c;开放式耳机以其开放式的声学设计&#xff0c;打破了传统耳机的局限&#xff0c;为用户带来了更加自然、宽广的音质体验。其次&#xff0c;随着音乐文化的普及和人们对高品质生活的追求&#xff0c;开放式耳机作为高端…

QSettings保存配置信息,读取配置信息

保存配置 QSettings setting("config.ini",QSettings::IniFormat); setting.beginGroup("para"); setting.setValue("database","test"); setting.setValue("hostName","localhost"); setting.setValue("us…

PHP 转换HTML 为节点数组 ,可用于uni-app的rich-text渲染

在Web开发中&#xff0c;HTML文档的结构和内容往往需要通过编程方式进行操作和解析。PHP DOMDocument类是一个强大的工具&#xff0c;可以将HTML转换为可操作的对象结构&#xff0c;本文将介绍一下使用PHP的DOMDocument类将HTML转换为节点数组的过程。htmlToNodes函数将HTML字符…

4.9学习总结

一.File类 (一).概述: File 类的对象代表操作系统的文件&#xff08;文件、文件夹&#xff09;,File 类提供了诸如&#xff1a;创建文件对象代表文件&#xff0c;获取文件信息&#xff08;大小、修改时间&#xff09;、删除文件、创建文件&#xff08;文件夹&#xff09;等功…

HarmonyOS开发实例:【数字管家app】

一&#xff0e;概述 本应用是基于RK3399开发板&#xff0c;使用OpenHarmony3.1-Release开发的应用。通过OpenHarmony的分布式技术&#xff0c;使多人能够一起画画。 1.应用运行效果图&#xff1a; 2.分布式画板使用示意图 如上图所示&#xff0c;用户1、用户2在各自本地端进行…

Stack_经典例题_最小栈

题目&#xff1a; 题目分析&#xff1a; 在满足栈的特点的同时&#xff0c;还需要设计一个接口&#xff0c;就是获取栈内的最小元素&#xff01; 解题思路&#xff1a; 因为是栈&#xff0c;所以不好遍历的&#xff01;所以这题的方式不能采用遍历的方式&#xff0c;如果采取…

在FMCOS CPU卡上建立简单的测试PBOC支付环境

本文目的在于快速搭建一个简易的支付环境&#xff0c;方便进行电子钱包的圈存、消费测试。因此省略了许多数据文件及安全机制。 请勿将这个测试支付环境应用在生产系统中&#xff0c;否则可能带来极大的安全隐患。 建立简易的测试PBOC支付环境 在根目录&#xff08;3F00&…

C#使用Exchange Web服务(/EWS/exchange.asmx)发送邮件

使用Exchange Web服务发送邮件 发送代码&#xff0c;Mail类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography.X509Certificates; using System.Net; using System.Net.Security; using Microsof…

C++中的异常机制

1.异常是什么&#xff1f; 在 C 中&#xff0c;异常处理是一种用于处理程序运行时可能发生的错误或异常情况的机制。当某些异常情况发生时&#xff0c;程序可以通过抛出异常来通知调用栈&#xff0c;并且可以通过异常处理代码来捕获和处理这些异常。 2.检测异常的三个步骤 检查…

分布式锁-redission可重入锁原理

5.3 分布式锁-redission可重入锁原理 在Lock锁中&#xff0c;他是借助于底层的一个voaltile的一个state变量来记录重入的状态的&#xff0c;比如当前没有人持有这把锁&#xff0c;那么state0&#xff0c;假如有人持有这把锁&#xff0c;那么state1&#xff0c;如果持有这把锁的…

DELL VMWare R730 R740 R750 iDRAC配置与ESXI安装部署

VMware vCenter Server与ESXI版本兼容对照表 ESXI下载 VMware vcenter7.0许可证 Esxi7.0许可证 VSAN 7.0许可证 DELL VMWare R730 R740 R750 iDRAC配置与ESXI安装部署 vmware vcenter server 7.0 安装教程 1. 进入BIOS界面配置iDRAC网络 开机按F10&#xff0c;开机点击F10选择…

国家统计局行政区划获取及入库ES实践

我们先看下最终效果&#xff1a; 1. ES索引新建 PUT administrative_division {"mappings": {"properties": {"province": {"type": "keyword"},"province_code": {"type": "keyword"},&q…

docker安装oracle

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

C++从入门到精通——类和对象(中篇)

1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情况下&#xff0c;都会自动生成下面6个默认成员函数。 class Date {}; 2. 构造函数 2.1 概念 对于以下的日期类&am…

ChatGPT写作攻略:打造精彩论文的秘诀

ChatGPT无限次数:点击直达 ChatGPT写作攻略&#xff1a;打造精彩论文的秘诀 在当今信息爆炸的时代&#xff0c;人们对于高质量且引人入胜的文章需求日益增长。作为一名具有10年经验的CSDN网站原创文章优质创作者&#xff0c;我们不仅要拥有丰富的知识储备和写作技巧&#xff0…