zoukankan      html  css  js  c++  java
  • C++ 数据结构与算法(二)线性表之单链表

    C++ 数据结构与算法(二)线性表之单链表:写的不足之处,望指教:)。

    ListNode.h:

    template<typename Type> class SingleList;
    
    template<typename T>
    class ListNode
    {//链表结点类
    public:
    
        ListNode():m_pnext(NULL)
        {
    
        }
        ListNode(const T item,ListNode<T>* next= NULL):m_data(item),m_pnext(next)
        {
    
        }
        ~ListNode()
        {
            m_pnext = NULL;
        }
    public:
        T GetData();
        friend typename SingleList<T>;
    private:
        T m_data;//存放结点值的数据域
        ListNode* m_pnext;//存放结点的直接后继的地址(位置)的指针域(链域)
    };
    template<typename T>
    T ListNode<T>::GetData()
    {
        return this->m_data;
    }

    SingleList.h:

    #include "ListNode.h"
    
    
    template<typename T> 
    class SingleList
    {
    public:
        SingleList()
        {
            head = new ListNode<T>();
        }
        ~SingleList()
        {
            EmptyList();
            delete head;
        }
        
    public:
        void EmptyList();//清空链表
        int Length();//获得链表长度
        
        ListNode<T>* Find(int n);//查找第n个结点
        bool Insert(T data,int n);//插入到链表的第n个位置
        T Delete(int n);//删除第n个数据
        
        T GetData(int n);//获取第n个数据
        void Print();
        
    private:
        ListNode<T>* head;
    };
    template<typename T>
    void SingleList<T>::EmptyList()
    {
        ListNode<T>* pdel;
        while(head->m_pnext != NULL)
        {
            pdel = head->m_pnext;
            head->m_pnext = pdel->m_pnext;
            delete pdel;
        }
    }
    template<typename T>
    int SingleList<T>::Length()
    {
        ListNode<T>* p = head->m_pnext;
        int count = 0;
        while(p != NULL)
        {
            count ++;
            p = p->m_pnext;
        }
        return count;
    }
    
    template<typename T>
    ListNode<T>* SingleList<T>::Find(int n)
    {
        if(n < 1)
        {
            cout << " 非法操作" << endl;
            return NULL;
         }
        ListNode<T>* p = head->m_pnext;
        for(int i = 0 ;i < n&&p; i ++)
        {
            p = p->m_pnext;
        }
        if(p == NULL)
        {
            cout << "n值 益处" << endl;
            return NULL;
        }
        return p;
    
    }
    template<typename T>
    bool SingleList<T>::Insert(T data, int n)
    {
        if(n < 0 || n > Length())
        {
            cout <<"n 值 非法" << endl;
            return false;
        }
        ListNode<T>* p = head;
        ListNode<T>* pnewnode = new ListNode<T>(data,NULL);
        if(pnewnode == NULL)
        {
            cout << "创建新结点失败" << endl;
            return false;
        }
        for(int i= 0 ;i < n &&p; i ++)
        {
            p = p->m_pnext;
        }
        if(p == NULL)
        {
            cout << "n 值非法" <<endl;
            return false;
        }
        pnewnode->m_pnext = p->m_pnext;
        p->m_pnext = pnewnode;
        return true;
    
    }
    template<typename T>
    T SingleList<T>::Delete(int n)
    {
        if(n < 0 || n > this->Length())
        {
            cout <<"n值非法" << endl;
            return NULL;
        }
        ListNode<T>* p = head; 
        ListNode<T>* pdel;
        for(int i =0 ;i< n&& p->m_pnext;i ++)
        {
            p = p->m_pnext;
        }
        if(p->m_pnext == NULL)
        {
            cout << "没有找到" << endl;
            return NULL;
        }
        pdel = p->m_pnext;
        p->m_pnext = pdel->m_pnext;
        T data = pdel->m_data;
        delete pdel;
        return data;
    }
    template<typename T>
    T SingleList<T>::GetData(int n)
    {
        if(n < 0 || n > this->Length())
        {
            cout <<"n值非法" << endl;
            return NULL;
        }
        ListNode<T>* p = head->m_pnext;
        for(int i =0 ;i <n&& p; i++)
        {
            p = p->m_pnext;
        }
        if(NULL == p)
        {
            cout <<"n值非法" << endl;
            return NULL;
        }
        return p->m_data;
    }
    template<typename T>
    void SingleList<T>::Print()
    {
        ListNode<T>* p  = head->m_pnext;
        cout << "head";
        while(p)
        {
            cout << "-->" << p->m_data;
            p = p->m_pnext;
        }
        cout << "-->over" <<endl;
    
    }

    test.cpp:

    // test.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "SingleList.h"
    #include <iostream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        SingleList<int> singlelist;
        
        for(int i = 0;i<15; i++)
        {
            singlelist.Insert(i*3,i);
        }
        singlelist.Print();
        singlelist.Delete(1);
        singlelist.Print();
        cout <<     singlelist.Length();
        cin.get();
        return 0;
    }

    测试结果:

  • 相关阅读:
    多进程乱语
    python常用函数拾零
    Flutter 安装vscode
    Flutter 安装android studio
    vsCode设置
    android ViewPager
    Android shape
    android Intent
    java 集合
    java 泛型
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/2979299.html
Copyright © 2011-2022 走看看