数据结构线性表之实现单链表(代码片段)

码上夏雨 码上夏雨     2023-01-04     240

关键词:

数据结构线性表之实现单链表

相关文章

数据结构线性表之概念(一)
数据结构线性表之抽象基类(二)
数据结构线性表之实现顺序表(三)
数据结构线性表之实现单链表(四)

单链表定义

链表节点定义

/**
 * 声明链表节点
 * @tparam T
 * @param data 节点数据
 * @param next 指向下个节点指针
 */
template<class T>
struct LinkNode 
    T data;
    LinkNode<T>* next;

    LinkNode() :data(), next() 
    LinkNode(T value) :data(value), next(NULL) 
;

类定义

/**
 * 顺序链表
 * @tparam T
 */
template<class T>
class LinkList 
private:
    int EmptyTag = 0;

protected:
    LinkNode<T>* first; //头节点指针
    int length; //链表存储元素的个数

public:
    LinkList();
    LinkList(LinkList<T>& L);
    ~LinkList()  delete first; length = EmptyTag; ;
    int Size()const;
    int Length()const;
    int Search(T& x)const;
    int Locate(int i)const;
    bool getData(int i, T& x)const;
    void setData(int i, T& x);
    bool Insert(int i, T& x); //在第i个表项后插入x
    bool Remove(int i, T& x); //删除第i个表项的,通过x返回

    bool IsFull()const; //判断顺序链表是否为满
    void input(); //输入
    void output(); //输出
;

单链表相关操作

构造函数

/**
 * 初始化函数
 * @tparam T
 */
template<class T>
inline LinkList<T>::LinkList() 
    first = new LinkNode<T>();
    if (first == nullptr) 
        std::cerr << "链表节点分配错误" << std::endl;
    

复制构造函数

/**
 * 复制构造函数
 * @tparam T
 * @param L
 */
template<class T>
LinkList<T>::LinkList(LinkList<T> &L) 
    T value;
    LinkNode<T>* srcptr= L.getHead();
    LinkNode<T>* destptr= first = new LinkNode<T>();
    while (srcptr->next!=NULL)
        value = srcptr->next->data;
        destptr->next = new LinkNode<T>(value);
        srcptr = srcptr->next;
        destptr = destptr->next;
    

获取头节点

/**
 * 获取头节点
 * @tparam T
 * @return 返回的头结点
 */
template<class T>
LinkNode<T> *LinkList<T>::getHead() const 
    return first;

获取链表长度

/**
 * 返回链表存储的元素的个数
 * @tparam T
 * @return
 */
template<class T>
int LinkList<T>::Length() const 
    int length = 0;
    LinkNode<T> * node = first->next;
    while (node!=NULL) 
        length++;
        node = node->next;
    
    return length;

查找指定元素

/**
 * 搜索给定列表项的地址
 * @tparam T
 * @param x
 * @return 给定列表项的地址 返回NULL则代表查找失败
 */
template<class T>
LinkNode<T> *LinkList<T>::Search(T x) const 
    LinkNode<T> *desPtr = NULL;
    if (first != NULL) 
        for (desPtr = first->next; desPtr != NULL; desPtr = desPtr->next)
            if (desPtr->data == x)
                break;
    
    return desPtr;

获取指定位置元素的地址

/**
 * 获取第i个元素的地址
 * @tparam T
 * @param i 元素序号 从1开始
 * @return 元素的地址 若返回NULL说明i太大
 */
template<class T>
LinkNode<T> *LinkList<T>::Locate(int i) const 
    LinkNode<T>* res = first;
    int index = 0;
    while (res!=NULL&&index<i) 
        res = res->next, index++;
    
    return res;

正序输出链表中的元素

/**
 * 正序输出链表中的元素
 * @tparam T
 */
template<class T>
inline void LinkList<T>::output() 
    LinkNode<T> *head = first->next;
    for (; head != NULL; head = head->next) 
        std::cout << head->data << " ";
    

