シーケンステーブルの関連操作:ヘッド挿入、テール挿入、ヘッド削除、テール削除、任意の位置での挿入と削除

シーケンステーブルの関連操作:ヘッド挿入、テール挿入、ヘッド削除、テール削除、任意の位置での挿入と削除

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

シーケンステーブルを格納する構造体を定義します。構造体には、配列ポインタデータ、有効な要素のサイズの数、および配列の現在の容量の3つの要素があります。

ここで、コードの適用性を向上させるために、配列のデータ型にtypedef、slDatatypeという名前を付けました。これは、他のデータ型を後で操作するのに便利です。

初期化シーケンステーブル

シーケンステーブルを初期化します。つまり、シーケンステーブルはすでに存在しますが、内容は空です。

容量と拡張を確認してください

シーケンステーブルは動的に格納用のスペースを開く必要があるため、スペースのサイズが挿入操作中にデータを挿入する必要性を満たしているかどうかを確認する必要があります。要素が挿入される場所に関係なく、チェックする必要があります。

挿入および削除操作を終了します

挿入の終了:最初にシーケンステーブルが有効かどうかを判断し、次に容量と拡張を確認し、配列の最後の有効な位置の後に挿入する必要のあるデータを配置し、挿入するデータであるsize ++を格納します。シーケンステーブルの有効ビット。

テールの削除:シーケンステーブルが正当であると判断し、直接サイズ---つまり、最後のビットがシーケンステーブルの有効なデータではありません。これは誤った削除です。この場所のデータは実際には削除されませんが、シーケンステーブルとの接続が切断され、使用できなくなります。

ヘッドプラグ削除操作

頭の挿入と頭の削除は、両方とも要素の移動を伴うため、尾の挿入と尾の削除よりも比較的複雑です。

ヘッド挿入:合法的に判断し、容量を確認し、シーケンステーブルのすべての要素を後ろから前に1桁ずつ後方に移動し、指定した要素を最初の位置に挿入します。

ヘッダーの削除:頭の挿入操作と尾の削除操作を組み合わせて、要素を前から後ろの順序で1つ前に移動します。

任意の位置で挿入および削除

アナログヘッドプラグ削除、テール挿入、テール削除操作は、リエントリーが必要な位置でのみ実現できます。この機能を実装すると、ヘッド削除、ヘッド挿入、テール削除、テール挿入操作をさらに最適化できます。 、posをそれぞれ0に設定する限り、サイズ。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef int slDatatype;//顺序表内的数据类型(便于维护)

//动态顺序表
typedef struct seqList 
{
    
    
	slDatatype *data;  //数组指针
	int size;           //有效元素个数
	int capacity;       //数组内存空间

} seqList;

//初始化顺序表
void Init(seqList* sl)//形参为结构体指针
{
    
    
	sl->data = NULL;
	sl->size = 0;
	sl->capacity = 0;
}


//检查容量及扩容
void Checkcapacity(seqList*sl)
{
    
    
	if (sl->size == sl->capacity)
	{
    
    
		//开辟新空间
		int newCapacity = sl->capacity == 0 ? 1 : 2 * sizeof(sl->capacity);
		slDatatype * tmp = (slDatatype*)malloc(newCapacity*sizeof(slDatatype));

		//拷贝数据
		memcpy(tmp, sl->data, sizeof(slDatatype)*sl->size);

		//释放原有空间
		free(sl->data);
		sl->data = tmp;

	//若使用realloc动态开辟空间————可替换35-42行
		//sl->data = (seqList*)ralloc(sl->data, newCapacity * sizeof(slDatatype));

		//更新容量
		sl->capacity = newCapacity;

	}
}

//打印顺序表
void Listprint(seqList*sl)
{
    
    
	if (sl == NULL)
		return;
	for (int i = 0; i < sl->size; i++)
	{
    
    
		printf("%d ", sl->data[i]);
	}
	printf("\n");
}

//尾插
void Pushback(seqList* sl,slDatatype val)
{
    
    
	if (sl == NULL)
		return;

	Checkcapacity(sl);

	sl->data[sl->size] = val;
	sl->size++;
}

//尾删
void Popback(seqList* sl)
{
    
    
	if (sl == NULL||sl->size==0)
		return;
	if (sl->size > 0)
		sl->size--;
}


//头插
void Pushfront(seqList*sl,slDatatype val)
{
    
    
	if (sl == NULL)
		return;

	//检查容量
	Checkcapacity(sl);
    
	//移动元素--从后向前
	int end = sl->size;
	while (end > 0)
	{
    
    
		sl->data[end] = sl->data[end - 1];
		--end;
	}

	//插入元素
	sl->data[0] = val;
	sl->size++;
}


//头删
void Popfront(seqList* sl)
{
    
    
	if (sl == NULL||sl->size==0)
		return;
	
	//从前向后移动元素
	for (int i = 0; i < sl->size; i++)
	{
    
    
		sl->data[i] = sl->data[i + 1];
	}

	//更新size
	sl->size--;
}

//任意位置插入元素
void Insert(seqList*sl, int pos, slDatatype val)
{
    
    
	if (sl == NULL)
		return;
	Checkcapacity(sl);
	if (pos >= 0 && pos <= sl->size)
	{
    
    
		//移动数据
		int end = sl->size;
		while (end > pos)
		{
    
    
			sl->data[end] = sl->data[end - 1];
			end--;
		}
		//插入数据
		sl->data[pos] = val;
		sl->size++;
	}
}

//删除任意位置数据
void Erase(seqList*sl, int pos)
{
    
    
	if (sl == NULL || sl->size == 0)
		return;
	if (pos >= 0 && pos < sl->size)
	{
    
    
		while (pos<sl->size)
		{
    
    
			sl->data[pos] = sl->data[pos+1];
			pos++;
		}
		sl->size--;
	}
}

//测试模块---该部分功能根据用户需要自定义
void test()
{
    
    
	seqList sl;
	Init(&sl);
	Pushback(&sl, 1);
	Pushback(&sl, 2);
	Pushback(&sl, 3);
	Pushback(&sl, 4);

	Erase(&sl, 1);
	Listprint(&sl);


}

//销毁顺序表
void Destroy(seqList* sl)
{
    
    
	if (sl != NULL && sl->data != NULL)
	{
    
    
		free(sl->data);
		sl->data = NULL;
	}
}


int main()
{
    
    
	test();
	return 0;
}


おすすめ

転載: blog.csdn.net/weixin_43962381/article/details/110877108