单链表

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;

}

运行结果:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值