取出第i个元素的数值

/**
 * 取出第i个元素的数值
 * @tparam T
 * @param i 从1开始
 * @param x 获取到的元素
 * @return 获取到的结果 false可能是链表为空或者给定的i过大
 */
template<class T>
inline bool LinkList<T>::getData(int i, T &x) const 
    if(IsEmpty())
        return false;
    else
        int index = 0;
        LinkNode<T>* ptr = first;
        while (ptr!=NULL&&index<i) 
            ptr = ptr->next, index++;
        
        if(ptr==NULL) //i过大
            return false;
        else
            x = ptr->data;
            return true;
        
    

设定第i个元素的数值

/**
 * 设定第i个元素的数值
 * @tparam T
 * @param i
 * @param x 设定的元素
 */
template<class T>
void LinkList<T>::setData(int i, T &x) 
    if(i<0)
        return;
    LinkNode<T>* ptr = Locate(i);
    if(ptr==NULL)return;
    else
        ptr->data=x;

在第i个元素后面插入的x

/**
 * 在第i个元素后面插入的x
 * @tparam T
 * @param i 从1开始
 * @param x 插入的元素
 * @return
 */
template<class T>
inline bool LinkList<T>::Insert(int i, T &x) 
    if(i<0)
        return false;
    else
        LinkNode<T>* ptr = Locate(i);
        if(ptr==NULL)
            return false;
        else
            LinkNode<T>* newNode = new LinkNode<T>(x);
            newNode->next = ptr->next;
            ptr->next = newNode;
            return true;
        
    

删除第i个元素的值

/**
 * 删除第i个元素的值
 * @tparam T
 * @param i
 * @param x 删除的元素
 * @return
 */
template<class T>
inline bool LinkList<T>::Remove(int i, T &x) 
    if(i<0)
        return false;
    else
        LinkNode<T>* ptr = Locate(i-1); //获取前驱节点的地址
        if(ptr==NULL)
            return false;
        else
            LinkNode<T>* node = ptr->next;
            ptr->next = node->next;
            x = node->data;
            delete node;
            return true;
        
    

尾插法插入元素

/**
 * 依次向链表中输入元素 尾插法
 * @tparam T
 */
template<class T>
void LinkList<T>::Input() 
    int count = 0; //输入元素的个数
    std::cout << "请输入元素的个数" << std::endl;
    std::cin >> count;
    LinkNode<T> *node;
    LinkNode<T> *cur = first;
    std::cout << "请依次输入元素" << std::endl;
    int value = 0;
    for (int i = 0; i < count; i++) 
        std::cin >> value;
        node = new LinkNode<T>(value);
        cur->next = node;
        cur = node;
    

数据结构(线性表之单链表)(代码片段)

文章目录🥇为何要使用链表🥇单链表是什么单链表的数据存储方式🥇单链表之创建链表🥇单链表之打印链表🥇单链表之计算链表长度🥇单链表之增删查改单链表之头插法单链表之尾插法单链表之把一个... 查看详情

算法习题---线性表之单链表逆序打印(代码片段)

一:题目逆序打印单链表中的数据,假设指针指向单链表的开始结点二:思路1.可以使用递归方法,来进行数据打印2.可以借助数组空间,获取长度,逆序打印数组3.若是可以,对链表数据使用头插法,逆序排列,然后正序打印即... 查看详情

线性表之单链表(代码片段)

在学完线性表之后,总结一下顺序表的优缺点优点无须为元素之间的逻辑结构增添额外的储存空间,自成一体。随机存取,十分方便。缺点空间利用率不高,容易造成“碎片”。插入删除操作需要移动大量的元素。当线性... 查看详情

数据结构学习总结线性表之单链表(代码片段)

   一,回忆链表  链表,别名链式存储结构或单链表,用于存储逻辑关系为"一对一"的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。&nbs... 查看详情

