有头单向链表的函数操作(详细版)

news2024/9/22 4:18:47

 【1】代码展示

#include <stdio.h>
#include <stdlib.h>
typedef char datatype; // 重定义字符类型
typedef struct node
{
    datatype data;     // 数据用来存数据
    struct node *next; // 指针域用来存下一个节点的地址
} Node_t, *Node_p;     // 重定义结构体数据类型,和结构体指针类型
/*创建一个空的单向链表*/
Node_p Create()
{
    Node_p p = (Node_p)malloc(sizeof(Node_t)); // 开辟一个节点大小的堆区空间
    if (NULL == p)                             // 开辟失败
    {
        printf("malloc lost");
        return NULL;
    }
    p->next = NULL; // 初始化头节点指针域
    return p;       // 开辟成功,返回
}

/*计算链表的长度*/
int Length(Node_p p)
{
    int len = 0;            // 定义一个变量来表示长度,并赋初始值为0
    while (p->next != NULL) // 当指针域不等于NULL就说明没到最后一个节点
    {
        p = p->next; // 指针向下一个节点移动
        len++;       // 长度加加
    }
    return len; // 返回长度值
}

/*向项链表中插入数据*/
void Insert(Node_p p, int post, int data)
// p 保存链表的头指针   post 要插入的位置   data  要插入的数据
{
    // 容错判断
    if (post < 0 || post > Length(p)) // 插入位置小于0或大于链表长度
    {
        printf("post error");
    }
    Node_p p_new = NULL;           // 创建一个指针,置空备用,用来存放要插入的新数据
    for (int i = 0; i < post; i++) // for循环遍历到要查如位置前的那该个节点
        p = p->next;
    p_new = (Node_p)malloc(sizeof(Node_t)); // 开辟一个节点大小堆区空间存放新数据
    if (NULL == p_new)
    {
        printf("malloc lost");
    }
    p_new->data = data; // 在数据域存放要查入的数据
    p_new->next = NULL; // 初始化为NULL;
    // 链接新节点时,要先连后面,再连前面(否则,先连前面后面的地址就找不到了)
    p_new->next = p->next; // 让新节点链接到要插入的位置节点上
    p->next = p_new;       // 让要插入位置前的那个节点连接到新的节点上
}

/*修改链表的内容*/
void Modify(Node_p p, int post, int data)
// p 保存链表的头指针  post  要修改的数据位置  data   要修改成的数据
{
    // 容错判断
    if (post < 0 || post > Length(p))
    {
        printf("error\n");
    }
    for (int i = 0; i < post; i++) // for循环遍历到要插入位置前的那该个节点
        p = p->next;
    Node_p mod = p->next; // 定义一个指针指向要插入位置的节点
    mod->data = data;     // 修改要修改的值
}

/*删除链表的内容*/
void Delete(Node_p p, int post)
// p 保存链表的头指针  post  要删除的数据位置
{
    // 容错判断
    if (post < 0 || post > Length(p))
    {
        printf("delete error\n");
    }
    for (int i = 0; i < post; i++)
        p = p->next;
    Node_p p_del; // 定义一个指针指向要删除的节点
    p_del = p->next;
    p->next = p_del->next; // 让被删除的节点前的那个节点链接到被删除的那个节点后的节点
    free(p_del);           // 释放被删除的那个节点
    p_del = NULL;          // 将指向被删除的那个节点的指针置空
}

/*查找链表中的内容*/
int Search(Node_p p, int post)
// p 保存链表的头指针  post  要查询的数据位置
{
    // 容错判断
    if (post < 0 || post > Length(p))
    {
        printf("error\n");
        return -1;
    }
    for (int i = 0; i <= post; i++) // for 循环遍历到要查询的节点位置
        p = p->next;
    return p->data; // 返回查询的节点数据域中的内容
}

/*清空链表的内容*/
void Clear(Node_p p)
{
    Node_p p_del = NULL;  // 定义一个指针置空待用,永远指向要清空的节点
    p_del = p->next;      // 头节点不需要清除,所以先指向头节点下一个节点
    while (p_del != NULL) // 当p_del所指向的节点不为空时,进入循环
    {
        p->next = p_del->next; // 让头节点跨过要清除的节点,链接下一个节点
        free(p_del);           // 把这个要清空的节点free删除掉
        p_del = p->next;       // 然后让p_del 指向下一个要清空的节点
    }
}

/*删除指定数据的节点*/
void DeleteSame(Node_p p, int data)
{
    Node_p q = p->next; // 头节点数据域无效,所以要先移动到下一个节点
    while (q != NULL)   // 只要节点不是NULL,就进入循环
    {
        if (q->data == data) // 如果该节点的数据域内容和指定数据相等
        {
            p->next = q->next; // 越过该节点(数据域和指定数据数据相等),链接下一个节点
            free(q);           // 把该节点free释放掉
            q = p->next;       // 让该指针指向下一节点,以便下一次判断
        }
        else // 如果该节点的数据域内容和指定数据不相等
        {
            p = p->next; // 两个指针都往后移动,以便进行下一次比较和删除
            q = q->next;
        }
    }
}

