前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构(二)

数据结构(二)

作者头像
1ess
发布于 2021-11-01 07:37:18
发布于 2021-11-01 07:37:18
19100
代码可运行
举报
文章被收录于专栏:0x7c00的专栏0x7c00的专栏
运行总次数:0
代码可运行

数据结构(二)

發佈於 2019-02-24

本篇,我们将会复习一下比较简单但是应用非常广泛的一种数据结构 —— 线性表。

线性表

线性表(List): 零个或多个数据元素的有限序列。

如果用数学语言定义如下: 若将线性表记为(a1, …, ai-1, ai, ai+1, …, an),则表中 ai-1 领先于 ai,ai 领先于 ai+1,称 ai-1 是 ai 的直接前驱元素,ai+1 是 ai 的直接后继元素。当 i = 1, 2, …, n-1 时,ai 有且仅有一个直接后继,当 i = 2, …, n 时,ai 有且仅有一个直接前驱。

线性表元素的个数 n(n >= 0) 称为线性表的长度,当 n = 0 时,称为空表。

线性表的顺序存储结构

线性表的顺序存储结构指的是,用一段地址连续的存储单元依次存储线性表的数据元素。 一般用一维数组来实现顺序存储结构。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SqList<T>
{
    public const int Maxsize = 20;
    public T[] Data = new T[Maxsize];
    public int Length;

    /// <summary>
    /// 获取第 i 位的元素
    /// </summary>
    /// <param name="i"></param>
    /// <param name="e"></param>
    /// <returns></returns>
    public Status GetElement(int i, out T e)
    {
        if (Length == 0 || i < 0 || i >= Length)
        {
            e = default(T);
            return Status.Error;
        }

        e = Data[i];
        return Status.Ok;
    }

    /// <summary>
    /// 在第 i 位插入元素
    /// </summary>
    /// <param name="i"></param>
    /// <param name="e"></param>
    /// <returns></returns>
    public Status ListInsert(int i, T e)
    {
        if (Length == Maxsize)
        {
            return Status.Error;
        }

        if (i < 0 || i > Length)
        {
            return Status.Error;
        }

        if (i != Length)
        {
            for (var j = Length - 1; j >= i; j++)
            {
                Data[j + 1] = Data[j];
            }
        }
        Data[i] = e;
        Length++;

        return Status.Ok;
    }

    /// <summary>
    /// 删除第 i 位元素
    /// </summary>
    /// <param name="i"></param>
    /// <param name="e"></param>
    /// <returns></returns>
    public Status ListDelete(int i, out T e)
    {
        if (Length == 0)
        {
            e = default(T);
            return Status.Error;
        }

        if (i < 0 || i > Length - 1)
        {
            e = default(T);
            return Status.Error;
        }

        e = Data[i];
        for (var j = i; j < Length; j++)
        {
            Data[j] = Data[j + 1];
        }

        Length--;
        return Status.Ok;
    }
}

线性表顺序存储结构的优缺点

优点
  • 可以快速存取表中任一位置元素
缺点
  • 插入和删除操作需要移动大量元素
  • 造成存储空间碎片化

线性表的链式存储结构

线性表的链式存储结构的特点是,可以用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。

在顺序存储结构中,每个数据元素只需要存储数据元素信息就可以了,但是在链式存储结构中,除了要存储数据元素信息外,还要存储他的后继元素的地址。

因此,为了表示每个数据元素 ai 与其直接后继元素 ai+1 之间的逻辑关系,对于数据元素 ai 来说,除了存储本身信息之外,还需要存储一个指示其直接后继的信息。我们把存储数据元素信息的域称为数据域,把存储直接后继信息的域称为指针域(对于高级语言,我们可以把它理解成对象引用域)。把这两部分组成的数据元素称为节点(Node)。 n 个节点链接成一个链表,即线性表的链式存储结构。因为此链表每个节点只有一个指针域,因此称为单链表。

