循环链表简单操作 C++

带有头节点的循环链表。头节点的数据域为空,在查找某元素是否在链表中时,可用与存放该元素。头节点的next指针指向第一个元素。最后一个元素指向头节点。如图:

//CircularList.h文件
#pragma once
template<class T>
struct listNode{
    T element;
    listNode<T>* next;
    listNode(){}
    listNode(const T&theElement){ this->element = theElement; }
    listNode(const T&theElement, listNode<T>*theNext){ this->element = theElement; this->next = theNext; }
};
//有头节点的循环链表,头节点的指针域指向第一个元素
template<class T>
class CircularList
{
public:
    CircularList();
    CircularList(const CircularList<T>&);
    ~CircularList();
    void insertFirstNode(const T& element);
    void insertLastNode(const T&element);
    void listInsert(int index, const T&element);
    void listDelete(int index);
    void print();
    int listNodeFine(const T&);
private:
    listNode<T>* ahead;
    int listSize;
};
//CircularList.cpp文件
#include "CircularList.h"
#include<iostream>
using namespace std;
#include "CircularList.h"
#include<iostream>
using namespace std;

template<class T>   //构造函数
CircularList<T>::CircularList()
{
    ahead = new listNode<T>();
    ahead->next = ahead;
    listSize = 0;
}

template<class T>    //复制构造函数
CircularList<T>::CircularList(const CircularList<T>& List)
{
    ahead = new listNode<T>;
    ahead->next = ahead;                         //首先形成一个空的循环链表
    listNode<T>*current = ahead;
    listNode<T>*ListCurrent = List.ahead->next;

    if (List.ahead->next != List.ahead)             //被拷贝的链表不为空
    {
        while (ListCurrent->next != List.ahead)
        {
            listNode<T>*newNode = new listNode<T>(ListCurrent->element, current->next);
            current->next = newNode;
            current = current->next;
            ListCurrent = ListCurrent->next;
            listSize++;
        }
        if (ListCurrent->next == List.ahead)
        {
            listNode<T>*newNode = new listNode<T>(ListCurrent->element, current->next);
            current->next = newNode;
            listSize++;
        }
    }
}

template<class T>                //析构函数
CircularList<T>::~CircularList()
{
    while (ahead != NULL)
    {
        listNode<T>*current = ahead->next;
        delete ahead;
        ahead = current;
    }
    cout << "析构函数调用" << endl;
}

template<class T>   //在头部插入元素
void CircularList<T>::insertFirstNode(const T& element)
{
    listNode<T>*newNode = new listNode<T>(element,this->ahead->next);
    this->ahead->next = newNode;
    listSize++;
}

template<class T>   //在尾部插入元素
void CircularList<T>::insertLastNode(const T&element)
{
    listNode<T>*current = this->ahead;
    while (current->next != this->ahead)
        current = current->next;
    listNode<T>*newNode = new listNode<T>(element,current->next);
    current->next = newNode;
    listSize++;
}

template<class T>
void CircularList<T>::listInsert(int index, const T&element)
{
    listNode<T>*current = this->ahead->next;
    for (int i = 0; i < index-1; i++)
        current = current->next;
    listNode<T>*newNode = new listNode<T>(element, current->next);
    current->next = newNode;
    listSize++;
}

template<class T>
void CircularList<T>::print()
{
    listNode<T>*current = this->ahead->next;
    while (current != this->ahead)
    {
        cout << current->element << "  ";
        current = current->next;
    }
    cout << endl;
}

template<class T>
void CircularList<T>::listDelete(int index)
{
    if (index<0 || index>this->listSize)
    {
        cout << "删除范围有错误,请重新输入!" << endl;
        return;
    }

    if (index == 0)
    {
        listNode<T>*current = this->ahead->next;
        ahead->next = current->next;
        delete current;
    }
    else
    {
        listNode<T>*current = this->ahead->next;
        for (int i = 0; i < index - 1; i++)
            current = current->next;
        listNode<T>*temp = current->next;
        current->next = temp->next;
        delete temp;
    }
    listSize--;
}

template<class T>
int CircularList<T>::listNodeFine(const T& A)
{
    this->ahead->element = A;
    listNode<T>*current = this->ahead->next;
    int index = 0;
    while (current->element != A)
    {
        index++;
        current = current->next;
    }
    if (current == ahead)
        return -1;
    else
        return index;
}

测试代码:

#include<iostream>
#include<string>
#include"CircularList.cpp"
#include"CircularList.h"
using namespace std;
int main()
{
    CircularList<int>y1;
    y1.insertFirstNode(1);
    y1.insertFirstNode(2);
    y1.insertLastNode(5);
    y1.insertLastNode(6);
    y1.listInsert(2, 10);
    y1.print();
    CircularList<int>y3(y1);
    y3.print();
    y1.listDelete(0);
    y1.print();
    y1.listDelete(1);
    y1.print();
    y1.listDelete(2);
    y1.print();
    int index = y1.listNodeFine(2);
    cout << index;

    cout << "hello world" << endl;
    system("pause");
    return 0;
}

时间: 2024-10-11 19:59:44

循环链表简单操作 C++的相关文章

ORACLE的安装与网页版创建表空间的简单操作以及PLsql的简单操作

1.oracle的安装: 安装简单易学,在这里不做解释.下载看装包后耐心等待,注意安装目录不要有中文字符,尽量按照指定目录进行安装.安装完成后会占用有大约5g的内存. 如果要卸载oracle,需要用其自带的卸载工具进行卸载[universal installer],然后删除注册表项,删除环境变量,删除目录并且重新启动计算机. 2.在网页版进行创建表空间: 进入网页版: 在电脑的服务中我们可以看到一共有7个oracle的服务项目,其中只有三个是正在启动中.这三项中,只有当OracleDBConso

简单操作只需10秒破解PDF加密文件

简单操作只需10秒破解PDF加密文件 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51345950 如何破解PDF加密文件,如何破解PDF密码呢,破解加密的PDF文件? 从网上下载的PDF文件,由于版权的问题,作者经常会加密禁止读者复制修改等权限,如下面的PDF文档,用Adobe pdf Reader打开时,会显示"已加密"的字样,虽然可以阅读,但不能修改和标记. 为了解决这个问题,可以采用绕过破解密码这一

C++ 文件的简单操作

=================================================================== 编写程序时,很多时候都要对文件进行操作,比如从文件中读取数据,通过程序将一些数据保存到文件中等等.. 以下是c++对文件的一些简单操作. =================================================================== 一.文件输出 要将程序中的数据输出到文件中,一般需要以下5个步骤: ① 包含fstream

mysql数据库很简单操作

进入linux系统 root   >/usr/bin/mysql -u root mysql>show databases;                    #查看数据库 mysql>use  testtable;                        #testtable 为所要查看的库,应用数据库 mysql>show tables;                          #查看所有表 mysql>desc abc_table          

ftp简单操作及解说

一.实验拓扑 服务器 ------------------------客户机 二.实验条件 试验机在同一个网段,可以互相ping通. 确定装在了ftp软件包. 三.实验一: 匿名用户与本地用户都可以登录 匿名用户登录到/var/ftp,只能下载不能上传 本地用户登录到本地用户的家目录,可以上传和下载 实验步骤; [[email protected] ~]# rpm -q vsftp              //检测是否安装软件 package vsftp is not installed   

nfs简单操作及解说

NFS的实验报告 一.实验拓扑: 服务器 ----------      客户机 二.实验条件: 服务器的ip:192.168.4.5/24 客户机的ip:192.168.4.200 要确定机器有安装nfs包跟RPC软件包. 三.实验要求: 将/root 共享给192.168.4.200 可写,同步,允许客户机以root权限访问 NFS 服务端操作: 修改配置: [[email protected] ~]# vim /etc/exports    //修改配置的地址 [[email protec

PgSQL简单操作

********************************************** *基本操作 ********************************************** 数据库操作 $ psql test $ psql -h localhost -U username -W newpwd -p 5432 test =# create database mail_db; =# create database mail_db owner sunny; =# drop d

JS的简单操作和表单以及事件

HTML:主要用于往页面上放置所需要的控件. CSS:主要用来控制页面以及上面控件的样式. JS:主要用来控制页面上的特效以及数据交互. JS也分为顺序,条件(IF()... ELSE()),循环(FOR())三种语句,与C#基本一致. JS定义变量统一用var,定义数组不固定长度和类型,类似C#中的集合. JS的简单操作: DOM操作: 一.window: 1.window.onload 页面打开完再执行后面的操作 2.window.open(1,2,3,4) - 打开新页面, 1 - 打开页

Java时间简单操作

使用java操作时间感觉真真蛋疼,还是我大C#舒服,一个DateTime全部搞定 这里的Date指的是java.util.Date 获取当前时间: // 创建一个当前时间的Date对象 Date time = new Date(); 蛋疼的地方,对时间增.减操作: // 使用Calendar类对时间增.减操作 Calendar c = Calendar.getInstance();// 获得一个Calendar实例,该类是抽象类所以不可以使用new构造方法 // 使用setTime方法创建一个时