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

前言

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

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

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

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);
}

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

感谢观看!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.28回溯(中等)

目录 1.格雷编码 2. 复原 IP 地址 3. 火柴拼正方形 1.格雷编码 n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相…

备战蓝桥杯----贪心算法(二进制)

已经差不多掌握了贪心的基本思想&#xff0c;让我们看几道比较趣的题吧&#xff01; 先来个比较有意思的题热热身&#xff1a; 法1.我们可以先把l,r化成二进制的形式。 然后分俩种情况&#xff1a; &#xff08;1&#xff09;若他们位数不一样并且位数高的全为1&#xff0c;…

在Shopee菲律宾站点进行选品时的策略

随着电子商务的快速发展&#xff0c;越来越多的卖家开始将目光投向了海外市场。作为东南亚地区最大的电商平台之一&#xff0c;Shopee菲律宾站点吸引了众多卖家的关注。然而&#xff0c;在这个竞争激烈的市场上&#xff0c;卖家需要制定一系列的策略&#xff0c;才能在选品中脱…

arcgis 批量删除字段

一、打开ArcToolbox-数据管理工具-字段-删除字段。 二、在输入表中选择要删除字段的要素&#xff0c;在删除字段栏中选择要删除的字段&#xff0c;点击确认即可。

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明&#xff08;经常忘记怎么用&#xff1f;&#xff09;&#xff08;常改&#xff09; 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门&#xff1b;Close关门&#xff1b;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

基于saltstack开发自动化开通主机防火墙策略工具

一、前言 企业安全防护策略中会要求操作系统开启防火墙&#xff0c;开启iptables防火墙后&#xff0c;对于业务网络访问意味着要经常去变更调整iptables防火墙策略。如果是管理几台服务器&#xff0c;手工登录操作下还能接受。但在实际大型IT架构中&#xff0c;可能涉及到的服…

【JavaScript基础入门】05 JavaScript基础语法(三)

JavaScript基础语法&#xff08;三&#xff09; 目录 JavaScript基础语法&#xff08;三&#xff09;数组概述数组语法多维数组 操作数组修改数组获取数组长度数组和字符串之间的转换添加和删除数组项 Null 和 Undefined字符串连接字符串字符串转换获取字符串的长度在字符串中查…

后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 1…

合合信息技术能力

体验中心网址&#xff1a; https://www.textin.com/TextIn体验中心 - 在线免费体验中心https://www.textin.com/ 合合技术团队CSDN&#xff1a; 合合技术团队的博客_CSDN博客-基于深度学习的文本检测与识别技术白皮书,【通用文本信息抽取技术白皮书】,【技术应用】领域博主 …

xss靶场实战

靶场链接&#xff1a;https://pan.baidu.com/s/1ors60QJujcmIZPf3iU3SmA?pwd4mg4 提取码&#xff1a;4mg4 XSS漏洞原理 XSS又叫CSS&#xff08;Cross Site Script&#xff09;&#xff0c;跨站脚本攻击。因为与html中的css样式同&#xff0c;所以称之为XSS。在OWASP top 1…

Python Tornado 实现SSE服务端主动推送方案

一、SSE 服务端消息推送 SSE 是 Server-Sent Events 的简称&#xff0c; 是一种服务器端到客户端(浏览器)的单项消息推送。对应的浏览器端实现 Event Source 接口被制定为HTML5 的一部分。相比于 WebSocket&#xff0c;服务器端和客户端工作量都要小很多、简单很多&#xff0c…

深度强化学习(王树森)笔记05

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

政安晨的机器学习笔记——基于Ubuntu系统的Miniconda安装Jupyter Notebook

一、准备工作 Miniconda的安装请参考我的另一篇博客文章&#xff1a; 实例讲解深度学习工具PyTorch在Ubuntu系统上的安装入门&#xff08;基于Miniconda&#xff09;&#xff08;非常详细&#xff09;https://blog.csdn.net/snowdenkeke/article/details/135887509 这里…

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用 抽象工厂模式 创建 人物与宠物 模型&#xff0c; 首先资源商店下载 人物与宠物…

C++STL之map、set的使用和模拟实现

绪论​&#xff1a; “我这个人走得很慢&#xff0c;但是我从不后退。——亚伯拉罕林肯”&#xff0c;本章是接上一章搜索二叉树中红黑树的后续文章&#xff0c;若没有看过强烈建议观看&#xff0c;否则后面模拟实现部分很看懂其代码原理。本章主要讲了map、set是如何使用的&am…

torch与cuda\cudnn和torchvision的对应

以上图片来源于这篇博客 于是&#xff0c;我需要手动下载0.9.0torchvision 直接在网站https://pypi.tuna.tsinghua.edu.cn/simple/后面加上torchvision&#xff0c;就不用ctrlF搜torchvision了&#xff0c;即进入下面这个网站&#xff0c;找到对应版本的包下载安装即可 https…

html页面练习——公司发展流程图

1.效果图 2.html <div class"center"><header><h1>发展历程</h1><h3>CONMPANY HISTORY</h3></header><main><div class"left"><div class"time1">2012.12</div><div cla…

C/C++编码问题研究

文章目录 一、Unicode字符集与U8/U16/U32编码二、编码1. 占字节数2. ASCII、GB2312、GBK、GB18030 以及 UTF8 的关系3. BOM4. UTF-8的存储实现 三、编译器字符集设置1. GCC语法Example 2. MSVC语法Example 三、wchar_t五、编码转换函数六、代码 & 实践1. UTF8与UTF16、UTF3…

opencv#35 连通域分析

连通域分割原理 像素领域介绍: 4邻域是指中心的像素与它邻近的上下左右一共有4个像素&#xff0c;那么称这4个像素为中心像素的4邻域。 8邻域是以中心像素周围的8个像素分别是上下左右和对角线上的4个像素。 连通域的定义(分割)分为两种:以4邻域为相邻判定条件的连通域分割和…