我们把第一个节点的指针域称为头指针。为了方便操作链表,会在单链表的第一个节点前设置一个节点,称为头节点。头节点的数据域不存储任何信息。 注意: 如果设置了头节点,那么头节点的指针域存储的就是头指针。

单链表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Node<T>
{
    public T Element;
    public Node<T> NextNode;

    public Node(T t)
    {
        Element = t;
    }
}

public class LinkList<T>
{
    //头节点(数据域无意义)
    public Node<T> HeadNode = new Node<T>(default(T));

    public Status GetElement(int i, out Node<T> node)
    {
        var j = 0;
        var temp = HeadNode;
        while (temp != null && j < i + 1)
        {
            temp = temp.NextNode;
            j++;
        }

        node = temp;
        return temp == null ? Status.Error : Status.Ok;
    }
    
    public Status ListInsert(int i, Node<T> node)
    {
        var status = GetElement(i - 1, out var prevNode);
        if (status != Status.Ok) return status;
        
        node.NextNode = prevNode.NextNode;
        prevNode.NextNode = node;
        
        return status;
    }

    public Status ListDelete(int i, out Node<T> node)
    {
        node = null;
        var status = GetElement(i - 1, out var prevNode);
        if (status != Status.Ok) return status;

        var current = prevNode.NextNode;
        prevNode.NextNode = current.NextNode;
        node = current;
        
        return status;
    }
}

循环链表

将单链表中尾节点的指针域指向头节点,使链表形成一个环,这种头尾相接的链表称为单循环链表,简称为循环链表。

循环链表和单链表的主要差异就是判断结束条件由指针域是否为空变为指针域是否是头节点。

双向链表

双向链表是在单向链表的每个节点中,再设置一个指向前驱节点的指针。所以在双向链表中存在两个指针域,一个指向直接前驱,一个指向直接后继。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DoubleLinkList<T>
{
    //头节点(数据域无意义)
    public Node<T> HeadNode = new Node<T>(default(T));

    public Status GetElement(int i, out Node<T> node)
    {
        var j = 0;
        var temp = HeadNode;
        while (temp != null && j < i + 1)
        {
            temp = temp.NextNode;
            j++;
        }

        node = temp;
        return temp == null ? Status.Error : Status.Ok;
    }

    public Status ListInsert(int i, Node<T> node)
    {
        var status = GetElement(i - 1, out var prevNode);
        if (status != Status.Ok) return status;

        node.PrevNode = prevNode;
        node.NextNode = prevNode.NextNode;
        prevNode.NextNode.PrevNode = node;
        prevNode.NextNode = node;

        return status;
    }

    public Status ListDelete(int i, out Node<T> node)
    {
        node = null;
        var status = GetElement(i - 1, out var prevNode);
        if (status != Status.Ok) return status;
        var current = prevNode.NextNode;
        current.NextNode.PrevNode = prevNode;
        prevNode.NextNode = current.NextNode;
        node = current;
        return status;
    }
}

