单链表

简介: ListNode.h #ifndef __ListNode_H__ #define  __ListNode_H__   template<typenameType> classSingleList;   template<typenameType> classListNode{ private:     friendty

ListNode.h

#ifndef __ListNode_H__

#define  __ListNode_H__

 

template<typenameType>

classSingleList;

 

template<typenameType>

classListNode{

private:

    friendtypenameSingleList < Type >;

 

    ListNode() :m_pnext(NULL){}

 

    ListNode(constTypeitem, ListNode<Type> *next = NULL)

        :m_data(item), m_pnext(next){}

    ~ListNode(){

        m_pnext = NULL;

    }

 

public:

    Type GetData();

    friendostream& operator<< <Type>(ostream&, ListNode<Type>&);

 

private:

    Type m_data;

    ListNode *m_pnext;

};

 

template<typenameType>

TypeListNode<Type>::GetData(){

    returnthis->m_data;

}

 

template<typenameType>

ostream& operator<<(ostream& os, ListNode<Type>& out){

    os << out.m_data;

    returnos;

}

 

#endif

SingleList.h

#ifndef __SingleList_H__

#define__SingleList_H__

#include"ListNode.h"

 

template<typenameType>

classSingleList{

public:

    SingleList() :head(newListNode<Type>()){}

    ~SingleList(){

        MakeEmpty();

        delete head;

    }

 

public:

    //make the list empty

    void MakeEmpty();

    //get the length

    int Length();                       

    //find thd nth data which is equal to value

    ListNode<Type> *Find(Type value, int n);

    //find the nth data

    ListNode<Type> *Find(int n);

    //insert the data in the nth position

    bool Insert(Type item, int n = 0);

    //remove the nth data

    Type Remove(int n = 0);

    //remove all the data which is equal to item

    bool RemoveAll(Type item);

    //get the nth data

    Type Get(int n);

    //print the list

    void Print();

 

private:

    ListNode<Type> *head;

};

 

//清空链表

template<typenameType>

voidSingleList<Type>::MakeEmpty(){

    ListNode<Type> *pdel;

    while (head->m_pnext != NULL){

        pdel = head->m_pnext;

        head->m_pnext = pdel->m_pnext;

        delete pdel;

    }

}

 

//求链表的长度

template<typenameType>

intSingleList<Type>::Length(){

    ListNode<Type> *pmove = head->m_pnext;

    int count = 0;

    while (pmove != NULL){

        pmove = pmove->m_pnext;

        count++;

    }

    return count;

}

 

//查找第n个元素

template<typenameType>

ListNode<Type>* SingleList<Type>::Find(intn){

    if (n < 0){

        cout << "The n is out of boundary" << endl;

        returnNULL;

    }

    ListNode<Type> *pmove = head->m_pnext;

    for (int i = 0; i < n&&pmove; i++){

        pmove = pmove->m_pnext;

    }

    if (pmove == NULL){

        cout << "The n is out of boundary" << endl;

        returnNULL;

    }

    return pmove;

}

 

template<typenameType>

ListNode<Type>* SingleList<Type>::Find(Typevalue, intn){

    if (n < 1){

        cout << "The n is illegal" << endl;

        returnNULL;

    }

    ListNode<Type> *pmove = head;

    int count = 0;

    while (count != n&&pmove){

        pmove = pmove->m_pnext;

        if (pmove->m_data == value){

            count++;

        }

    }

    if (pmove == NULL){

        cout << "can't find the element" << endl;

        returnNULL;

    }

    return pmove;

}

 

template<typenameType>

boolSingleList<Type>::Insert(Typeitem, intn){

    if (n < 0){

        cout << "The n is illegal" << endl;

        return 0;

    }

    ListNode<Type> *pmove = head;

    ListNode<Type> *pnode = newListNode<Type>(item);

    if (pnode == NULL){

        cout << "Application error!" << endl;

        return 0;

    }

    for (int i = 0; i < n&&pmove; i++){

        pmove = pmove->m_pnext;

    }

    if (pmove == NULL){

        cout << "the n is illegal" << endl;

        return 0;

    }

    pnode->m_pnext = pmove->m_pnext;

    pmove->m_pnext = pnode;

    return 1;

}

 

//删除所有

template<typenameType>

boolSingleList<Type>::RemoveAll(Typeitem){

    ListNode<Type> *pmove = head;

    ListNode<Type> *pdel = head->m_pnext;

    while (pdel != NULL){

        if (pdel->m_data == item){

            pmove->m_pnext = pdel->m_pnext;

            delete pdel;

            pdel = pmove->m_pnext;

            continue;

        }

        pmove = pmove->m_pnext;

        pdel = pdel->m_pnext;

    }

    return 1;

}

 

template<typenameType>

