单链表实现通讯录(增删查改)

前言

之前写了很多次通讯录,一次比一次复杂,从静态到动态,再到文件操作,再到顺序表,今天要好好复习一下单链表,于是乎干脆用单链表再写一遍。

首先我们之前已经用单链表写过他的增删查改了,于是乎,我们应该在此基础之上进行修改,而不是从头开始写,先把之前的增删查改拿出来

<<<<<<<<<——王子公主请看——>>>>>>>>>>>

SLT.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"contact.h"
typedef PeoInfo SLTDataType;
typedef struct SListNode
{
    SLTDataType val;
    struct SListNode* next;
}SLTNode;

//打印数据内容
//void SLTPrint(SLTNode* phead);
//创建对应类型变量
 SLTNode* creat(SLTDataType  x);
//头部插入删除/尾部插入删除
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);

查找
//SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
//在指定位置之前插入数据
void SLTInsertFront(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);
//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos);
//销毁链表
void SLTDesTroy(SLTNode** pphead);

SLT.c

#include"SLT.h"
//SLTNode* creat(SLTDataType  x)
//{
//    SLTNode* p = malloc(sizeof(SLTNode));
//    p->val = x;
//    p->next = NULL;
//    return p;
//}
SLTNode* creat(SLTDataType  x)
{
    SLTNode* p = malloc(sizeof(SLTNode));
    p->val = x;
    p->next = NULL;
    return p;
}
//void SLTPrint(SLTNode* phead)
//{
//    while (phead)
//    {
//        printf("%d  ", phead->val);
//        phead = phead->next;
//    }
//    puts("");
//}

//尾部插入
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
    assert(pphead);
        if (*pphead == NULL)
        *pphead = creat(x);
        else
        {
            while ((*pphead)->next)
            {
                *pphead = (*pphead)->next;
            }
            (*pphead)->next = creat(x);
        }
}
//头部插入
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
    assert(pphead);
    if (*pphead == NULL)
        if (*pphead == NULL)
            *pphead = creat(x);
        else
        {
            SLTNode* new = (*pphead);
            *pphead = creat(x);
            (*pphead)->next = new;
        }
}
//尾部删除
void SLTPopBack(SLTNode** pphead)
{
    assert(pphead);
    assert(*pphead);
    if (((*pphead)->next) == NULL)
        *pphead= NULL;
    else
    {
        while ((*pphead)->next->next)
        {
            (*pphead) = (*pphead)->next;
        }
        free((*pphead)->next);
        (*pphead)->next = NULL;
    }
}
//头部删除
void SLTPopFront(SLTNode** pphead)
{
    assert(pphead);
    assert(*pphead);
    SLTNode* new = (*pphead)->next;
    free(*pphead);
    *pphead = new;
}
//查找
//SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
//{
//    while (phead&&phead->val != x)
//        phead = phead->next;
//    if (phead == NULL)
//    {
//        printf("你要找的内容不存在\n");
//        return 0;
//    }
//    return phead;
//}
//在指定位置之前插入数据
void SLTInsertFront(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
    assert(pphead);
    assert(*pphead);
    assert(pos);
    if ((*pphead) == pos)
    {
        *pphead = creat(x);
        (*pphead)->next = pos;
    }
    else
    {
        while ((*pphead)->next != pos)
        {
            *pphead = (*pphead)->next;
        }
        SLTNode* new = (*pphead)->next;//不对劲!!!!!!
        (*pphead)->next = creat(x);
        (*pphead)->next->next = pos;
    }
}
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
    assert(pphead);
    assert(*pphead);
    if (*pphead == pos)
    {
        free(pos);
        *pphead = NULL;
    }
    else
    {
        while ((*pphead)->next != pos)
            *pphead = (*pphead)->next;
        (*pphead)->next = (*pphead)->next->next;
        free(pos);
        pos = NULL;
    }
}
//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
    assert(pos);
    SLTNode* new = pos->next;
    pos->next = creat(x);
    pos->next->next = new;
}
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos)
{
    assert(pos);
    SLTNode* new = pos->next;
    pos->next = pos->next->next;
    free(new);
}

//销毁链表

void SLTDesTroy(SLTNode** pphead)
{
    assert(pphead);
    while (*pphead != NULL)
    {
        SLTNode* p = (*pphead)->next;
        free(*pphead);
        *pphead = p;
    }
}

 contact.h

#pragma once
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
struct SListNode;
//前置声明
typedef struct SListNode contact;

//用户数据
typedef struct PersonInfo
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char tel[TEL_MAX];
    char addr[ADDR_MAX];
}PeoInfo;
typedef PeoInfo SLTDataType;
//创建对应数据类型
contact* creatt(void);
//初始化通讯录
void InitContact(contact** con);
//添加通讯录数据
void AddContact(contact** con);
//删除通讯录数据
void DelContact(contact** con);
//展示通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact** con);
//销毁通讯录数据
void DestroyContact(contact** con);

contact.c

#include"SLT.h"

