データ構造シーケンステーブル - C言語実装インターフェース

シーケンステーブル

概念と構造
シーケンステーブルは、連続した物理アドレスを持つ記憶装置を使用してデータ要素を順番に格納する線形構造であり、一般的には配列記憶装置が使用されます。

アレイ上のデータの追加、削除、確認、変更を完了します。

シーケンス テーブルは通常、次のように分割できます。

  1. 静的シーケンス テーブル: 要素を格納するために固定長配列を使用します。
  2. 動的シーケンス テーブル: 動的に開かれた配列ストレージを使用します。
  • ここではモジュール式テストを使用することをお勧めします。これにより、デバッグが容易になり、コードの可読性と保守性が向上します。

インターフェース宣言

                                        **SeqList.h**           
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


typedef int SLDateType;

//动态顺序表

typedef struct SeqList
{
    
    
	SLDateType* arr; //指针域:指向动态数组的指针   
	int sz;          //数据域:数据个数
	int Capacity;    //数据域:容量空间
}SL;

//初始化
//void SeqListInit(SL* ps);
void SLInit(SL* ps);

//销毁
void SLDestory(SL* ps);

//打印顺序表
void SLPrint(SL* ps);

//扩容
void SLCheckCapacity(SL* ps);

//尾部插入
void SLPushBack(SL* ps, SLDateType x); //O(1)

//尾部删除
void SLPopBack(SL* ps); //O(1)

//头部插入
void SLPushFront(SL* ps, SLDateType x); //O(N)

//头部删除
void SLPopFront(SL* ps); //O(N)


//任意位置插入
void  SLInsert(SL* ps,int pos,SLDateType x);

//任意位置删除
void  SLErase(SL* ps, int pos);

//查找
int SLFind(SL* ps, SLDateType x);

//修改
void SLModify(SL* ps,int pos, SLDateType x);

インターフェースの実装

                                           **SeqList.c**         
#include"SeqList.h"


//初始化
void SLInit(SL* ps)  
{
    
    
	assert(ps);

	ps -> arr = NULL;
	ps -> sz = ps -> Capacity = 0;
}

//销毁
void SLDestory(SL* ps)
{
    
    
	if (ps->arr)
	{
    
    
		free(ps->arr);
		ps->arr = NULL;
		ps->sz = ps->Capacity = 0;
	}
}


//扩容
void SLCheckCapacity(SL* ps)
{
    
    
	assert(ps);

	//检查容量空间 - 扩容
	if (ps->sz == ps->Capacity)
	{
    
    
		int newCapacity = ps->Capacity == 0 ? 4 : ps->Capacity * 2; //条件操作符 如果Capacity 空间为0 则赋给4byte,反之空间*2

		SLDateType* tmp = (SLDateType*)realloc(ps->arr, newCapacity * sizeof(SLDateType));
		if (tmp == NULL)
		{
    
    
			perror("SLPushBack::realloc");
			exit(-1); //结束程序
			//return;
		}

		ps->arr = tmp;
		ps->Capacity = newCapacity;
	}
}


//尾部插入
void SLPushBack(SL* ps, SLDateType x )
{
    
    
	assert(ps);

	SLCheckCapacity(ps);//扩容
	   
	//插入数据
	ps->arr[ps->sz] = x;
	ps->sz++;
}


//头部插入
void SLPushFront(SL* ps, SLDateType x)
{
    
    
	assert(ps);

	SLCheckCapacity(ps);//扩容

	//挪动数据
	int end = ps->sz - 1;
	while (end >= 0)
	{
    
    
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}

	//插入数据
	ps->arr[0] = x;
	ps->sz++;

}


//尾部删除 - 1
//void SLPopBack(SL* ps)
//{
    
    
//	assert(ps);
//
//	//怀柔检查
//	//if (ps->sz == 0)
//	//{
    
    
//	//	printf("SeqList is empty\n");
//	//	return;
//	//}
//
//	//暴力检查
//	assert(ps->sz > 0);
//
//	ps->sz--;
//}
//尾部删除 - 2
void SLPopBack(SL* ps)
{
    
    
	SLErase(ps, ps->sz - 1);
}



//头部删除-1
//void SLPopFront(SL* ps)
//{
    
    
//	assert(ps);
//
//	assert(ps->sz > 0);
//
//	int begin = 1;
//	while (begin < ps->sz)
//	{
    
    
//		ps->arr[begin - 1] = ps->arr[begin];
//		begin++;
//	}
//
//	ps->sz--;
//}
//头部删除-2
void SLPopFront(SL* ps)
{
    
    
	SLErase(ps, 0);
}