TypeSingleList<Type>::Remove(intn){

    if (n < 0){

        cout << "can't find the element" << endl;

        exit(1);

    }

    ListNode<Type> *pmove = head, *pdel;

    for (int i = 0; i < n&&pmove->m_pnext; i++){

        pmove = pmove->m_pnext;

    }

    if (pmove->m_pnext == NULL){

        cout << "can't find the element" << endl;

        exit(1);

    }

    pdel = pmove->m_pnext;

    pmove->m_pnext = pdel->m_pnext;

    Type temp = pdel->m_data;

    delete pdel;

    return temp;

}

 

//获得第那个元素

template<typenameType>

TypeSingleList<Type>::Get(intn){

    if (n < 0){

        cout << "The n is out of boundary" << endl;

        exit(1);

    }

    ListNode<Type> *pmove = head->m_pnext;

    for (int i = 0; i < n; i++){

        pmove = pmove->m_pnext;

        if (NULL == pmove){

            cout << "The n is out of boundary" << endl;

            exit(1);

        }

    }

    return pmove->m_data;

}

 

template<typenameType>

voidSingleList<Type>::Print(){

    ListNode<Type> *pmove = head->m_pnext;

    cout << "head";

    while (pmove){

        cout << "--->" << pmove->m_data;

        pmove = pmove->m_pnext;

    }

    cout << "--->over" << endl << endl << endl;

}

#endif

Test.cpp

#include<iostream>

usingnamespace std;

 

#include"SingleList.h"

 

int main()

{

    SingleList<int> list;

    for (int i = 0; i < 20; i++){

        list.Insert(i * 3, i);

    }

    for (int i = 0; i < 5; i++){

        list.Insert(3, i * 3);

    }

    cout << "the Length of the list is " << list.Length() << endl;

    list.Print();

 

    list.Remove(5);

    cout << "the Length of the list is " << list.Length() << endl;

    list.Print();

 

    list.RemoveAll(3);

    cout << "the Length of the list is " << list.Length() << endl;

    list.Print();

 

    cout << "The third element is " << list.Get(3) << endl;

 

    cout << *list.Find(18, 1) << endl;

 

    list.Find(100);

 

    list.MakeEmpty();

    cout << "the Length of the list is " << list.Length() << endl;

    list.Print();

    cin.get();

    return 0;

}

运行结果:


 

目录
相关文章
|
SQL 关系型数据库 测试技术
timescaleDB双机热备流复制与测试
最近有项目要用到热备功能,timescaledb只能兼容pg的流复制,不能兼容其他的复制策略,所以这里我们采用pg的流复制功能镜像部署,并进行了一些测试
1108 0
|
11月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
490 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
12月前
|
弹性计算 监控 测试技术
ecs e实例测评
阿里云 e实例性能稳定,适用于中小型 Web 应用。在 CPU 和内存性能测试中,e实例表现出色,尤其在资源密集型任务中具有较高的性价比。相比同配置的其他 ECS 规格,e实例在轻量化场景中更为均衡。价格方面,e实例低于传统 ECS 的 t5 实例,且在中国大陆市场具备一定优势。用户体验方面,控制台提供了清晰的实例创建流程和快速部署选项,但缺乏高级应用文档和性能优化指导。总体而言,e实例适合中小型企业和个人开发者使用。
248 5
|
12月前
|
数据库 Android开发
南大通用GBaseDataStudio 切换中文界面到英文界面
南大通用GBaseDataStudio 切换中文界面到英文界面
|
12月前
|
人工智能 监控 数据可视化
绩效考核管理的动态调整与持续优化
本文探讨了绩效考核管理在现代企业管理中的重要性,从核心原则、流程设计、指标设定、沟通反馈及持续优化五个方面进行了详细阐述,并推荐了板栗看板作为提升绩效管理效率的工具。文章强调了公平公正、客观量化、战略导向、持续反馈和结果应用的原则,以及平衡计分卡、KPI、OKR和360度反馈等多种考核方法的应用。板栗看板以其强大的可视化、动态追踪、高效沟通和数据分析功能,助力企业实现高效的绩效管理。
|
关系型数据库 MySQL 数据库
如何在一个系统下同时运行两个甚至多个MYSQL数据库
如何在一个系统下同时运行两个甚至多个MYSQL数据库
1661 0
如何在一个系统下同时运行两个甚至多个MYSQL数据库
|
Android开发 iOS开发
了解Wi-Fi信号强度【一文看懂】
了解Wi-Fi信号强度【一文看懂】
955 1
|
人工智能 编译器 开发工具
【Mojo】AI编程语言Mojo简介
Mojo,一门像 Python 一样简单、像 C++ 一样快速的新编程语言,一门用于构建人工智能应用程序的革命性新编程语言
526 0
|
DataWorks 关系型数据库 OLAP
这个错误提示表明在尝试获取表列信息时出现了问题
这个错误提示表明在尝试获取表列信息时出现了问题
325 2
|
Linux 数据安全/隐私保护 Windows
[使用教程]xftp5中文版怎么使用?
[使用教程]xftp5中文版怎么使用?