/*转置链表*/
void Reserve(Node_p p)
{
    Node_p q = NULL; // 创建两个指针置空待用
    Node_p t = NULL;
    q = p->next;      // 让q指针指向头节点的下一个节点
    p->next = NULL;   // 让头节点的指针域置空,和后面的链表断开
    while (q != NULL) // q不等于NULL就一直循环     整个操作就只是对q指针进行操作,t指针只负责保存下一个节点
    {
        t = q->next; // 让t等于q的下一个节点,保存一下q的下一个节点
        // 把q节点用头插法插入到 头节点和与头节点相连的那个节点之间
        q->next = p->next;
        p->next = q;
        q = t; // 让q再移到刚才保存的下一个节点处
    }
}

/*遍历链表*/
void show(Node_p p)
// p 保存链表的头指针
{
    while (p->next != NULL)
    {
        p = p->next;
        printf("%d ", p->data);
    }
    printf("\n");
}

int main(int argc, char const *argv[])
{
    Node_p H = Create(); // 创建空链表
    Insert(H, 0, 1);     // 插入数据
    Insert(H, 1, 2);
    Insert(H, 2, 1);
    Insert(H, 3, 4);
    Insert(H, 4, 5);
    printf("插入后: ");
    printf("长度: %d\n数据: ", Length(H));
    show(H);      // 遍历链表
    Delete(H, 1); // 删除数据
    printf("删除后: ");
    show(H);
    printf("查询数据: ");
    Search(H, 2);     // 查询数据
    Modify(H, 2, 10); // 修改数据
    printf("修改后: ");
    show(H);
    Reserve(H); // 转置链表
    printf("倒置后: ");
    show(H);
    DeleteSame(H, 1); // 删除指定数据节点
    printf("删除指定数据节点: ");
    show(H);
    Clear(H);
    printf("清空后: ");
    printf("长度:%d\n", Length(H));
    return 0;
}

 【2】运行结果

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

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

相关文章

5G三防加固平板电脑的特点与应用

随着信息技术的不断发展&#xff0c;5G通信技术也逐渐融入到三防平板电脑中。5G三防加固平板电脑是一种专为恶劣环境和工作场景设计的移动设备。它结合了5G通信技术、三防功能和加固设计&#xff0c;可以为用户带来更加高效、稳定、安全的使用体验。下面&#xff0c;我们来看看…

手把手系列 | 使用Milvus、Llama 3、Ollama、LangChain本地设置RAG应用

随着 Llama、Mistral、Gemma 等开源大语言模型&#xff08;LLM&#xff09;的出现&#xff0c;我们越来越能感受到 LLM 的力量&#xff0c;而本地运行基于 LLM 的 RAG 应用的需求越来越强烈。在将应用推至生产环境前&#xff0c;我们往往都需要先本地运行和测试。 因此&#xf…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

qemu启动iso/vmdk转换为qcow2镜像

安装qemu安装 https://qemu.weilnetz.de/w64/ 下载链接 Rock安装 https://rockylinux.org/zh-CN/download 下载&#xff0c;可以使用360等国产浏览器&#xff0c;可能自带加速功能&#xff0c;我这里使用最小版本 安装后在vmware中启动&#xff0c;无ip解决方案 执行命令 n…

OV SSL证书:增强网站信任与安全的重要保障

随着互联网的快速发展&#xff0c;电子商务、在线金融等行业的繁荣&#xff0c;网络安全问题日益凸显。为了确保用户数据的安全性和传输过程中的加密性&#xff0c;SSL证书&#xff08;Secure Sockets Layer&#xff09;成为了保护网站安全的重要工具。其中&#xff0c;OV SSL证…

跨平台无缝编辑,2024年免费视频剪辑工具全解析

在众多视频剪辑工具中&#xff0c;免费视频剪辑软件凭借其易用性、功能丰富性以及零成本的优势&#xff0c;赢得了广大用户的青睐。今天&#xff0c;就让我们一起盘点那些2024年大家都在用的免费视频剪辑软件&#xff0c;探索它们如何助力我们轻松实现创意梦想。 1.福昕视频剪…

基于springboot的太原学院商铺管理系统--论文pf

TOC springboot486基于springboot的太原学院商铺管理系统--论文pf 第1章 绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展&#xff0c;用了短短的几十年时间就风靡全球&#xff0c;使得全球各个行业都进行了互联网的改造升级&#xff0c;标志着互联网浪潮的来临。在这…

机器人策略学习的Game Changer?伯克利提出Body Transformer

过去几年间&#xff0c;Transformer 架构已经取得了巨大的成功&#xff0c;同时其也衍生出了大量变体&#xff0c;比如擅长处理视觉任务的 Vision Transformer&#xff08;ViT&#xff09;。本文要介绍的 Body Transformer&#xff08;BoT&#xff09; 则是非常适合机器人策略学…

