单链表

简介: 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;

}

运行结果:


 

目录
相关文章
|
数据采集 DataWorks 数据可视化
数据分析之「数据探查」—帮您快速掌握数据情报
为了帮助用户一眼看穿当前数据的质量、结构、分布、统计信息,Dataworks数据分析系统提供了数据探查这个情报管家。它支持探查概览、支持探查详情、支持数据筛选、支持数据刷新、支持数据分布直方图动态装箱和多级下钻!我们会在电子表格顶部以图形和富文本的形式,智能展示每列数据类型和值分布的概览情况;同时,也支持切换到详细模式,查看更多更全面的数据信息。
4621 0
|
10月前
|
机器学习/深度学习 消息中间件 监控
监控工具实现实时监测的方法
监控工具实现实时监测的方法
402 11
|
12月前
|
机器学习/深度学习 算法
概率分布深度解析:PMF、PDF和CDF的技术指南
本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。
961 15
概率分布深度解析:PMF、PDF和CDF的技术指南
数据库系统工程师考点笔记
数据库系统工程师考点笔记
1264 0
|
前端开发 安全 JavaScript
有哪些常见的前端问题和解决方案
【4月更文挑战第13天】前端开发常见问题及解决方案:页面渲染性能优化(减少重绘、回流,利用GPU加速,代码拆分)、响应式设计(媒体查询、弹性布局)、浏览器兼容性(使用前缀,兼容性库,浏览器嗅探)、事件处理(事件委托、防抖节流)、代码组织(模块化、构建工具)、安全性(输入验证、HTTPS、安全HTTP头)和资源加载(CDN、资源优化、错误处理)。
1391 6
|
数据采集 搜索推荐 数据挖掘
揭秘网上问卷调查:多样化类型助力数据收集
在数字化时代,网上问卷调查成为数据收集和分析的常用工具,广泛应用于市场调研、学术研究等领域。本文介绍了七种常见的网上问卷调查类型:封闭型(多选、单选)、开放型(自由回答)、混合型、跟踪型、面板调查、交互式和滚动型。选择合适的问卷类型能提高调查效率和数据质量,确保研究的可靠性和准确性。
253 0
|
网络协议
IPv6 私有地址
IPv6 私有地址
1981 0
IPv6 私有地址
|
Cloud Native 开发工具 存储
OpenTelemetry-可观察性的新时代
Ops领域两个网红项目OpenTracing和OpenCensus终于走到了一起,可观察性统一的标准化已经扬帆起航。这篇文章旨在抛砖引玉,希望能够和更多的同学一起交流可观察性相关的内容。
8555 0
|
存储 弹性计算 固态存储
阿里云服务器ECS与轻量应用服务器最新收费标准及活动价格表
本文整理汇总了阿里云服务器ECS与轻量应用服务器最新收费标准及活动价格表,可供新手用户了解云服务器与轻量应用服务器的收费标准及最新活动价格情况,从而根据自己的情况选择合适的云服务器或轻量应用服务器。
930 0
阿里云服务器ECS与轻量应用服务器最新收费标准及活动价格表
|
机器学习/深度学习 算法 数据挖掘
该死!B 站上这些 Python 视频真香!
无论什么时候,都有初学者存在找不到学习资源的困惑。其实呢,一般通过百度、知乎估计也都能找到个的结果,不过质量可能就会层次不齐了。
该死!B 站上这些 Python 视频真香!