首页 > 其他分享 >数据结构-线性表(单链表)

数据结构-线性表(单链表)

时间:2024-07-22 23:25:23浏览次数:18  
标签:单链 return 线性表 next 链表 数据结构 data 节点 LNode

线性表-链表

顺序表的链式表示

顺序表和链表

顺序表可以随机存取表中的任意元素,但插入和删除操作需要移动大量元素。
链表不需要使用地址连续的存储单元,即不需要逻辑上相邻的元素在物理位置上也相邻,通过“链”建立元素之间的逻辑关系,因此插入删除的时候不需要移动元素,只需要修改指针,但同时也会失去随机存取的优点。

链表

链表的结构
链表结构
链表的结构由一个数据域和一个指针域构成,数据源是data,指针域是next,
数据域存储数据,指针域存放一个指向后继节点的指针,由此构成一条链,所以乘坐链表。
定义一个数据类型为int型的链表节点

typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode, *LinkList;

通常用头指针L来表示一个链表(下文用L表示)
链表分为带头节点和不带头节点,
不带头节点
在这里插入图片描述
带头节点的
在这里插入图片描述
头节点是链表的第一个节点,节点内通常不存储信息,即头节点的data一般不存储数据
无论是否带头节点,头指针始终指向第一个节点
带头节点的好处

  1. 方便操作
  2. 对于空表和非空表的处理得到统一

链表实现

初始化

链表的初始化,带头节点和不带头节点是不同的,带头节点需要创建一个头节点,让头指针指向头节点,头节点的next为空,代表着没有下一个节点。

bool InitList(LinkList &L)
{
    L = (LNode *)malloc(sizeof(LNode));
    // T = (LinkList)malloc(sizeof(LNode));

    if (L == NULL)
        return false;
    L->next = NULL;
    return true;
}

不太头节点则,只需要头指针为空即可。

相关操作

查找
链式结构不支持随机查找,所以只能通过第一个节点依次访问

LNode *GetElem(LinkList L, int i)
{
    if (i < 0)
        return NULL;
    LNode *p;
    int j = 0;
    p = L;
    while (p != NULL && j < i)
    {
        p = p->next;
        j++;
    }
    return p;
}

查找第i个元素,从第一个节点开始向前遍历,因为带头指针,所以从0开始计数

判断是否为空
带头节点和不带头节点也需要不同操作
带头节点,应该判断头指针指向的头节点的next域是否为空
反之,判断头指针是否指向空

插入

这里是重点,
节点P指向a,a指向b,现在要在a和b之间插入x,执行后插操作
在这里插入图片描述

bool InsertNextNode(LNode *p, int e)
{
    if (p == NULL)
        return false;
    LNode *s = (LNode *)malloc(sizeof(LNode));
    if (s == NULL)
        return false;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}

s->next = p->next;
p->next = s;

这两句是重中之重,先让待插入节点指向b,然后a再指向待插入节点,这两句不能调换顺序
如果是前插操作,可以等同后插,
在这里插入图片描述
比如,P指向b,现在要在b之前插入一个x,但链表只能向前操作,该如何实现?

在这里插入图片描述
可以当作,在P指向的节点后插一个节点,然后修改其data

bool InsertPriorNode(LNode *p, int e)
{
    if (p == NULL)
        return false;
    LNode *s = (LNode *)malloc(sizeof(LNode));
    if (s = NULL)
        return false;
    s->data = p->data;
    s->next = p->next;
    p->data = e;
    p->next = s;
    return true;
}

利用后插,交换data,就可以实现。
同时,还有删除操作
在这里插入图片描述
这个便是删除操作,将实线化作虚线,但同时要考虑待删除节点的后继是否合法,比如没有后继的情况,只需要指向空即可

bool DeletNode(LNode *p)
{
    if (p == NULL)
        return false;
    LNode *q = p->next;
    p->data = p->next->data;
    p->next = q->next;
    free(q);
    return true;
}

同时,还有删除特定值的操作
除了单链表外,还有循环链表,双循环链表,对于修改更加方便

