zoukankan      html  css  js  c++  java
  • 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;
    }

    测试截图:

  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/2981530.html
Copyright © 2011-2022 走看看