数据结构之单链表(代码片段)

文章目录前言1.为何需要链表?2.清楚单链表结构3.定义单链表结构代码实现4.单链表的增删改查4.1单链表之尾插4.1.1单链表之开辟空间4.1.2单链表之打印值4.2单链表之头插4.3单链表之尾删4.4单链表之头删4.5单链表之查链表长度4.6单... 查看详情

数据结构与算法-线性表之循环链表(代码片段)

前言:前面几篇介绍了线性表的顺序和链式存储结构,其中链式存储结构为单向链表(即一个方向的有限长度、不循环的链表),对于单链表,由于每个节点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说... 查看详情

线性表之链表(代码片段)

单链表也是一种链式存取的线性表,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,以next指针指向下一个节点而链接起来,相比于顺序表,链表有着快速增加,删除节点的优势,其节点... 查看详情

算法习题---线性表之单链表的查找(代码片段)

一:问题已知一个带头结点的单链表,结点结构为(data,link)假设该链表只给出了头指针list,在不改变链表的前提下,设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该... 查看详情

数据结构与算法-线性表之静态链表(代码片段)

...针,那么在没有引用或指针的语言中,该怎么实现这个的数据结构呢?一、简介  定义:用数组代替指针或引用来描述单链表,即用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法;  上面的静态链表图有两个... 查看详情

线性表之单链表实现

for(循环)还是while(循环)循环之后,i和条件值相等。#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedefstructnode{ intdata; structnode*next;}NODE,*PNODE;PNODEcreateList(PNODE);voidtravelList(PNO 查看详情

数据结构之顺序表(代码片段)

...容SeqList.c文件内容前言讲完算法效率,就正式开始我们的数据结构 查看详情

03线性表之链表(代码片段)

肚子饿了就要吃  ~  嗝 ———路飞 1.本章重点链表表示和实现(单链表+双链表)链表的常见OJ题顺序表和链表的区别和联系2.为什么需要链表引子:顺序表的问题及思考(1)动态顺序表特点:插入数据,... 查看详情

数据结构之双链表(代码片段)

文章目录前言为何要双链表?双链表的结构图示项目的建造双链表结点的定义双链表的各种方法实现双链表之新建结点双链表之初始化双链表之判空双链表之求具体元素数量双链表之打印链表内容双链表之尾插双链表之尾删双链... 查看详情

链表的概念和结构及基本功能函数的实现(单链表的实现)(代码片段)

...构🎓✏️单链表的实现及图示分析📝🔷单链表之创建单链表📝🔷单链表之计算单链表的长度📝🔷单链表之打印单链表📝🔷单链表之单链表的增删查改📝🔷头插法插入元素ὂ 查看详情

链表的概念和结构及基本功能函数的实现(单链表的实现)(代码片段)

...构🎓✏️单链表的实现及图示分析📝🔷单链表之创建单链表📝🔷单链表之计算单链表的长度📝🔷单链表之打印单链表📝🔷单链表之单链表的增删查改📝🔷头插法插入元素ὂ 查看详情

数据结构学习笔记二线性表之链表篇(双向链表)(代码片段)

链表根据带头不带头、单向或双向、循环非循环三个方面可组成成八种类型。这八种类型中仅有两种是我们常用的。第一种是单向不带头非循环链表,也就是单链表。单链表因为结构简单,但是实际操作比较复杂,所... 查看详情

数据结构之线性表之顺序存储java实现(代码片段)

文章目录线性表的定义线性表的基本运算线性表的存储之顺序存储定义线性表添加元素查找元素删除元素打印线性表实现的完整代码测试一下线性表的定义线性表的逻辑特征:①有且仅有一个称为开始元素的a1,她没有前... 查看详情

c语言严蔚敏数据结构线性表之链表实现(代码片段)

...近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现。  首先,数据结构包括1、数据的操作2、逻辑结构3、存储结构(数据结构三要素。  直接上代... 查看详情