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