循环链表--主要操作

template<typename DataType>
class CircularListNode {//循环链表结点模板
public:
    friend class CircularList<DataType>;
    CircularListNode() {
        m_next = NULL;
    }
    CircularListNode(DataType data, CirculatListNode* nextOne = NULL) {
        m_data = data;
        m_next = mextOne;
    }
    ~CirclarListNode() {
        m_next = NULL;
    }
private:
    CircularListNode* m_next;
    DataType m_data;
};

template <typename DataType>
class CirculatList {//循环链表模板
public:
    CircularList() {  //CircularList类构造函数
        head = new CircularListNode<DataType>();
        head->m_next = head;
    }
    ~CircularList() {  //CircularList类析构函数
        cleanUp();
        delete head;
    }
    void cleanUp();//清空循环链表
    int getLength();//获取循环链表的长度
    //查询具有value值的第i个元素  并返回其指针
    CircularListNode<DataType>* findNode(int i, DataType value);
    bool insertNode(DataType data);//在链表的尾部插入元素
    bool deleteNode(DataType value);//删除具有value值的所有元素
    DataType getValue(CircularListNode<DataType>* node);//获取指定元素的值
private:
    CircularListNode<DataType>* head;
};
template <typename DataType> void CircularList<DataType>::cleanUp() {
    CircularListNode* p;   //设置删除结点的游标指针
    while(head->m_next != head) {
        p= head->m_next;  //初始化指示指针
        head->m_next = p->m_next;  //将头指针指向下一个结点的下一个结点
        delete p;
    }
}
template <typename DataType> int CircularList<DataType>::getLength() {
    int length = 0;
    CircularListNode<DataType>* p = head;  //设置游标指针
    while(p->m_next != head) {  //游走指针,直至指向头指针时结束
        p = p->m_next;
        length++;
    }
    return length;
}
template <typename DataType> CircularListNode<DataType>* CircularList<DataType>::findNode(int i, DatatType value) {
    int count = 0;
    CircularListNode<DataType>* p = head;  //游标指针
    while(count != 1) {
        //遍历链表, 寻找值与value相等的结点
        p = p->m_next;
        if(p->m_data == value) {count++;}
        if(p == head) return NULL;
    }
    return p;
}

template <typename DataType> bool CircularLisr<DataType>::insertNode(DataType data) {
    CircularListNode<DataType>* p = head;  //游标指针
    CircularListNode<DataType>* node = new CircularListNode<DataType>(data, NULL);
    //建立新结点
    if(node == NULL) return false; // 如果新结点空间分配失败  就返回false
    //寻找尾结点
    while(p->m_next != head) {p= p->m_next;}  //寻找结点位置
    node->m_next = p->m_next;  //插入新结点
    p->m_next = node;
    return true;
}
template <typename DataType> bool CircularList<DataType>::deleteNode(DataType value) {
    int count = 0;//删除的结点数
    CirCularListNode<DataType>* p = head->m_next, * l = head;//设置游标指针
    while(p != head) {
        if(p->m_data == value) {     //如果结点值与value相等
            l->m_next = p->m_next;   //删除该结点并计数
            delete p;
            count++;
            p= l->m_next;
        }
        else {
            l = p;
            p = p->m_next;
        }
    }
    if(count == 0) return false;
    else return true;
}

template <typename DataType> DataType CircularList<DataType>::getValue(CircularListNode<DataType>* node) {
    return node->m_data;
}

主函数部分自己写吧

时间: 2024-11-21 02:58:55

循环链表--主要操作的相关文章

循环链表简单操作 C++

带有头节点的循环链表.头节点的数据域为空,在查找某元素是否在链表中时,可用与存放该元素.头节点的next指针指向第一个元素.最后一个元素指向头节点.如图: //CircularList.h文件 #pragma once template<class T> struct listNode{ T element; listNode<T>* next; listNode(){} listNode(const T&theElement){ this->element = th

循环链表的实现与操作(C语言实现)

循环链表是另一种形式的链式存贮结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环. 循环链表的操作 1,循环链表的新操作 2, 获取当前游标指向的数据元素 3, 将游标重置指向链表中的第一个数据元素 4,将游标移动指向到链表中的下一个数据元素 5,直接指定删除链表中的某个数据元素 CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node); CircleListNode*

C语言通用双向循环链表操作函数集

说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现.链表由一系列存储结点组成,结点可在运行时动态生成.每个结点均由两部分组成,即存储数据元素的数据域和存储相邻结点地址的指针域.当进行插入或删除操作时,链表只需修改相关结点的指针域即可,因此相比线性

基于双向循环链表的学生管理系统

基于双向循环链表实现的学生管理系统,包括初始化,插入,删除,查抄,保存,自动按照姓名排序功能,退出并保存功能. 实现思想是将程序的各个部分划分为三个层次.主函数为界面层,即客户端层:其中后缀为Student的一般是某个功能的调度函数,属于逻辑层的内容:在调度函数之下有相应的被调度的函数,也就是相应功能的实现函数,一般后缀名为Node,意思就是这个函数直接操作链表中的结点,可以简单的划分为实现层: 这样分层实现呢有利于代码维护和个功能之间对包含或者重叠功能的直接调用,从而提高代码重用度,而降低代码

学生管理系统——基于双向循环链表

基于双向循环链表实现的学生管理系统,包括初始化,插入,删除,查抄,保存,自动按照姓名排序功能,退出并保存功能. 实现思想是将程序的各个部分划分为三个层次.主函数为界面层,即客户端层:其中后缀为Student的一般是某个功能的调度函数,属于逻辑层的内容:在调度函数之下有相应的被调度的函数,也就是相应功能的实现函数,一般后缀名为Node,意思就是这个函数直接操作链表中的结点,可以简单的划分为实现层: 这样分层实现呢有利于代码维护和个功能之间对包含或者重叠功能的直接调用,从而提高代码重用度,而降低代码

循环链表之简介

循环链表是另一种形式的链表,他的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环.由此,从表中任一结点出发均可找到表中其他节点. 循环链表的结构图如下: 循环链表的操作和之前的写过的单链表的操作是基本一致的,所以我就不再给出详细的代码,我来说说它们之间的不同:循环链表与单链表的差别在于算法之中的循环条件不是p或者p->next 是否为空,而变成了它们是否等于头指针. 循环链表的特点是无需增加存储量,仅对链接的方式稍作改变,即可使得表处理更加方便灵活. 我们同样找一个例子来说明这个特点

循环链表设计与API实现

基本概念 循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 循环链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos 删除位置pos处的元素 新增功能:游标的定义 在循环链表中可以定义一个"当前"指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素. 循环链表新操作 将游标重置指向链表中的第一个数据元素 CircleListNode* CircleList_Reset(CircleList

面试常考数据结构与算法

数据结构部分: 1.数组和链表的区别.(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小.而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费.链表是一种常见的数据组织形式,他采用动态分配内存的形式实现.需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费. 从逻辑结构上来看

数据结构——表

数据结构--表 1.定义: 线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于当中的结点,有且仅有一个開始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其他的结点都有且仅有一个前驱和一个后继结点. 2.特征/性质 1)集合中必存在唯一的一个第一个元素 2)集合中必存在唯一的一个最后元素 3)除最后一个元素之外,均有唯一的后继 4)除第一个元素之外,均有唯一的前驱 3.线性表的基本操作 1)初始化线性表InitList(L) 2)销毁线性表DestoryL