【データ構造】シーケンステーブルの実現と応用(C++)


【データ構造】C++版順表
主な実現機能には、主な構造関数、コピー構造関数、構造関数、挿入関数があり、表に挿入とp位置で挿入を含む.また、テーブル内の対応する値の位置を取得する関数LocateElem_Sq求めた位置に対応する要素の数値GetElemある位置を削除する関数Delete_を取得するListは2つの順序の表の並集の関数union_を求めますsq
テーブルのlengthは長さのみを記録し、テーブルに格納されている下付き文字は0から始まることに注意してください.
シーケンステーブルは基本的なデータ構造であり、難易度は大きくなく、主に空間を割り当ててから操作する方法を採用している.
マスターコードは次のとおりです.

/* 
                                linear_c
                                csc
                                2020-9-15
                              2020-9-17

                         
    Sqlist()                            
    Sqlist(const Sqlist &l)                      
    ~Sqlist()                            
    void Insert_Sq(int p, T e)       p       e
    void Insert_Sq(T e)                   e
    void Delete_List(int p)           p      
    int GetElem(int p)                p      
    int Listlength()                       
    int LocateElem_Sq(T e)               e      p
    void display_sq()                                 
    void union_sq(Sqlist &l)                 

                 ,               C++ ,   
           ,    ,       
 */

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#define FAST                     \
    ios::sync_with_stdio(false); \
    cin.tie(NULL);               \
    cout.tie(NULL)
typedef long long int ll;

using namespace std;

//ll size = 100; //             

template <class T>

class Sqlist
{
     
private:
    T *data;
    int length;
    ll size = 100;

public:
    Sqlist()
    /*
    Sqlist()
        :     
           :      
    */
    {
     
        data = new T[size];
        length = 0;
    }

    Sqlist(const Sqlist &l)
    /*
    Sqlist()
        :              
           :               
    */
    {
     
        while (size < l.size)
            size *= 2;
        length = l.length;
        data = new T[size];
        for (int i = 0; i < length; ++i)
            data[i] = l.data[i];
    }

    ~Sqlist()
    /*
    ~Sqlist()
        :      
           :1.             
                   2. delete        ,  delete            ,           
                   3.   A   B   ,B         ,  A          
    */
    {
     
        delete[] data;
    }

    void Insert_Sq(int p, T e) 
    /*
    Insert_Sq(int p, T e) 
        :   p      e
           :          
           :int p, T e
    */
    {
     
        if (p < 1 || p > length + 1)
        {
     
            throw " illegal position ! ";
        }

        if (length > size)
        {
     
            while (length > size)
                size *= 2;
            T *data_old = data;
            data = new T[size];
            for (int i = 0; i < length; ++i)
                data[i] = data_old[i];

            delete[] data_old;
        }

        for (int i = length; i >= p; --i)
            data[i] = data[i - 1];
        data[p - 1] = e;
        ++length;
    }

    void Insert_Sq(T e) 
    /*
    Insert_Sq(T e)
        :       e
           :          
           :T e
    */
    {
     
        if (length > size)
        {
     
            while (length > size)
                size *= 2;
            T *data_old = data;
            data = new T[size];
            for (int i = 0; i < length; ++i)
                data[i] = data_old[i];

            delete[] data_old;
        }

        data[length] = e;
        ++length;
    }

    void Delete_List(int p) 
    /*
    Delete_List(int p)
        :    p       
           :     , p  
    */
    {
     
        if (p < 1 || p > length + 1)
        {
     
            throw " illegal position ! ";
        }

        for (int i = p - 1; i < length - 1; ++i)
        {
     
            data[i] = data[i + 1];
        }
        --length;
    }

    int GetElem(int p)
    /*
    GetElem(int p)
        :  p       e
           :     , p  
          :        p       e
    */
    {
     
        if (p < 1 || p > length + 1)
        {
     
            throw " illegal position ! ";
        }

        return data[p - 1];
    }

    int Listlength()
    /*
    Listlength()
        :        
           :    
          :       0,             length
    */
    {
     
        if (length == 0)
        {
     
            printf("   
"
); return 0; } else return length; } int LocateElem_Sq(T e) /* LocateElem_Sq(T e) : e l i : :T e : , 0 */ { int i = 1; while (i <= length && (e != data[i - 1])) i++; if (i <= length) return i; else return 0; // length 1 0 } void display_sq() /* display_sq() : : */ { if (length == 0) { throw "The sequence list is empty!
"
; } else { for (int i = 0; i < length; ++i) printf(" %d %d.
"
, i, data[i]); } } void union_sq(Sqlist &l) // l /* union_sq(Sqlist &l) : :Sqlist &l GetElem(int p) LocateElem_Sq(T e) */ { int elem_l; int len = l.length; for (int i = 1; i <= len; ++i) { elem_l = l.GetElem(i); if (!LocateElem_Sq(elem_l)) Insert_Sq(length + 1, elem_l); } } }; int main() { Sqlist<int> l1, l2; printf(" l1
"
); // for l1.Insert_Sq(1, 4); l1.Insert_Sq(2, 6); l1.Insert_Sq(3, 5); l1.Insert_Sq(2); l1.display_sq(); printf("
"
); printf(" l2
"
); l2.Insert_Sq(1, 7); l2.Insert_Sq(2, 3); l2.Insert_Sq(3, 5); l2.display_sq(); printf("
"
); /* */ printf("
"
); l2.Delete_List(2); l2.display_sq(); printf("
"
); l2.Insert_Sq(3, 9); l2.Insert_Sq(4, 6); l2.display_sq(); printf("
"
); /* */ printf("
"
); Sqlist<int> l3 = l1; l3.display_sq(); /* */ printf("
"
); l3.union_sq(l2); l3.display_sq(); return 0; }