SLTNode* creatt(void)
{
    SLTDataType a;
    printf("输入名字\n");
    gets(a.name);
    printf("输入地址\n");
    gets(a.addr);
    printf("输入性别\n");
    gets(a.sex);
    printf("输入电话\n");
    gets(a.tel);
    printf("输入年龄\n");
    scanf("%d", &a.age);
    getchar();
    SLTNode*p= creat(a);
    return p;
};
//初始化通讯录
void InitContact(contact** con)
{
  /*  FILE*p=fopen("contact", "rb");*/
        *con = (contact*)malloc(sizeof(contact));
     /*   contact* new = con;
        if (p != NULL)
           do
            {
                contact* ps = (contact*)(sizeof(contact));
                if (fread(ps, sizeof(contact), 1, p))
                    new->next = ps;
            }*/
}
//添加通讯录数据
void AddContact(contact** con)
{
    *con = creatt();
}
//删除通讯录数据
void DelContact(contact** con)
{
    SLTPopBack(con);
}
//展示通讯录数据
void ShowContact(contact* con)
{
    printf("姓名\t地址\t性别\t电话\t年龄\n");
    while (con)
    {
        printf("%s  \t", con->val.name);
        printf("%s  \t", con->val.addr);
        printf("%s  \t", con->val.sex);
        printf("%s  \t", con->val.tel);
        printf("%d  ", con->val.age);
        puts("");
        con = con->next;
    }
   
}
//查找通讯录数据
void FindContact(contact* con)
{
    printf("输入你要找的人名\n");
    char arr[20];
    gets(arr);
    if (con == NULL)
        printf("通讯录空了\n");
    else
    {
        while (con&&strcmp(con->val.name, arr))
        {
            con = con->next;
        }
        if (con != NULL)
        {
            printf("姓名\t地址\t性别\t电话\t年龄\n");
            printf("%s  \t", con->val.name);
            printf("%s  \t", con->val.addr);
            printf("%s  \t", con->val.sex);
            printf("%s  \t", con->val.tel);
            printf("%d  ", con->val.age);
            puts("");
        }
        else
            printf("没找到\n");
    }
}
//修改通讯录数据
void ModifyContact(contact** con)
{
    printf("输入你修改的人名\n");
    char arr[20];
    gets(arr);
    if (*con == NULL)
        printf("通讯录空了\n");
    else
    {
        while (*con&&strcmp((*con)->val.name, arr))
        {
            *con = (*con)->next;
        }
        if (*con == NULL)
            printf("没找到这个人\n");
        else
        {
            (*con) = creatt();
            printf("修改成功\n");
        }

    }
}
//销毁通讯录数据
void DestroyContact(contact** con)
{
    SLTDesTroy(con);
}

main函数


#include"SLT.h"
int main()
{
    contact* p=NULL;
    InitContact(&p);
    AddContact(&p);
    //删除通讯录数据
     //DelContact(&p);
    //展示通讯录数据
     ShowContact(p);
    //查找通讯录数据
     FindContact(p);
    //修改通讯录数据
     ModifyContact(&p);
    //销毁通讯录数据
     DestroyContact(&p);
}

好啦,之前写过详细的通讯录解析,所以这个就直接上答案了。

感谢观看!

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

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

相关文章

汽车网络安全管理体系框架与评价-汽车网络安全管理体系框架

R155《网络安全与网络安全管理系统》法规中明确指出 &#xff0c; 汽车制造商应完成 “汽车网络安全管理体系认证” &#xff08;简称&#xff1a; CSMS认证&#xff09;以及 “车辆型式审批&#xff02; 且CSMS认证&#xff0c;是车辆型式审批的前提条件。 虽然我国相关政策尚…

汽车网络安全dos, someip

汽车Cyber Security入门之DoS 攻防 - 知乎 3、SOME/IP-TP 近年来火热地谈论下一代EE架构和SOA的时候&#xff0c;总离不开SOME/IP这个进程间通讯协议。在许多应用场景中&#xff0c;需要通过UDP传输大型的SOME/IP有效载荷。鉴于在以太网上传输数据包的大小限制&#xff0c;SO…

应用案例:Ruff工业设备数据采集,为生产制造企业数字化转型赋能

导读&#xff1a;某金属材料生产制造企业&#xff0c;引进了整套Ruff数据采集方案&#xff0c;将Ruff网关采集到的PLC数据接入到Ruff IoT管理云平台&#xff0c;帮助客户实现覆盖全厂区、车间所有设备的数字化、可视化管理&#xff0c;避免了意外停机风险&#xff0c;IT运维工作…

力扣3. 无重复字符的最长子串(滑动窗口)

Problem: 3. 无重复字符的最长子串 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 由于题目要求求出字符串中最长的连续无重复字符的最长子串&#xff0c;所以利用这个特性我们可以比较容易的想到利用双指针中的滑动窗口技巧来解决&#xff0c;但在实际的求解中…

C语言——指针进阶(四)

目录 一.前言 二.指针和数组笔试题解析 2.1 二维数组 2.2 指针笔试题 三.全部代码 四.结语 一.前言 本文我们将迎来指针的结尾&#xff0c;包含了二维数组与指针的试题解析。码字不易&#xff0c;希望大家多多支持我呀&#xff01;&#xff08;三连&#xff0b;关注&…

