zoukankan      html  css  js  c++  java
  • 数据结构C++,线性表学习

    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    #include <cmath>
    
    template<class T>
    struct chainNode{
        T element;
        chainNode<T> *next;
        chainNode() {}
        chainNode(const T& element) {
            this->element = element;
        }
        chainNode(const T& element, chainNode<T>* next) {
            this->element = element;
            this->next = next;
        }
    };
    
    template<class T>
    class linearList{
    public:
        virtual ~linearList() {}
        virtual bool empty() const = 0;
        virtual int size() const = 0;
        virtual T& get(int theIndex) const = 0;
        virtual int indexOf(const T& theElement) const = 0;
        virtual void erase(int theIndex) = 0;
        virtual void insert(int theIndex, const T& theElement) = 0;
        virtual void output(std::ostream& out) const = 0;
    };
    
    template<class T>
    class chain:public linearList<T> {
    public:
        chain(int initialCapacity = 10);
        chain(const chain<T>&);
        ~chain();
    
        bool empty() const {return listSize == 0;}
        int size() const {return listSize;}
        T& get(int theIndex) const;
        int indexOf(const T& theElement) const;
        void erase(int theIndex);
        void insert(int theIndex, const T& theElement);
        void output(std::ostream& out) const;
    protected:
        void checkIndex(int theIndex) const;
        chainNode<T>* firstNode;
        int listSize;
    };
    
    template<class T>
    chain<T>::chain(int initialCapacity) {
        if(initialCapacity < 1) {
            std::ostringstream s;
            s<<"Initial capacity = "<<initialCapacity<<" must be > 0";
            return;
        }
        firstNode = NULL;
        listSize = 0;
    }
    
    template<class T>
    chain<T>::chain(const chain<T>& theList) {
        listSize = theList.listSize;
        if(listSize == 0) {
            firstNode = NULL;
            return;
        }
        chainNode<T>* sourceNode = theList.firstNode;
        firstNode = new chainNode<T>(sourceNode->element);
        sourceNode = sourceNode->next;
        chainNode<T>* targetNode = firstNode;
    
        while(sourceNode != NULL) {
            targetNode->next = new chainNode<T>(sourceNode->element);
            targetNode = targetNode->next;
            sourceNode = sourceNode->next;
        }
        targetNode->next = NULL;
    }
    
    template<class T>
    chain<T>::~chain() {
        while(firstNode != NULL) {
            chainNode<T>* nextNode = firstNode->next;
            delete firstNode;
            firstNode = nextNode;
        }
    }
    
    template<class T>
    void chain<T>::checkIndex(int theIndex) const {
        if(theIndex<0 || theIndex>=listSize) {
            std::ostringstream s;
            s<<"index = "<<theIndex<<" size = "<<listSize;
            return;
        }
    }
    
    template<class T>
    T& chain<T>::get(int theIndex) const {
        checkIndex(theIndex);
    
        chainNode<T>* currentNode = firstNode;
        for(int i=0; i<theIndex; i++) {
            currentNode = currentNode->next;
        }
        return currentNode->element;
    }
    
    template<class T>
    int chain<T>::indexOf(const T& theElement) const {
        chainNode<T>* currentNode = firstNode;
        int index=0;
        while(currentNode != NULL && currentNode->element != theElement) {
            currentNode = currentNode->next;
            index++;
        }
        if(currentNode == NULL)
            return -1;
        else
            return index;
    }
    
    template<class T>
    void chain<T>::erase(int theIndex) {
        checkIndex(theIndex);
    
        chainNode<T>* deleteNode;
        if(theIndex == 0) {
            deleteNode = firstNode;
            firstNode = firstNode->next;
        } else {
            chainNode<T>* p = firstNode;
            for(int i=0; i<theIndex-1; i++)
                p = p->next;
            deleteNode = p->next;
            p->next = p->next->next;
        }
        listSize--;
        delete deleteNode;
    }
    
    template<class T>
    void chain<T>::insert(int theIndex, const T& theElement) {
        if(theIndex<0 || theIndex>listSize) {
            std::ostringstream s;
            s<<"index = "<<theIndex<<" size = "<<listSize;
            return;
        }
        if(theIndex == 0) {
            firstNode = new chainNode<T>(theElement, firstNode);
        } else {
            chainNode<T>* p=firstNode;
            for(int i=0; i<theIndex; i++)
                p = p->next;
            p->next = new chainNode<T>(theElement, p->next);
        }
        listSize++;
    }
    
    template<class T>
    void chain<T>::output(std::ostream& out) const {
        for(chainNode<T>* currentNode=firstNode; currentNode != NULL; currentNode = currentNode->next)
            out<<currentNode->element<<" ";
    }
    
    template<class T>
    std::ostream& operator<<(std::ostream& out, const chain<T>& x) {
        x.output(out);
        return out;
    }
    
    int main() {
        int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
        chain<int> mychain(10);
        for(int i=0; i<sizeof(a)/sizeof(a[0]); i++) {
            std::cout<<i<<": "<<a[i]<<"
    ";
            mychain.insert(0, a[i]);
        }
        std::cout<<mychain;
    
        return 0;
    }
  • 相关阅读:
    腾讯云大数据套件Hermes-MR索引插件使用总结
    【文智背后的奥秘】系列篇——文本聚类系统
    【文智背后的奥秘】系列篇——关键词智能提取
    微信Tinker的一切都在这里,包括源码(一)
    腾讯云CMQ消息队列在Windows环境下的使用
    树莓派使用modbus与stm32通信
    Ubuntu manjaro 17.10 UTC
    如何彻底禁止360浏览器弹窗
    CentOS DesktopEntry
    centos7 安装qt
  • 原文地址:https://www.cnblogs.com/donggongdechen/p/14985623.html
Copyright © 2011-2022 走看看