【数据结构】单链表定义及基本操作

单链表的定义 单链表的定义 单链表:线性表的链式存储,通过一组任意的存储单元来存储线性表中的数据元素。 typedef struct LNode // 定义单链表结点类型 { ElemType data; // 数据域,每个节点存放一个数据元素 struct LNode *next; // 指针域,指针指向下一个节点 }LNode, *LinkList; // 别名 不带头结点的单链表 typedef struct LNode // 定义单链表结点类型 { ElemType data; // 阅读详情
//单链表定义及各类操作
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int Elemtype;

//定义单链表节点类型
typedef struct LNode
{
    Elemtype data; //数据域
    struct LNode *next; //指针域
} LinkList;

//初始化单链表
int InitList(LinkList *L){
    L = NULL; //空表
    printf("初始化完成\n");
    return 0;
}

//按位查找,返回目标节点
LinkList *GetElem(LinkList *L, int i){
    int j = 0; //计数,初始为0
    LinkList *p = L;
    if (i<1) //i无效,返回NULL
        return NULL;
    while (j < i)
    {
        p = p->next;
        j++;
    }
    return p;
}

//按值查找,返回目标节点
LinkList *LocateElem(LinkList *L, Elemtype e){
    LinkList *p = L->next ;
    while (p != NULL && p->data != e)
    {
        p = p->next;
    }
    return p;    
}

//按位插入(带头节点)
bool ListInsert(LinkList *L, int i, Elemtype e){
    if (i < 0)
        return false;
    // //不带头节点
    // if (i == 1){
    //     LinkList *s = (LinkList *)malloc(sizeof(LinkList));
    //     s->data = e;
    //     s->next = L;
    //     L = s;
    //     return true;
    // }
    LinkList *p = L;
    int j = 0;
    //找到(i-1)节点
    while (p != NULL && j < (i - 1))
    {
        p = p->next;
        j++;
    }
    if (p == NULL)
        return false; //i超出链表长度,不合法 
    LinkList *s = (LinkList *)malloc(sizeof(LinkList)); //分配内存空间
    s->data = e;
    s->next = p->next;
    p->next = s;
    printf("插入成功\n");
    return true;
}

//后插:在p节点后插入元素e
bool InsertNextNode(LinkList *p, Elemtype e){
    if (p == NULL)
        return false;
    LinkList *s = (LinkList *)malloc(sizeof(LinkList));
    if (s == NULL)
        return false; //内存分配失败
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}

//前插:在p节点前插入元素e
bool InsertPriorNode(LinkList *p, Elemtype e){
     if (p == NULL)
        return false;
    LinkList *s = (LinkList *)malloc(sizeof(LinkList));
    if (s == NULL)
        return false; //内存分配失败
    s->next = p->next;
    p->next = s; //s作为p的后继节点
    s->data = p->data; //p中数据复制到s中
    p->data = e; //元素e覆盖p中数据
    return true;
}

//删除(带头节点)
bool ListDelete(LinkList *L, int i){
    if (i < 0 )
        return false;
    LinkList *p = L;
    int j = 0;
    //找到(i-1)节点
    while (p != NULL && j < (i - 1))
    {
        p = p->next;
        j++;
    }
    if (p == NULL)
        return false; //i超出链表长度,不合法
    LinkList *q = p->next; //q指向需要被删除节点
    p->next = q->next;
    free(q);
    return true;
}

//删除指定节点p(p不是最后的节点)
bool DeleteNode(LinkList *p){
    LinkList *q = p->next;
    p->data = q->data; //后继节点中数据覆盖p中数据
    p->next = q->next; //将q从链中断开
    free(q);
    return false;
}

//求单链表表的长度 
int ListLength(LinkList *L){
    int len = 0;
    LinkList *p = L;
    while (p->next != NULL)
    {
        p = p->next;
        len++;
    }
    return len;
}

//尾插法建立单链表
LinkList ListTailInsert(LinkList *L){
    L = (LinkList *)malloc(sizeof(LinkList));//申请地址,建立链表
    LinkList *p, *q = L;
    int x;
    scanf("%d", &x);
    while (x != 9999)//输入9999结束
    {
        q = (LinkList *)malloc(sizeof(LinkList));
        q->data = x;
        p->next = q;
        p = q;
        scanf("%d", &x);
    }
    p->next = NULL;
    return *L;
}