智能电话机器人好不好

随着人工智能的出现&#xff0c;越来越多的智能电话机器人出现在我们的日常生活中&#xff0c;很多的电话营销公司的老板们非常看重这款产品&#xff0c;都希望通过第一次电话审查将公司电话营销人员的精力和时间投入到更准确的客户身上。那么智能电话机器人好不好电销机器人有…

【论文阅读】Vlogger: Make Your Dream A Vlog

Vlogger&#xff1a;把你的梦想变成Vlog paper&#xff1a;https://arxiv.org/abs/2401.09414 code&#xff1a;https://github.com/zhuangshaobin/vlogger 看起来挺有意思的&#xff0c;有空读一下 本文提出Vlogger&#xff0c;一种用于生成用户描述的分钟级视频博客(即vlo…

Python实现时间序列分析自回归模型(AutoReg算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中的自回归模型&#xff08;AutoRegressive Model&#xff0c;简称AR模型&#xff09;是一…

Intel Processor Trace(三)

文章目录 前言一、Packet Relationships and Ordering1.1 Packet Blocks 二、Packet Definitions2.1 Taken/Not-taken (TNT) Packet2.2 Target IP (TIP) Packet2.2.1 IP Compression2.2.2 Indirect Transfer Compression for Returns (RET) 2.3 Deferred TIPs2.4 Packet Genera…

拼接url - 华为OD统一考试

OD统一考试 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个 url 前缀和 url 后缀, 通过 “,” 分割&#xff0c; 需要将其连接为一个完整的 url 。 如果前缀结尾和后缀开头都没有 /&#xff0c;需要自动补上 / 连接符&#xff1b; 如果前缀结…

03 Verilog HDL 语法

Verilog HDL&#xff08;Hardware Description Language&#xff09;是在 C 语言的基础上发展起来的一种硬件描述语言&#xff08;用它可以表示逻辑电路图、逻辑表达式、数字逻辑系统所完成的逻辑功能等&#xff09;具有灵活性高、易学易用等特点。Verilog HDL 可以在较短的时间…

【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数

这段代码功能是根据提供的配置字典&#xff08;d&#xff09;和输入通道列表&#xff08;ch&#xff09;来解析并构建一个YOLOv5模型。函数的核心工作是遍历模型的每一层&#xff0c;并根据配置创建相应的神经网络层。 我们可以在函数中为新增模块配置构造参数设置。 函数中 f…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-3 getBoundingClientRect()

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>getBoundingClientRect()</title> </head> <script>function getRect(){var obj document.getElementById(example); //获取元素对象var objR…

【数据结构1-3】集合

有时候&#xff0c;我们并不关心数据之间的前后关系&#xff0c;也不关心数据的层次关系。一些确定元素只是单纯的聚集在一起&#xff0c;这样的元素聚集体被称为集合。 当希望知道某个数据是否存在一个集合中&#xff0c;或者两个元素是否在同一个集合中时&#xff0c;就需要使…

IP关联是什么?有什么后果?如何防止电商账号因IP关联被封?

在跨境电商的世界里&#xff0c;IP关联给多账号运营的商家带来了挑战。比如&#xff0c;亚马逊IP关联规则的执行对于那些经营多个店铺的卖家来说可能是一个不小的障碍。IP关联的影响不只是限于亚马逊&#xff0c;其他平台如Instagram、Facebook也有类似的机制&#xff0c;在之前…

PHP语法

#本来是在学命令执行&#xff0c;所以学了学&#xff0c;后来发现&#xff0c;PHP语法和命令执行的关系好像没有那么大&#xff0c;不如直接学php的一些命令执行函数了。# #但是还是更一下&#xff0c;毕竟还是很多地方都要求掌握php作为脚本语言&#xff0c;所以就学了前面的…

HTML新手教程

HTML入门 教程&#xff1a;【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 一.初识HTML HyperTextMarkupLanguage&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画。 HTML5的优势 世界知名浏览器厂商对HTML5的支持市场的…

无人值守变电所运维在海南市某住宅区的应用

1 前言 随着国家电网改革政策的逐步推进和落实&#xff0c;AcrelCloud-1000变电所运维云平台运用互联网和大数据技术&#xff0c;为电力运维公司提供变电所运维云平台。该平台作为连接运维单位和用电企业的纽带&#xff0c;监视用户配电系统的运行状态和电量数据&#xff0c;为…

Vue3使用setup-extend简化组件名写法

如果我们在Vue3中要使用setup的语法糖&#xff0c;就需要使用两个script标签&#xff0c;一个用于设置组件的name属性&#xff0c;一个用于编写setup中的代码。如下&#xff1a; 但是我们有觉得光是因为一个name属性就多写一个script标签有点麻烦了。 因此我们可以使用插件来进…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式&#xff0c;主要解决接口选择的问题。能够创建一系列相关的对象&#xff0c;而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族&#xff0c;且这些产品族类的产品需实现同样的接口。 例如&#xff1a;有…