大语言模型 (LLM)是什么_

01.语言模型与大语言模型 2023年&#xff0c;让整个人类最为振奋的AI技术就是ChatGPT。“大语言模型&#xff08;Large Language Model&#xff09;”这个词也随之映入人们的眼帘。ChatGPT让人觉得惊艳之处&#xff0c;能够结合上下文&#xff0c;像人一样有逻辑性地回答问题&…

用Python在Ashare获取金融数据官方文档解读

Ashare&#xff0c;也被写作AKShare&#xff0c;是一个基于Python的开源完全免费的财经数据接口库。它的主要目的是为用户提供股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据的采集、清洗和落地的一整套工具。AKSha…

智慧空调离线语音控制方案:NRK3301芯片的深度解析与应用

随着AI技术的大爆发和智能家居的风潮&#xff0c;语音交互已成为智能家居产品的一项必备技能&#xff0c;在家电、音箱、穿戴设备乃至墙壁开关等贴近生活的产品中应用越来越广泛&#xff0c;智能语音识别是当前最热门的方案之一。 九芯智能顺应家居行业智能语音交互市场需求&a…

平面设计艺术:从基础到精通

平面设计是一门结合视觉艺术与技术技能的学科&#xff0c;旨在通过视觉元素传达信息和美感。本文将为初学者提供一个全面的平面设计入门指南&#xff0c;涵盖基础理论、设计流程和实用技巧。在平面设计中&#xff0c;创意和技术相辅相成。设计师使用强大的平面设计工具&#xf…

【C++】入门篇一

【C】入门篇一 一 .缺省参数1.缺省参数的概念2. 缺省参数分类 二. 函数重载1. 函数重载概念2.函数重载代码举例 三.引用1.引用的概念2. 引用特性3. 常引用4. 使用场景(1). 做参数(2). 做返回值 5. 传值、传引用效率比较6. 引用和指针的区别7.引用和指针的不同点 一 .缺省参数 …

实验十 编写子程序《汇编语言》- 王爽

一. 显示字符串 1. 需求 显示字符串是现实工作中经常要用到的功能&#xff0c;应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口&#xff0c;使用者可以决定显示的位置&#xff08;行、列&#xff09;、内容和颜色。 子程序描述 名称&#xff1a;show_str…

【目标检测】Transformers在小目标检测中的应用:最新技术的基准测试和调查

《Transformers in Small Object Detection: A Benchmark and Survey of State-of-the-Art》 Transformers在小目标检测中的应用&#xff1a;最新技术的基准测试和调查 原文&#xff1a;https://arxiv.org/abs/2309.04902 1 研究背景和目的 小目标检测&#xff08;SOD&#x…

calico安装

3.20 版本 https://blog.csdn.net/weixin_42094245/article/details/131633980 手动创建了/var/lib/calico/nodename 手动更新了这2个资源 ll /etc/cni 摆烂了 装个3.8.0的 curl 172.30.30.64:32568 curl: (7) Failed connect to 172.30.30.64:32568; Connection timed o…

修复线上问题,又造成了个Bug

项目场景 这是一位朋友给我分享的实际线上问题&#xff0c;看似简单却害了项目再次造出一个bug来。 场景&#xff1a;线上环境中&#xff0c;需要查询某某业务数据&#xff0c;条件是状态&#xff0c;之前产品只要求查两个状态的&#xff0c;但现在让他再多查一个状态的。 自…

编程思维模式比编程语言内容等更重要也更难传授-2024-机器人篇

历程 在2015年起步&#xff0c;然后不断迭代更新优化。 2019&#xff1a;机器人编程实践-ROS2基础与应用- 第四版纲要 里面的重点就是机器人编程的方法论&#xff01; 2022&#xff1a;机器人编程实践-ROS2基础与应用-第⑦版 2022&#xff1a;ROS2机器人编程实践基础与应用…

macOS系统(intel)编译MAVSDK安卓平台so库

1.克隆mavsdk源码: git clone https://github.com/mavlink/MAVSDK.git --recursive 生成makefile前先手动修改protobuf版本为最新的(如:27.3) 下载的与你安装的版本要一致: 手动编译并安装libLZMA与openssl 如proto文件有修改,需要手动运行 ./tools/generate_from_protoc.sh重…

9 正则表达式:Java爬虫和正则表达式、String中的正则表达式方法(基本语法7)

文章目录 前言一、正则表达式1 [ ] 语法(1)[ABC] 和 [^ABC](2)[A-Z]和[a-zA-Z]小总结2 特殊字符语法(\w 这些)3 数量符4 \ 、()、 |5 锚点 ^ 和 $,\b,\B6 (?i) : 忽略其后面的大小写 ---- 这个Java是可以的,其他语言我不知道(正则表达式虽然大多通用,但也有部分是…