C++ 数据结构与算法(四)线性表之循环链表

上一篇写了 双向链表,今天复习了循环链表,就写了个带有头结点的循环链表。具体实现如下:

结点类文件(ListNode.h):

template<typename T> class CircularList;

template<typename T>
class ListNode
{
public:
    friend class CircularList<T>;
    ListNode():m_pnext(NULL)
    {

    }
    ListNode(const T data, ListNode<T>* pnext = NULL):m_data(data),m_pnext(pnext)
    {

    }
    ~ListNode()
    {
        m_pnext = NULL;
    }

private:
    T m_data;
    ListNode<T>* m_pnext;
};

循环链表类文件(CircularList.h):

#include "ListNode.h"

template<typename T>
class CircularList
{
public:
    CircularList():head(new ListNode<T>())
    {
        head->m_pnext = head;
    }
    ~CircularList()
    {
        EmptyList();
        delete head;
    }
public:
    void EmptyList();//清空链表
    int Length();//计算链表长度
    bool Insert(T item, int n = 0);//插入元素
    ListNode<T>* Find(int n);//查找第n个元素
    T Delete(int n);//删除第n个元素
    T GetData(int n);//获取第n个元素项
    void Print();//输出链表
private:
    ListNode<T>* head;
};
template<typename T>
void CircularList<T>::EmptyList()
{//清空链表
    ListNode<T>* p = head, *pdel;
    while (p->m_pnext != head)
    {
        pdel = p->m_pnext;
        p->m_pnext = pdel->m_pnext;
        delete pdel;
    }
}
template<typename T>
int CircularList<T>::Length()
{//计算链表长度
    int count = 0;
    ListNode<T>* p = head;
    while (p->m_pnext  != head)
    {
        count ++ ;
        p = p->m_pnext;
    }
    return count;
}
template<typename T>
bool CircularList<T>::Insert(T item, int n = 0)
{//插入元素
    if(n < 0 || n > Length())
        return false;//n出界
    ListNode<T>* p = head;
    ListNode<T>* pnewnode = new ListNode<T>(item);
    if(pnewnode == NULL)
        return false;
    for(int i = 0 ;i< n;i ++)
    {
        p = p->m_pnext;
        if(p == head)
            return false;//n出界
    }
    pnewnode->m_pnext = p->m_pnext;
    p->m_pnext = pnewnode;
    return true;
}
template<typename T>
ListNode<T>* CircularList<T>::Find(int n)
{//查找第n个元素
    if(n < 0 || n > Length())
        return false;
    ListNode<T>* p = head;
    while(p != head)
    {
        p = p->m_pnext;
    }
    if(p == head)
        return NULL;
    return p;
}
template<typename T>
T CircularList<T>::Delete(int n)
{//删除第n个元素
    if(n < 0 || n > Length())
        return NULL;
    ListNode<T>* p  = head,*pdel;
    for(int i =0 ;i < n; i ++)
    {
        p = p->m_pnext;
    }
    pdel = p->m_pnext;
    p->m_pnext = pdel->m_pnext;
    T data = pdel->m_data;
    delete pdel;
    return data;
}
template<typename T>
T CircularList<T>::GetData(int n)
{//获取第n个元素项
    if(n < 0 || n > Length())
        return NULL;
    ListNode<T>* p = head;
    for(int i = 0; i< n ;i ++)
    {
        p = p->m_pnext;
    }
    return p;
}
template<typename T>
void CircularList<T>::Print()
{
    ListNode<T>* p = head;
    cout << "head" ;
    while(p->m_pnext != head)
    {
        p = p->m_pnext;
        cout << "-->" << p->m_data;
    }
    cout << "-->" << endl;
}

测试类文件(Circularlist.h):

// Circularlist.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "CircularList.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

    CircularList<int> circularlist;
    for(int i = 0; i< 15; i ++)
        circularlist.Insert(i * 3,i);
    circularlist.Print();
    cout << "the length of list is: " << circularlist.Length() << endl;
    int del = circularlist.Delete(3);
    cout << del <<"is deleted " << endl;
    circularlist.Print();
    cout << "the length of list is: " << circularlist.Length() << endl;
    
    cin.get();
    return 0;
}

测试截图:

posted @ 2013-03-25 21:45  Jamy Cai  阅读(884)  评论(0编辑  收藏  举报