シーケンステーブル
概念と構造
シーケンステーブルは、連続した物理アドレスを持つ記憶装置を使用してデータ要素を順番に格納する線形構造であり、一般的には配列記憶装置が使用されます。
アレイ上のデータの追加、削除、確認、変更を完了します。
シーケンス テーブルは通常、次のように分割できます。
- 静的シーケンス テーブル: 要素を格納するために固定長配列を使用します。
- 動的シーケンス テーブル: 動的に開かれた配列ストレージを使用します。
- ここではモジュール式テストを使用することをお勧めします。これにより、デバッグが容易になり、コードの可読性と保守性が向上します。
インターフェース宣言
**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;
}