//打印顺序表
void SLPrint(SL* ps)
{
    
    
	assert(ps);

	for (int i = 0; i < ps->sz; i++)
	{
    
    
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}


//任意位置插入
void  SLInsert(SL* ps, int pos, SLDateType x) 
{
    
    
	assert(ps);
	assert(pos >= 0 && pos <= ps->sz );

	SLCheckCapacity(ps);//扩容

	//挪动数据
	int end = ps->sz - 1;
	while (end >= pos)
	{
    
    
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}

	ps->arr[pos] = x;
	ps->sz++;

}



//任意位置删除
void  SLErase(SL* ps, int pos)
{
    
    
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);

	int begin = pos;
	while (begin < ps->sz-1)
	{
    
    
		ps->arr[begin] = ps->arr[begin + 1];
		begin++;
	}

	//int begin = pos+1;
	//while (begin < ps->sz)
	//{
    
    
	//	ps->arr[begin-1] = ps->arr[begin];
	//	begin++;
	//}

	ps->sz--;
}

//查找
int SLFind(SL* ps, SLDateType x)
{
    
    
	assert(ps);
	for (int i = 0; i < ps->sz; i++)
	{
    
    
		if (ps->arr[i] == x)
		{
    
    
			return i;
		}
	}

	return -1;
}

//修改
void SLModify(SL* ps,int pos, SLDateType x)
{
    
    
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);

	ps->arr[pos] = x;
}


インターフェーステスト

                                            **test.c**        
#include"SeqList.h"


void TestSeqList1()//测试尾插
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPrint(&sl);

	SLPushBack(&sl, 5);
	SLPrint(&sl);

	SLPushBack(&sl, 5);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 5);
	SLPrint(&sl);
}

void TestSeqList2()//测试头插
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLPushFront(&sl, 5);
	SLPrint(&sl);
}

void TestSeqList3()//测试尾删
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLPopBack(&sl);//尾删
	SLPrint(&sl);

	SLPopBack(&sl); 
	SLPopBack(&sl);
	SLPopBack(&sl);
	//SLPopBack(&sl);


	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	
	SLPrint(&sl);

	SLDestory(&sl);//销毁

}

void TestSeqList4()//测试头删
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPopFront(&sl);
	SLPopFront(&sl);
	//SLPopFront(&sl);

	SLPushFront(&sl, 4);
	SLPrint(&sl);

}


void TestSeqList5()//测试任意位置插入
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLInsert(&sl,3,40);
	SLPrint(&sl);


	//SLPushBack(&sl,50);
	//SLPrint(&sl);

	SLInsert(&sl, 5, 40);
	SLPrint(&sl);
}

void TestSeqList6()//测试任意位置插入
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	SLErase(&sl, 2);
	SLPrint(&sl);

	SLErase(&sl, 1);
	SLPrint(&sl);

	SLErase(&sl, 2);
	SLPrint(&sl);
}

void TestSeqList7()//测试任意位置删除
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	SLPopBack(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

}

void TestSeqList8()//测试 查找 
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	int x = 0;
	printf("请输入要删除的值:>");
	scanf("%d", &x);
	int pos = SLFind(&sl, x);
	if (pos != -1)
	{
    
    
		SLErase(&sl, pos);
	}
	else
	{
    
    
		printf("没有找到:>%d", x);
	}
	SLPrint(&sl);
}

void TestSeqList9()//测试 修改
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	int x = 0;
	int y = 0;
	printf("请输入要修改的值:>");
	scanf("%d%d", &x,&y);
	int pos = SLFind(&sl, x);
	if (pos != -1)
	{
    
    
		SLModify(&sl, pos,y);
	}
	else
	{
    
    
		printf("没有找到:>%d", y);
	}
	SLPrint(&sl);

}

void TestSeqList10()//测试 删除相同的数字
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	int x = 0;
	printf("请输入要删除的值:>");
	scanf("%d", &x);
	int pos = SLFind(&sl, x);

	while (pos != -1)
	{
    
    
		SLErase(&sl, pos); 
		pos = SLFind(&sl, x);
	}

	SLPrint(&sl);
}


int main()
{
    
    
	//TestSeqList10();

	return 0;
}




おすすめ

転載: blog.csdn.net/m0_73969113/article/details/131437062