美文网首页
Learning Log. [数据结构] 顺序表(c++实现)

Learning Log. [数据结构] 顺序表(c++实现)

作者: 科瑞Krits | 来源:发表于2019-08-03 18:45 被阅读0次
  • 源码
#define ERROR -1
#define OVERMEMORY -2

#include <iostream>

using namespace std;

template<class T>
class List{
    T *elem;    //存储空间的基址
    int length; //当前顺序表长度
    int listsize; //当前分配空间的大小

public:
    List(){
        InitList(1);
    }
    List(int size){
        InitList(size);
    }
    List(const List &l){
        elem = new T[l.listsize];
        length = l.length;
        listsize = l.listsize;
        for (int i = 0; i < l.listsize; i++){
            elem[i] = l.elem[i];
        }
    }//拷贝构造函数

    ~List(){
        delete elem;
    }

    void InitList(int L){
        elem = new T[L];
        if (!elem){
            cout << "Over Memory!" << endl;
            exit(OVERMEMORY);
        }
        length = 0;
        listsize = L;
    }// 初始化链表

    void ListInsert(int i,const T &e){
        if (i < 0 || i > length)    return;
        if (length >= listsize)
            resize(listsize*2);
        
        T *p = &elem[i];
        for (T *q = &elem[length]; q > p; q--){
            *q = *(q-1);
        }
        *p = e;
        length++;
    }// 在下标为i的位置插入元素e

    void push_back(const T &e){
        ListInsert(length, e);
    }//在表末添加元素e

    void ListDelete(int i){
        if (i < 0 || i >= length)    return;

        T *end = &elem[length-1];
        for (T *p = &elem[i]; p != end; p++){
            *p = *(p+1);
        }
        length--;

        if (listsize / length >= 4){
            resize(listsize / 2);
        }//如果分配的空间太大,调整大小

    }//删除下标为i的元素
    void resize(int size){
        T *newelem = new T[size];
        if (!newelem){
            cout << "Over Memory!" << endl;
            exit(OVERMEMORY);
        }

        int count = 0;
        for (int i = 0; i < size; i++){
            if (i < length){
                newelem[i] = elem[i];
                count++;
            }
            else
                break;
        }
        delete elem;
        elem = newelem;
        listsize = size;
        length = count;
    }// 重新设置顺序表存储空间大小
    
    int LocateElem(const T &e){
        int i = 0;
        T *p = elem;
        while (i < length && *p != e){
            p++;
            i++;
        }
        if (i == length)
            return -1;
        return i;
    }//获取元素e的下标,如果有多个则返回下标最小的一个

    void MergeList(List &b){
        List c;

        T *pa = elem;
        T *pb = b.elem;

        c.resize(listsize+b.listsize);
        c.length = length + b.length;

        T *pc = c.elem;
        T *pa_last = &elem[length-1];
        T *pb_last = &b.elem[b.length-1];

        //归并
        while (pa <= pa_last && pb <= pb_last){
            if (*pa <= *pb){
                *pc = *pa;
                pa++;
                pc++;
            }
            else{
                *pc = *pb;
                pc++;
                pb++;
            }
        }
        while (pa <= pa_last){
            *pc = *pa;
            pc++;
            pa++;
        }//插入La剩余元素
        while (pb <= pb_last){
            *pc = *pb;
            pc++;
            pb++;
        }//插入Lb剩余元素

        *this = c;
    }// 与一个顺序表归并

    void print(){
        for (int i = 0; i < length; i++){
            cout << elem[i];
            if (i != length-1)
                cout << " ";
        }
        cout << endl;
    }

    T& operator[] (int i){
        return elem[i];
    }// 重载[]

    void operator= (const List &l){
        if (listsize)
            delete elem;
        elem = new T[l.listsize];
        length = l.length;
        listsize = l.listsize;
        for (int i = 0; i < l.listsize; i++){
            elem[i] = l.elem[i];
        }
    }// 重载赋值(深拷贝)

};//顺序表类, 下标从0开始


int main(){
    List<int> l;
    l.push_back(1);
    l.push_back(2);
    l.push_back(3);
    l.ListInsert(0, 0);
    l.print();

    List<int> a;
    a.push_back(4);
    a.push_back(5);
    a.push_back(6);
    a.ListDelete(1);
    a.print();
    
    a.MergeList(l);
    a.print();
}

相关文章

  • 线性表

    学习内容来自数据结构详解——线性表(C++实现) 线性表(List):零个或多个数据元素的有限序列。顺序表(数组)...

  • C++语言实现顺序表

    C++语言实现顺序表 顺序表的定义及其特点 顺序表的定义是:把线性表中的所有表项按照其逻辑顺序依次存储到从计算机存...

  • 数据结构-线性表

    [TOC] 线性表-List list是最简单的数据结构,可分为顺序表与链表,顺序表内部数据存储由数组实现,链表则...

  • python中的树数据结构

    线性数据中的典型顺序表和链表已经讲完: 《顺序表数据结构在python中的应用》 《python实现单向链表数据结...

  • josephus问题

    线性表是数据结构的中很常见的结构,其中一种就是顺序表,python已经内置了顺序表。list就是循序表的的实现。下...

  • P 数据结构 | 线性表:顺序表

    一、线性表 最基本的数据结构之一 根据线性表的实际存储方式,分为两种实现模型顺序表、链表 1.1 顺序表 将元素顺...

  • 数据结构之线性表(顺序和链式)、栈和队列、串总结

    一、数据结构之顺序表总结 1、定长顺序表 头文件sqlist.h 实现头文件函数的文件:sqlist.cpp ex...

  • 【数据结构】顺序表的实现与操作

    整理数据结构代码,回顾顺序表的实现方法 认识线性表 线性表(Linear_list)是最常用且最简单的一种数据结构...

  • C++线性表的链式存储结构

    C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储。在顺序存储结构(数组描述)...

  • # 数据结构和算法系列1 线性表之顺序表

    阅读目录 什么是线性表线性表的两种存储结构顺序表的存储结构表示顺序表的常见操作和代码实现 数据结构与算法这块一直是...

网友评论

      本文标题:Learning Log. [数据结构] 顺序表(c++实现)

      本文链接:https://www.haomeiwen.com/subject/taiydctx.html