//头插法建立单链表
LinkList ListHeadInsert(LinkList *L){
    L = (LinkList *)malloc(sizeof(LinkList));//申请地址,建立链表
    L->next = NULL;//初始为空链表
    LinkList *s;
    int x;
    scanf("%d", &x);
    while (x != 9999)
    {
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d", &x);
    }
    return *L;
}

//打印单链表中的所有元素
void PrintfList(LinkList *L){
    LinkList *p = L->next;
    while (p != NULL)
    {
        printf("%d", p->data);
        p = p->next;
    }
}

//单链表逆置
LinkList *Reverselist(LinkList *L){
    if (L == NULL || L->next == NULL)
        return L;
    LinkList *pRev = NULL;
    LinkList *pCur = L;
    while (pCur != NULL)
    {
        LinkList *pTemp = pCur;
        pCur = pCur->next;
        pTemp->next = pRev;
        pRev = pTemp;
    }
    return pRev;
}
BQ40Z50R2循环学习实战:量产文件生成与关键状态位解析 本文详细解析了TI BQ40Z50R2电量计循环学习(Golden Learning)的实战流程与量产文件生成方法。重点剖析了updateStatus状态位在充放电静置阶段的常见异常(如卡在0x04或跳至0x0E)及其根本原因,并提供了从环境控制、命令顺序到文件处理的完整避坑指南,帮助工程师高效完成量产配置。 阅读详情

相关推荐

从工艺文件到寄生分析:手把手教你用华大九天RCExplorer做版图预检(附ITF文件解析)

本文详细介绍了华大九天RCExplorer工具在模拟IC和版图设计中的应用,从工艺文件解析到寄生参数提取的全流程。通过ITF文件的深度解析和实战案例,帮助工程师掌握金属层、介质层及通孔参数的关键影响,提升设计效率与准确性。文章还提供了与StarRC工作流集成的实用技巧,是国产EDA工具应用的权威指南。

weixin_42522552的博客 408

单链表的定义和操作(超详细——C语言)

你还在为学习链表而烦恼?你还在为老师讲的不够简单??你是否还在苦苦挣扎着。跟我走,我带你征服链表。

weixin_47783699的博客 3369

蓝桥杯算法:打印图形——六芒星

【输入格式】 输入一行包含一个整数 n。 【输出格式】 输出一个六芒星,表示满足题意的图形。 【样例输入】 3 4 【样例输出】 【评测用例规模与约定】 对于所有评测用例,1 ≤ n ≤ 20。 总结: 第一次做图形题,做了蛮久,图形题有很多的方式去完成,它考验的是你能不能找到更简单的那一种方式. 我初看到这个图形,第一种想法是把这个六芒星当做六个小三角形来做,然后以某种规则排列一下,就能做出来,但是尝试了一下感觉太麻烦了。 然后我的第二种想法是,这个图形是对称图形,怎么能写出一半吗? 这样另一半想办

KeepCodeing 3840

一只脚踏入数据结构的大门,如何用C语言实现一个单链表(超超超详解,我的灵魂受到了升华)

单链表作为最基本的数据结构,是我们迈入数据结构的重要一步,本文将带你讲解什么是链表,链表的由来,对比顺序表讲解链表的优缺点,同时我们用C语言实现单链表。

qq_63992711的博客 1822

Python 格点数据插值到站点 最邻近插值 双线性插值

python 气象数据格点数据插值到站点,最邻近插值法,双线性插值法

好记性不如烂笔头 8460

NVIDIA DGX Spark 开发环境深度配置与优化指南

定期系统维护每月执行一次完整的系统更新监控存储空间使用情况,及时清理临时文件定期检查硬件健康状况开发习惯优化使用tmux或screen管理长时间运行的任务配置自动化测试和代码质量检查建立完善的项目文档体系性能调优周期每月重新评估和调整系统参数根据工作负载特点优化容器配置持续监控和记录性能指标DGX Spark作为一个强大的AI开发平台,其真正的价值需要通过精细的环境配置和优化才能充分发挥。本文提供的配置方案和建议均基于实际生产环境经验,旨在帮助开发者构建稳定、高效、可维护的开发环境。

time_days的博客 3691

单链表的定义和表示

