【データ構造】シーケンステーブルの定義と実装


シーケンステーブルの定義

シーケンステーブルつまり、使用します順次ストレージ線形テーブルを実現する方法。
シーケンシャルストレージ。バンドル論理的に隣接している要素は以下に保存されます物理的に隣接しているの記憶部では、要素間の関係が記憶部の隣接関係に反映される。
ここに画像の説明を挿入


シーケンステーブルの実装

ここに画像の説明を挿入

静的割り当て

静的割り当てでは、配列のサイズと領域があらかじめ固定されているため、領域がいっぱいになると、新しいデータを追加するとオーバーフローが発生し、プログラムがクラッシュします。
静的ストレージを使用する場合、最初に最大長を定義し、次にシーケンス テーブルを宣言し、配列を使用して宣言されたシーケンス テーブルにデータ要素を格納し、現在の長さを定義します。コードは次のとおりです。
Sq:sequence (順序、順序)

#include <stdio.h>
 // 静态存储
// 定义最大长度,最大为10个,所以只能存放10个
#define MaxSize 10
// 声明顺序表
typedef struct {
    
    
	// 用静态的数组存放数据元素
	int data[MaxSize];
	// 顺序表的当前长度
	int length;
}SqList; // 顺序表的类型定义

シーケンス テーブルを初期化する シーケンス テーブルを
宣言した後、シーケンス テーブルを初期化して、すべてのデータ要素をデフォルトの初期値に設定する必要があります。シーケンス テーブルの初期長は 0 に設定されます (このステップは必ず実行する必要があります!!!)
如果没有初始化顺序表,则内存中会有遗留的脏数据,所以将length的值设置为0这一步必须做!!!
初期化コードは次のとおりです。

#include <stdio.h>
 // 静态存储
// 定义最大长度,最大为10个,所以只能存放10个
#define MaxSize 10
// 声明顺序表
typedef struct {
    
    
	// 用静态的数组存放数据元素
	int data[MaxSize];
	// 顺序表的当前长度
	int length;
}SqList; // 顺序表的类型定义

// 初始化顺序表
void InitList(SqList& L){
    
    
	for (int i = 0; i < MaxSize; i++) {
    
    
		// 将所有数据元素设置为默认初始值
		L.data[i] = 0;
		// 设置顺序表初试长度为0
		L.length = 0;
	}
}

int main() {
    
    
	// 声明顺序表
	SqList L;
	// 初始化顺序表
	InitList(L);
	return 0;
}

知らせ:

  • 静的割り当てを使用する場合、配列がいっぱいの場合、シーケンス テーブルの長さは最初に決定された後は変更できないため (記憶領域は静的です)、「処理を放棄」します。
  • 最初に大きなメモリ空間を宣言する必要はなく、ストレージ リソースを無駄に消費します。

動的割り当て

動的割り当てが使用される場合、配列を保存するためのスペースは、プログラムの実行中に動的ストレージ割り当てステートメントを通じて割り当てられます。配列スペースがいっぱいになると、線形ではなく、元のストレージ スペースを置き換えるために、別のより大きなストレージ スペースが開かれます。 . テーブルはすべてのスペースを一度に分割します。
動的割り当ては「動的配列」を使用して実装されます。最初に初期長を定義し、次にシーケンス テーブルを定義し、シーケンス テーブル内のポインタを使用して配列を動的に割り当て、シーケンス テーブルの最大容量と現在の長さを定義します。

#include <stdio.h>
// 初始长度
#define InitSize 10
typedef struct {
    
    
	// 动态分配数组的指针
	ElemType *data;
	// 顺序表的最大容量
	int MaxSize;
	// 顺序表的当前长度
	int length;
}SeqList;

メモリ空間を動的に適用し、メモリ空間を動的に解放します (malloc、free)

初期動的メモリ割り当てステートメント: L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize)

  • L.data: 連続した記憶空間全体の開始アドレスを指します。
  • (ElemType *): malloc 関数はポインターを返します。このポインターは、定義したデータ要素タイプへのポインターとしてキャストする必要があります。
  • malloc: メモリ空間を動的に適用します。
  • InitSize: malloc 関数のパラメータ。割り当てる連続メモリ空間の量を示します。

注: malloc 関数と free 関数を使用するには、ヘッダー ファイル #include <stdlib.h> を導入する必要があります。

#include <stdio.h>
#include <stdlib.h>
// 初始长度
#define InitSize 10
typedef struct {
    
    
	// 动态分配数组的指针
	int *data;
	// 顺序表的最大容量
	int MaxSize;
	// 顺序表的当前长度
	int length;
}SqList;
// 初始化顺序表
void InitList(SqList& L) {
    
    
	//申请一片连续的存储空间
	L.data = (int *)malloc(sizeof(int) * InitSize);
		// 设置顺序表初试长度为0
		L.length = 0;
		L.MaxSize = InitSize;
}
//动态插入数据,增加长度
void IncreaseSize(SqList& L, int len) {
    
    
	int* p = L.data;
	L.data = (int*)malloc((L.MaxSize + len) * sizeof(int));
	for (int i = 0; i < L.length;i++) {
    
    
		// 将数据复制到新区域,但是这样使用时间开销大
		L.data[i] = p[i];
	}
	// 顺序表的最大长度增加len
	L.MaxSize = L.MaxSize + len;
	// 释放原来的内存空间
	free(p);
}
int main() {
    
    
	// 声明顺序表
	SqList L;
	// 初始化顺序表
	InitList(L);
	//插入数据
	IncreaseSize(L, 6);
	return 0;
}

シーケンステーブルの特徴

シーケンス テーブルは、ランダム アクセス、高い記憶密度、不便な容量拡張、および不便なデータ要素の挿入と削除によって特徴付けられます。
ここに画像の説明を挿入


要約する

以上が今日の学習内容です~
ご興味がございましたら、コラムを購読して更新を続けてください~
また次回~
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_55394328/article/details/131728649