在对链表进行操作时要记住一个原则: 后继指针很重要,在使用完之前不要赋新值。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构(三)
在软件应用中,栈这种后进先出的数据结构的应用是非常普遍的。比如浏览器的前进后退、Word 和 PhotoShop 等编辑软件中的撤销操作,以及在 iOS 开发中的 push、pop controller 操作都是栈的应用。
1ess
2021/11/01
2640
【图解数据结构】 线性表
1.线性表的定义 若将线性表记为(a1,...,ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
撸码那些事
2018/06/21
1.3K5
数据结构与算法(二)-线性表之单链表顺序存储和链式存储
前言:前面已经介绍过数据结构和算法的基本概念,下面就开始总结一下数据结构中逻辑结构下的分支——线性结构线性表
2018/09/26
1.4K0
数据结构与算法(二)-线性表之单链表顺序存储和链式存储
重学数据结构(一、线性表)
线性表是最常见也是最简单的一种数据结构。简言之, 线性表是n个数据元素的有限序列。 其一般描述为:
三分恶
2020/08/21
7620
重学数据结构(一、线性表)
数据结构(三)链式表
线性表分为顺序存储结构和链式存储结构,顺序存储结构已经在上一篇文章中讲过,本文就来介绍链式存储结构。
xbai921031
2022/05/25
4040
数据结构(三)链式表
数据结构——线性表(1)
  今天复习数据结构中最常用和最简单的一种结构,线性表。   线性表,从名字上你就能感觉到,是具有像线一样的性质的表。在广场上,有很多人分散在各处,当中有些是小朋友,可也有很多大人,甚至还有不少宠物,这些小朋友的数据对于整个广场人群来说,不能算是线性表的结构。但像刚才提到的那样,一个班级的小朋友,一个跟着一个排着队,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面一个是谁,他后面一个是谁,这样如同有一根线把他们串联起来了。就可以称之为线性表。
向着百万年薪努力的小赵
2022/12/02
4750
数据结构——线性表(1)
数据结构与算法之线性表前言线性表
前言 上一篇《数据结构和算法之时间复杂度和空间复杂度》中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明。这一篇主要介绍线性表。 线性表属于数据结构中逻辑结构中的线性结构。回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构、几何结构、树形结构和图形结构四大结构。其中,线性表就属于线性结构。剩余的三大逻辑结构今后会一一介绍。 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列。 注意: 1.线性表是一个序列。 2.0个元素构成的线性表是空表。 3
VV木公子
2018/06/05
7.7K0
java实现数据结构
一.数据结构和算法简介 数据结构是指数据在计算机存储空间中的安排方式,而算法时值软件程序用来操作这些结构中的数据的过程. 二. 数据结构和算法的重要性 几乎所有的程序都会使用到数据结构和算法,即便是最简单的程序也不例外.比如,你希望打印出学生的名单,这个程序使用一个数组来存储学生名单,然后使用一个简单的 for循环来遍历数组,最后打印出每个学生的信息. 在这个例子中数组就是一个数据结构,而使用for循环来遍历数组,则是一个简单的算法.可见数据结构和算法是构成程序的灵魂所在,而且也有人提出数据结构+算法=程序. 简单算法
海仔
2019/08/06
1K0
期末复习之数据结构 第2章 线性表
#include <iostream> using namespace std; #define ElemType int #define Status int #define MAXSIZE 100 typedef struct LNode { ElemType data;//数据域 struct LNode* next;//指针域 }LNode, * LinkList; Status InitList(LinkList& L) { L = new LNode; L->next = NULL; return 1; } Status InsertList(LinkList& L, int pos, ElemType e) { LNode* s; LinkList p = L; int j = 0; while (p&&(j<pos-1)) { p = p->next; ++j; } if (!p || j > pos - 1) { return 0; } s = new LNode; s->data = e; s->next = p->next; p->next = s; return 1; } int main() { LinkList P; InitList(P); int num; cout << "请输入整数,按ctrl+z结束输入" << endl; int Length = 1; while (cin>>num) { Length++; InsertList(P, Length, num); } cout <<"单链表结点个数为:"<< Length-1 << endl; }
henu_Newxc03
2021/12/28
7270
期末复习之数据结构 第2章 线性表
数据结构笔记(一)
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
一点儿也不潇洒
2018/08/07
5580
【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)
按照线性表结点间的逻辑顺序依次将它们存储于一组地址连续的存储单元中的存储方式被称为线性表的顺序存储方式。按顺序存储方式存储的线性表具有顺序存储结构,一般称之为顺序表。换言之,在程序中采用定长的一维数组,按照顺序存储方式存储的线性表,被称为顺序表。
Qomolangma
2024/07/30
1880
【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)
【数据结构】线性表
文章目录 2. 线性表 2.1 概述 2.2 顺序表 2.2.1 定义 2.2.2 地址公式 2.2.3 顺序表特点 2.2.4 算法:插入 2.2.5 算法:删除 2.2.6 算法:查找 2.2.7 顺序表局限性: 2.3 单链表 2.3.1 定义 2.3.2 术语 2.3.3 类定义 2.3.4 算法:单链表的长度【重点】 2.3.5 算法:按索引号(位序号)查找【重点】 2.3.6 算法:按值查找索引号【重点】 2.3.7 算法:插入 2.3.8 算法:删除 2.3.9 算法:获得前驱 2.4 循环链
陶然同学
2023/02/26
4790
【数据结构】线性表
数据结构基础温故-1.线性表(中)
在上一篇中,我们学习了线性表最基础的表现形式-顺序表,但是其存在一定缺点:必须占用一整块事先分配好的存储空间,在插入和删除操作上需要移动大量元素(即操作不方便),于是不受固定存储空间限制并且可以进行比较快捷地插入和删除操作的链表横空出世,所以我们就来复习一下链表。
Edison Zhou
2018/08/20
5190
数据结构基础温故-1.线性表(中)
《大话数据结构》一些基础知识
第一章 数据结构绪论 1.4 基本概念和术语 1.4.1 数据 数据:描述客观事物的符号,是计算机中可以操作的对象,是能被极端及识别,并输入给计算机处理的符号集合。 1.4.2 数据元素 数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理(也叫记录) 1.4.3 数据项 数据项:一个数据元素可以由若干个数据项组成 数据项是数据不可分割的最小单位 1.4.4 数据对象 数据对象:是性质相同的数据元素的集合,是数据的子集。 1.4.5 数据结构 1)不同元素之间不是独立的,而是存在特定的关
xcywt
2018/03/28
1.1K0
《大话数据结构》一些基础知识
【数据结构真不难】线性表——五一专属|向所有热爱分享的“技术劳动者”致敬
目录 1.概述 2.顺序表         2.1定义         2.2地址公式         2.3顺序表特点         2.4算法:插入         2.5算法:删除         2.6算法:查找         2.7顺序表局限性 3.单链表         3.1定义         3.2术语         3.3类定义         3.4算法:【单链表的长度】         3.5算法:按索引号(位序号)查找         3.6算法:按值查找所以号      
陶然同学
2023/02/27
3180
【数据结构真不难】线性表——五一专属|向所有热爱分享的“技术劳动者”致敬
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
单链表插入:头插法(往前插入)void head_insert(Node*node,int key)
CtrlX
2022/11/18
2K0
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
数据结构:线性表的基本操作与链式表达
● LocateElem(L,e): 按值查找操作。在表工中查找具有给定关键字值的元素。
钮祜禄.爱因斯晨
2025/05/31
920
数据结构:线性表的基本操作与链式表达
数据结构04 链表的面试题
这篇文章包含的链表面试题如下: 1、从尾到头打印单向链表 2、查找单向链表中的倒数第k个节点 3、反转一个单向链表【出现频率较高】 4、合并两个有序的单向链表,合并之后的链表依然有序【出现频率较高】 5、找出两个单向链表相交的第一个公共节点 前期代码准备: 下面这两个类的详细解析可以参考我的上一篇文章:数据结构3 线性表之链表 节点类:Node.java /** * 节点类 */ public class Node { Object element; // 数据域 Node next;
nnngu
2018/03/15
9120
数据结构04 链表的面试题
线性表(Linear List) 原
线性表是我们日常工作中最简单也是最常用的一种数据结构。 它有如下特点: 每个数据元素最多只能有一个直接前趋。 每个数据元素最多只能有一个直接后继。 只有第一个数据元素没有直接前趋。 只有最后一个数据元素没有直接后继。
云飞扬
2019/03/13
7140
线性表(Linear List)
                                                                            原
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
单链表插入:头插法(往前插入)void head_insert(Node*node,int key)
CtrlX
2023/03/21
1.6K0
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
相关推荐
数据结构(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验