一、单链表的存储结构,如下图所示: 定义单链表L的代码段: typedef struct Lnode{ //声明结点的类型和指向结点的指针类型 ElemType data; //结点的数据域 struct Lnode *next; //结点的指针域 }Lnode, *LinkList; //LinkList为指向结构体Lnode的指针类型 Linklist L;

kxbdys的博客 1634

ml307 二次开发

中移物联网旗下4g模组官方网站官方教程id=514官方客户不知道啥时候上班 早上10点也说不在服务时间内 找不到官方的sdk下载路径。

myWorld001的博客 2894

[数据结构(C语言)]单链表的定义,实现初始化、创建、插入、增、删、改、查等基本操作

首先,让我们回顾一下顺序表的优缺点: 采用链式存储结构的线性表称为链表。 链表有单链表、循环链表和双向链表等多种类型。链表中,不仅需要存储每个数据元素,还需存储其直接后继的存储地址,这两部分数据信息组 合起来称为结点。 每个结点只包含一个指针域的链表,称为单链表。 最后一个结点的指针域为NULL,在图中记为^。first是头指针,指向链表中的第一个结点,链表中的第一个结点称为头结点 目录头文件及函数声明等:菜单函数:初始化链表:显示元素:添加元素:​编辑插入元素:​编辑删除元素:​编辑 查找元素:修改元素:

DuFengYa的博客 4178

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

RKDevTool解包和打包(Windows)

我们将修改后的打包工具存放在了RKDevTool_Release_v2.92软件压缩包的rockdev目录下,可以搭配RKDevTool的解包功能使用。双击板卡主芯片对应的bat文件,开始进行打包。红框中的内容是我们的打包工具及辅助打包的可执行文件,Image目录下存放了我们的分区镜像, package-file是分区与分区镜像文件的对应关系。将从网盘获取的Update.zip镜像解压成.img格式并重命名为update.img,也可以直接使用SDK生成的update.img镜像。

tianpu2320959696的博客 3352

数据结构之单链表的定义实现和基本操作

定义结点指针p: Lnode *p;【算法思路】从首元结点开始依次释放所有结点,并将头结点指针域设置为空。:链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)【算法思路】从头指针开始,依次释放所有结点(包括头结点)空表:链表中无元素,称为空链表(头指针和头结点仍然在)单链表的初始化(带头结点的单链表)即构造一个空表。(1)生成新结点做头结点,用头指针L指向头结点。p=p->next;【算法思路】 判断头结点指针域是否为空。【算法思路】从首元结点开始,依次计数所有结点。

m0_73824186的博客 325

用ChatGPT 5.5掌握SCI的4个实操润色技巧,论文质量极速提升!(附提示词)

ChatGPT 5.5的发布,在学术写作中的应用变得更加精准和安全,通过正确的使用方法,不仅可以改善语法与表达,让论文达到SCI发表水准,还能最大程度保留作者原意,将AIGC检测率控制在低风险区间。可以帮大家省下大量纠结语法、梳理逻辑的时间,在保证润色质量的同时,兼顾AIGC检测的合规要求,为论文投稿成功率提供实实在在的提升。通过智能调整语序、优化用词和句式结构,该方法能够在保留学术质感的同时,使文章表达更自然、贴近人工撰写的风格,从而避免文字过于程式化,提升论文整体可读性和表达的个性化特征。

智能AI让学术科研更容易 65

【数据结构】————单链表的定义及基本操作

链表是一种物理存储结构上非连续、非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实现的。看起来很麻烦,其实就是一个个的结点连起来的结构。如下图:每一个结点的第一个data用来存放有效数据,第二个next用来存放下一个结点的地址最后一个结点的next存放的是NULL链表只是在逻辑结构上是连续的,一个结点指向下一个结点,但是在物理存储结构上是不连续的。上图是为了方便大家理解,才用线条连接了结点。

m0_74357404的博客 612

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【数据结构】循环单链表定义和基本操作

循环单链表: 循环单链表的定义: typedef struct CLNode{ LElemType data; struct CLNode * next; CLNode(LElemType Data=inf,CLNode *Next=NULL){ data=Data; next=Next; } }CLNode , *CLinkL...

Z_sea的博客 4746

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构 线性表-单链表的定义及基本操作

