C++语言实现线性表的链式存储结构(循环链表)

本文介绍了如何使用C++实现循环链表,包括结点类定义、循环链表类的构造与基本操作,如插入、删除、修改、获取数据、查找和计算长度。详细讲解了每个操作的实现细节,特别强调了循环链表在处理头删、尾删和在特定位置插入、删除节点的方法。此外,还讨论了循环链表的特点及其在约瑟夫环问题中的应用。
摘要由CSDN通过智能技术生成

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

      循环链表是另一种形式的链式存储结构。它的特点是表中最后一个结点指针域不再是空,而是指向首结点,整个链表形成一个环。

      循环链表的特点(与单链表相比较):

  1. 没有指针域为NULL的结点;
  2. 在循环链表中,可以从任一结点出发沿指针域访问表中的所有结点;也就是说只要知道表中某一结点的地址,就可搜寻到所有其他结点的地址。

      约瑟夫环是使用循环链表解决的最经典的题目,我会在之后的博客中更新相关的思路和代码。
      本博客主要是循环链表的实现。

循环链表的示例:

  • 循环链表为空时,head->next == head。

在这里插入图片描述

  • 循环链表不为空时,尾结点指向首结点(rear->next == head->next),而不是NULL。

在这里插入图片描述

循环链表的基本操作:

  • 插入:在表头表尾、和第pos个位置插入数据

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

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

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

  • 查找:在循环链表中查找数据p,返回位置

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

  • 打印

一、结点类的定义

template<class T>
class CircularLinkList;

template<class T>
class LinkNode {
   
    friend class CircularLinkList<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 CircularLinkList {
   
private:
    LinkNode<T> *head;
    LinkNode<T> *rear;

public:
    CircularLinkList();                                //构造函数
    CircularLinkList(CircularLinkList<T> &list);       //拷贝构造函数
    ~CircularLinkList();                               //析构函数
    void append_first(T p);                            //头插法,在循环链表头插入数据
    void append_last(T p);                             //尾插法,在循环链表尾插入数据
    bool append_pos(int pos, T p);                     //在循环链表第pos个位置插入数据
    void pop_first();                                  //删除循环链表头数据
    void pop_last();                                   //删除循环链表尾数据
    bool pop_pos(int pos);                             //删除循环链表中第pos个数据
    void change_first(T p);                            //修改循环链表头数据
    void change_last(T p);                             //修改循环链表尾数据
    bool change_pos(int pos, T p);                     //修改循环链表中第pos个数据
    bool get_first_node(LinkNode<T> *&p);              //得到循环链表头结点
    bool get_last_node(LinkNode<T> *&p);               //得到循环链表尾结点
    bool get_pos_node(int pos, LinkNode<T> *&p);       //得到循环链表中第pos个结点
    bool get_first_data(T &p);                         //得到循环链表头数据
    bool get_last_data(T &p);                          //得到循环链表尾数据
    bool get_pos_data(int pos, T &p);                  //得到循环链表中第pos个数据
    int search(T p);                                   //返回循环链表中p相同的第一个元素的下标pos,若不存在则返回-1
    bool isEmpty();                                    //判断循环链表是否为空
    int length();                                      //返回循环链表的长度
    void print();                                      //打印循环链表
    void clear();                                      //清空循环链表
};

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

//构造函数
template<class T>
CircularLinkList<T>::
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值