C++实现线性表的链式存储结构(单链表)

本文介绍了C++如何实现线性表的链式存储结构,重点讨论了单链表的定义、基本操作,包括插入、删除、修改、获取数据、查找和计算长度。详细讲解了各个操作的实现方法,并提供了相应的代码示例。
摘要由CSDN通过智能技术生成

C++实现线性表的链式存储结构(单链表)

      线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。也就是说,这些数据元素可以存储在未被使用的内存的任意位置

      链式存储结构中:存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称做指针或链

      在使用链式存储结构的时候,通常我们我们在第一个结点前面设一个结点(头结点),并通过头结点的指针位唯一标识该链表,头结点的数据域不存储任何信息(也可以存储线性表的长度),头结点的指针域指向第一个结点

      链表中第一个结点的存储位置叫做头指针,整个链表的存取必须是从头指针开始进行。之后的每一个结点,就是上一个的后继指针指向的位置。最后一个结点指针为“空”(通常用NULL或“^”符号表示)。
在这里插入图片描述
单链表的基本操作:

  • 插入:在表头表尾数据x前面数据x后面插入数据

  • 删除:删除表头表尾第pos个位置的数据和数据x

  • 修改:修改表头表尾第pos个位置的数据和数据x

  • 得到数据:得到表头表尾第pos个位置的结点和数据

  • 查找:在单链表中查找数据为p的结点、前驱节点和后继节点

  • 计算长度:返回单链表的长度

  • 打印

一、结点类的定义

template<class T>
class LinkList;

template<class T>
class LinkNode {
   
    friend class LinkList<T>;

private:
    T data;
    LinkNode<T> *next;

public:
    LinkNode() {
   
        next = NULL;
    }

    explicit LinkNode(T p) {
   
        data = p;
        next = NULL;
    }

    LinkNode<T> &operator=(const LinkNode<T> *p) {
   
        data = p->data;
        next = p->next;
        return *this;
    }
};

二、单链表类的定义

template<class T>
class LinkList {
   
private:
    LinkNode<T> *head;

public:
    LinkList();                              //构造函数
    ~LinkList();                             //析构函数
    void push_first(T p);                    //在单链表头添加数据
    void push_last(T p);                     //在单链表尾添加数据
    bool push_node_prev(T x, T p);           //在单链表数据x前面添加数据
    bool push_node_next(T x, T p);           //在单链表数据x后面添加数据
    void pop_first();                        //删除单链表头的数据
    void pop_last();                         //删除单链表尾的数据
    bool pop_node_data(T x);                 //删除单链表中的数据x
    bool pop_node_cur(int pos);              //删除第pos个数据
    bool get_first_node(LinkNode<T> *&p);    //得到单链表的头结点
    bool get_last_node(LinkNode<T> *&p);     //得到单链表的尾结点
    bool get_node(LinkNode<T> *&p, int pos); //得到单链表中第pos个结点
    bool get_first_data(T &p);               //得到单链表头的数据
    bool get_last_data(T &p);                //得到单链表尾的数据
    bool get_data(T &x, int pos);            //得到单链表中第pos个数据
    void change_first_data(T p);             //修改单链表中头的数据
    void change_last_data(T p);              //修改单链表尾的数据
    bool change_node_data(T x, T p);         //修改单链表中的数据x修改为数据p
    bool change_node_cur(T p, int pos);      //修改单链表中第pos个数据
    LinkNode<T> *search(T p);                //查找单链表数据为p的结点
    LinkNode<T> *search_prev(T p);           //查找单链表数据为p的结点的前驱节点
    LinkNode<T> *search_next(T p);           //查找单链表数据为p的结点的后续节点
    bool isEmpty();                          //判断单链表是否为空
    int length();                            //返回单链表的长度
    void print();                            //打印单链表
    void delete_link();                      //摧毁单链表
};

1. 基本函数(构造函数、析构函数、判空函数等)

//初始化单链表
template<class T>
inline LinkList<T>::LinkList() {
   
    head = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值