深度解析带头节点单链表的增删改查与销毁链表等操作(含算法编写步骤,有完整代码)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 深度解析带头节点单链表的增删改查与销毁链表等操作(含算法编写步骤,有完整代码)

目录


带头节点单链表的结构体

增加节点

算法思路

代码实现

删除节点

算法思路

代码实现

更新节点值

算法思路

代码实现

查找节点值是否存在

算法思路

代码实现

销毁链表

算法思路

代码实现


正文


带头节点单链表的结构体


typedef int ElemType;
typedef struct node
{
    ElemType data;//数据域
    struct node *next;//指针域
}Node;
//头结点:不保存数据 只有两个指针 加一个结点数目
typedef struct linkedlist
{
    Node *first;//指向链表中的第一个数据结点
    Node *last;//指向链表中的最后一个数据结点
    ElemType NodeNum;//结点的数目
    //...根据具体需求 增加其它的成员变量
}List;


增加节点


算法思路


在链表中找到值为x的结点,在它前面插入一个值为a的结点,如果没有找到,就加在最后,将新链表返回。

   step1:创建一个新的结点 把数据写进去

   step2:找到值为x的点

   step3:分情况插入


代码实现


/*
    add_a_node:在链表中找到值为x的结点 在它前面插入值为a的结点,没有则加到最后。
    @list:原来的链表的头结点
    @x:遍历要找到的值
    @a:要插入的结点值
*/
List* add_a_node(List *list, ElemType x, ElemType a)
{
    Node *p = NULL;//遍历指针
    Node *pre = NULL;//指向p前面的那个结点
    Node *pnew = NULL;//指向新创建的结点
    //step1:创建一个新的结点 把数据写进去
    pnew = malloc(sizeof(*pnew));    
    pnew->data = a;
    pnew->next = NULL;
    //step2:找到值为x的点
    p = list->first;
    while(p)
    {   
        if(p->data == x)
        {
            break;
        }
        pre = p;//pre往后移
        p = p->next;//p也往后移
    }
    //step3:分情况插入
    if(p != NULL)//找到了
    {
        if(p == list->first)//头插 
        {
            pnew->next = list->first;
            list->first = pnew;
        }
        else//中间插入
        {
            pnew->next = p;
            pre->next = pnew;
        }
    }
    else//没找到 插尾
    {
        if(list->first == NULL)
        {
            list->first = pnew;
            list->last = pnew;
        }
        else
        {
            list->last->next = pnew;
            list->last = pnew;
        }
    }
    list->NodeNum++;
    return list;
}


删除节点


算法思路


在链表中找到值为x的结点,将其删除,没有找到,就不删除,将新链表返回。

   算法思路:

       step1:遍历 找到值为x的结点

       step2:分情况删除


代码实现


/*
    删:在链表中找到值为x的结点,将其删除,没有找到,就不删除,将新链表返回。
  算法思路:
    step1:遍历 找到值为x的结点
    step2:分情况删除
*/
List *delete_x(List *list, ElemType x)
{
    Node *p = NULL;//遍历指针
    Node *pre = NULL;//指向p前面的那个结点
    p = list->first;
    //step1:遍历 找到值为x的结点
    while(p)
    {
        if(p->data == x)//找到了
        {
            //step2:分情况删除
            if(p == list->first)//要删除的结点为第一个
            {
                list->first = list->first->next;
                p->next = NULL;
                free(p);
                p = list->first;
            }
            else if(p == list->last)//要删的结点为最后
            {
                list->last = pre;
                list->last->next = NULL;
                free(p);
                p = NULL;
            }
            else//要删除的结点为空间
            {
                pre->next = p->next;
                p->next = NULL;
                free(p);
                p = pre->next;
            }
            list->NodeNum--;
        }
        else//没找到 接着往后找
        {
            pre = p;
            p = p->next;
        }
        if(list->NodeNum == 0)
        {
            list->last = NULL;
        }
    }
    return list;
}


更新节点值


算法思路


      把list头结点指向的链表,值为x的结点改为a。

           算法思路:

               遍历找x。

代码实现


/*
    update_node:更新一个链表的值 把x变为a。
    @list: 要更新的链表
    @x:要修改的数据结点的值
    @a: 要更新后数据结点的值
    返回值:
        更新完链表C的头结点
*/
List *update_node(List *list, ElemType x, ElemType a)
{
    Node *p = list->first;
    while(p)
    {
        if(p->data == x)
        {
            p->data = a;
        }
        p = p->next;
    }
    return list;
}


查找节点值是否存在


算法思路


        把list头结点指向的链表,找到链表中是否有值为x的结点。

           算法思路:

               遍历找x。


代码实现


/* 
    find_node:查找一个值是否存在与链表中
     @list: 要更新的链表
    @x:要查找的数据结点的值
    返回值:
        1 该值存在与链表中
        0 该值不存在与链表中
 */
int find_node(List *list,int x)
{
    Node *p = list->first;
    while(p)
    {
        if(p->data == x)
        {
            return 1;
        }
        p = p->next;
    }
    return 0;
}


销毁链表


算法思路

 

       s1: 把数据结点一个个摘除 free掉

       s2:free掉头结点


代码实现


/*
    destory_list: 销毁一个链表
    @list: 要更新的链表
*/
void destory_list(List *list)
{
    Node *p = list->first;
    //s1: 把数据结点一个个摘除 free掉
    while(p)
    {
        list->first = list->first->next;
        p->next = NULL;
        free(p);
        p = list->first;
    }
    //s2:free掉头结点
    list->last = NULL;
    list->NodeNum = 0;
    free(list);  
}


目录
打赏
0
0
0
0
161
分享
相关文章
实现一个带有昼夜背景切换的动态时钟:从代码到功能解析
本文介绍了一个使用Python和Tkinter库实现的动态时钟程序,具有昼夜背景切换、指针颜色随机变化及整点和半点报时功能。通过设置不同的背景颜色和随机变换指针颜色,增强视觉吸引力;利用多线程技术确保音频播放不影响主程序运行。该程序结合了Tkinter、Pygame、Pytz等库,提供了一个美观且实用的时间显示工具。欢迎点赞、关注、转发、收藏!
148 94
|
1月前
|
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
41 5
算法系列之递归反转单链表
|
16天前
|
员工电脑监控系统中的 C# 链表算法剖析-如何监控员工的电脑
当代企业管理体系中,员工电脑监控已成为一个具有重要研究价值与实践意义的关键议题。随着数字化办公模式的广泛普及,企业亟需确保员工对公司资源的合理利用,维护网络安全环境,并提升整体工作效率。有效的电脑监控手段对于企业实现这些目标具有不可忽视的作用,而这一过程离不开精妙的数据结构与算法作为技术支撑。本文旨在深入探究链表(Linked List)这一经典数据结构在员工电脑监控场景中的具体应用,并通过 C# 编程语言给出详尽的代码实现与解析。
36 5
|
23天前
|
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
45 5
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
97 29
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
26 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
125 25
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
248 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
570 11

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等