标签:单链,return,线性表,next,链表,数据结构,data,节点,LNode
From: https://blog.csdn.net/gzsn_/article/details/140621432

相关文章

  • 数据结构-绪论2(算法,时间复杂度)
    算法的基本概念算法是什么       程序=数据结构+算法算法的五个特性有穷性确定性可行性输入输出算法的复杂度时间复杂度算法时间复杂度事前预估算法时间开销T(n)与问题规模n的关系这里以一层,两层,多层循环为例一层循环for(inti=0;i<n;i++){i......
  • 《Java初阶数据结构》----1.<时间复杂度&空间复杂度计算>
    目录算法效率:一、时间复杂度的计算1.1时间复杂度的表示1.2常见时间复杂度大小排序 1.3计算示例冒泡排序的时间复杂度二分查找的时间复杂度 阶乘递归factorial的时间复杂度斐波那契递归的时间复杂度二、空间复杂度的计算冒泡排序的空间复杂度计算fibonacci的空间复......
  • 数据结构——堆(C语言版)
    树    树的概念:        树(Tree)是一种抽象数据结构,它由节点(node)的集合组成,这些节点通过边相连,把节点集合按照逻辑顺序抽象成图像,看起来就像一个倒挂着的树,也就是说数据结构中的树是根成朝上,叶子朝下。        树形结构中,⼦树之间不能有交集,否则就不......
  • 片集 - 数据结构 - 1
    欢迎来看“片”(的简介)由于-\(看片\)-生涯转瞬即逝,于是我选择对“\(片\)”进行一定的总结:相信你一定看懂了由于开始的时间有一点晚,就姑且认为我以后会慢慢补充吧......\(CF1270H\)\(Number\)\(of\)\(Components\)解:线段树首先我们可以发现连通块都是以区间的形式存在的......
  • 7.22数据结构
    笔记链表一.链表的引入1.1总结顺序表的优缺点    1)优点:能够直接通过下表进行定位元素,访问效率高,对元素进行查找修改比较快    2)不足:插入和删除元素需要移动大量的元素,效率较低    3)缺点:存储数据元素有上限,当达到MAX后,就不能再添加元素了、1.2链......
  • 【数据结构】:链表实现洗牌功能
    此操作包含的基本功能有:组牌:组建52张扑克牌四种花色:“♥️”,“♠️”,“⬛️”,“♣️”每种花色13张牌:1~13洗牌:将52张扑克牌打乱顺序发牌:给三个人每人发5张牌扩展功能:清牌:将每人手中牌按照面值进行从大到小排序Card类在此类中,我们将完成对每一张牌的构造类......
  • 数据结构与算法总结——线性表
    目录2线性表2.1线性表的定义2.2线性表的基本操作2.2顺序表2.2.1顺序表的定义2.2.2顺序表的基本操作2.3链式表2.3.1链表的定义2.3.2链表的分类2.3.3单向链表2.3.3.1结点设计2.3.3.2链表的初始化2.3.3.3数据的插入2.3.3.4数据的删除2.3.3.5销毁链......
  • 手撕数据结构01--单链表(附源码)
    目录1.链表的概念和结构1.1链表的概念1.2单链表结构2.实现单链表2.1节点定义2.2链表功能2.3 创建节点2.4尾插2.5头插2.6打印2.7尾删2.8头删2.9查找2.10指定位置插入2.11指定位置之后插入2.12删除pos节点2.13删除pos之后的节点2.14销毁链表......
  • 01-复杂度3 二分查找 陈越、何钦铭数据结构
    题目可以满分通过的答案:`PositionBinarySearch(ListL,ElementTypeX){Positionleft=1;Positionright=L->Last;while(left<=right){Positioncenter=(left+right)/2;if(L->Data[center]>X){right=center-1;}elseif(L->Data......
  • 数据结构-C语言-排序(3)
            代码位置:test-c-2024:对C语言习题代码的练习(gitee.com)一、前言:1.1-排序定义:        排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序)1.2-排序分类:常见的排序算法:插入排序a. 直接插......