文章目录一.引入二.线性表链式存储结构的定义2.1 顺序结构和链式结构的区别2.2结点定义 一.引入 对于线性表来说,有顺序存储结构,然而顺序结构是有缺点的:插入和删除时需要移动大量元素;因此我们需要解决这一系列问题,线性表的链式存储结构刚好解决了这些问题。 二.线性表链式存储结构的定义 2.1 顺序结构和链式结构的区别 在顺序结构中,每个数据元素只需要存数据元素信息就可以了,在链式结构中,除了要存储元素信息外,还要存储后继元素的存储地址,因此,我们引入了结点。 2.2结点定义 为了表示每个数据元素 a 与

Mi-ronin的博客 3114

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【数据结构】三、单链表的定义和基本操作的实现

单链表、双链表的定义和基本操作的实现,以及循环单链表、循环双链表、静态链表的一些特点解释。

Yikou的个人技术博客 1228

【数据结构】顺序表和单链表的定义与一些基本操作

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以节点来表示的,每个结点的构成:date( 数据元素) + next(下个元素存储位置)

2301_77184700的博客 610

数据结构入门之单链表的定义及其基本操作

仅供本人学习记录使用

weixin_68987537的博客 332

【数据结构】单链表定义和基本操作(增删查改求长度)|前插 |后插

单链表的定义和基本操作(增删查改)任意物理位置的存储单元来存放数据元素存储单元可以连续,也可以不连续与顺序表不同,链表元素并不一定按顺序排列;链表是根据结点指针来确定元素位置的本文简单介绍了单链表的定义和基本操作(增删查改)如果文章的论述或代码等出现错误,欢迎前来指正!

2301_77611317的博客 1110

[数据结构]代码:单链表的定义和基本操作

简单写了一些基本操作,希望大佬们能指正。 #include <iostream> using namespace std; template <class T> struct ListNode { T data; ListNode<T>* next; ListNode() : data(0), next(nullptr) {} ListNode(T val) : data(val), next(nullptr) {} ListNode(T val, Li

hula_hula_的博客 682

统一C语言风格定义各种数据结构及基本操作——单链表基本操作

/*linklist.h*/ #pragma once #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; //定义数据元素类型为int typedef struct LNode { //线性表的链式存储结构定义 ElemType data; struct LNode* next; }LNode, *LinkList; //建立带头节点的单链表L

qq_45311905的博客 368

【数据结构】单链表——单链表的定义及基本操作的实现(头插、尾插、头删、尾删、任意位置的插入与删除)

顺序表可以随时存取表中的任意一个元素,它的存储位置可以用一个简单直观的公式表示,但是插入和删除操作需要移动大量元素。链式存储线性表时,不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理位置上也相邻,它通过“链”建立起数据元素之间的逻辑关系,因此插入和删除操作不需要移动元素,而只需要修改指针,但也会失去顺序表可随机存取的优点。线性表的链式存储又称为单链表,它是通过一组任意的存储单元来存储线性表表中的数据元素。

@情话 1948

数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

数据结构、单链表的基本操作实现、头文件、类定义和多种算法的实现、创建空表///头插法创建n个元素的线性链表///一个带头节点的链表存放一组整数,设计一个算法删除值等于x的所有节点///计算线性表中值为偶数的节点个数///一个带头节点的单链表heada存放一组整数,设计分裂heada算法,偶数放在heada中,奇数放在headb中///main函数和源码实现、测试实现、LinkList.h、test.cpp

Crocodile1006的博客 1695

数据结构笔记13:小小指针,大有用处。(单链表的定义和基本操作的实现)

单链表上基本操作的实现一、插入(1)按位序插入①带头结点②不带头结点(2)指定结点的后插元素操作(3)指定结点的前插元素操作(3)指定结点前插入结点操作二、删除(1)按位序删除(2)指定结点的删除......... 一、插入 (1)按位序插入 ①带头结点 按位序插入元素(带头结点) 最好时间复杂度O(1)表头插入时,最坏时间复杂度O(n)表尾插入时。 平均时间复杂度O(n) //在第i个位置插入元...

亦木的博客 746

单链表的基本操作(第一篇)

单链表的基本操作(第一篇) 单链表结点的定义: /*

xulu95的博客 612
上一篇: 贝叶斯网络——实践
下一篇: 【数据结构】双链表定义及基本操作
CoderMateng
博客等级 码龄7年 8粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值