//顺序表,栈上分配静态*****//凡是有关设计_size的数据都需要一个辅助变量来帮忙,保证数据安全
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX_SIZE 10
typedef int DAtatType;
typedef struct SeqList
{
DataType _array[MAX_SIZE];//静态数组
size_t _size;//数据的个数
}SeqList;
void InitSeqList(SeqList* seq);//初始化
void PrintSeqList(SeqList* seq);//打印
void PushBack(SeqList* seq, DataType x);//压入
void PopBack(SeqList* seq);//弹出
void PushFront(SeqList* seq, DataType x);//从头压入
void Popfront(SeqList* seq);//从头探出
void Insert(SeqList* seq, size_t pos, DataType x);//在一个链表的某位置插入某个元素
DataType Find2(SeqList* seq, size_t pos);//返回元素
int Find1(SeqList* seq, DataType x);//返回-1表示未找到
void Erase(SeqList* seq, size_t pos);//删除pos位置的置
void Remove(SeqList* seq, DataType x);//从头遍历,删除第一个x
void RemoveAll(SeqList* seq, DataType x);//删除所有的x
void Modify(SeqList* seq, size_t pos, DataType x);//修改指定位置的数为x
void test(void);//测试
typedef int DataType;
typedef struct SeqList
{
DataType _array[MAX_SIZE]; // 静态数组
size_t _size; // 数据的个数
}SeqList;
void InitSeqList(SeqList* seq)
{
assert(seq);//测试指针有效性
memset(seq->_array, 0, sizeof(DataType)*MAX_SIZE);//初始化函数
seq->_size = 0;
}
void PrintSeqList(SeqList* seq) //判断是否合法,设置一个int index,打印,注意空格或者换行
{
size_t index = 0;
assert(seq);
for (; index < seq->_size; ++index)
{
printf("%d ", seq->_array[index]);
}
printf("\n");
}
void PushBack(SeqList* seq, DataType x)//判断能否插入,传入是否合法,复职
{
assert(seq);
if (seq->_size >= MAX_SIZE)
{
printf("SeqList is full\n");
return;
}
seq->_array[seq->_size++] = x;
}
void PopBack(SeqList* seq)//尾部探出,注意当前容量--
{
assert(seq);
if (seq->_size == 0)
{
printf("SeqList is empty\n");
return;
}
seq->_size--;
}
void PushFront(SeqList* seq, DataType x)//从头部插入***比较麻烦
{
size_t index = seq->_size;//为了数据安全要辅助变量 1]判断位置是否合法 2]判断链表是否已经满了
assert(seq);
if (seq->_size >= MAX_SIZE)
{
printf("SeqList is full\n");
return;
}
for (; index > 0; index--)//3]后移
{
seq->_array[index] = seq->_array[index - 1];
}
seq->_array[0] = x;//4]插入
seq->_size++;//5]改变大小
}
void PopFront(SeqList* seq)//探出操作 1]辅助变量一个 2]判断链表传入正常,大小正常 3]移动并覆盖
{
size_t index = 0;
assert(seq);
if (seq->_size == 0)
{
printf("SeqList is empty\n");
return;
}
for (; index<seq->_size - 1; index++)
{
seq->_array[index] = seq->_array[index + 1];
}
seq->_size--;
}
void Insert(SeqList* seq, size_t pos, DataType x)
{
//1]插入属否合法,链表是否正常
size_t index = seq->_size;
assert(seq);
assert(pos <= seq->_size);//测试位置是否超出范围
for (; index >pos; index--)//2]移动并插入到任意位置
{
seq->_array[index] = seq->_array[index - 1];
}
seq->_array[pos] = x;
seq->_size++;// 3]大小++
}
// 返回-1表示未找到数据
int Find2(SeqList* seq, DataType x)//找某个数据的第一次在数组中出现的位置
{
size_t find_index = 0;
assert(seq);
for (; find_index < seq->_size; find_index++)
{
if (seq->_array[find_index] == x)
return find_index;//返回元素下标
}
return -1;
}
DataType Find1(SeqList* seq, size_t pos)//提出某个位置的元素
{
if (pos > seq->_size || pos < 0)
{
printf("检索位置不合法");
}
return seq->_array[pos];
}
void Erase(SeqList* seq, size_t pos)//删除操作
{
size_t index = 0;
assert(seq);
assert(pos <= seq->_size);
for (index = pos; index < seq->_size - 1; index++)//注意_size-1
{
seq->_array[index] = seq->_array[index + 1];
}
seq->_size--;
}
void Remove(SeqList* seq, DataType x)//删除某个元素
{
//int index=find1(Seqlist* seq, DataType x);
//if(index== -1)
//printf("no search");
//Erease((size_t)index);
size_t find_index = 0;
size_t index = 0;
assert(seq);
for (; find_index < seq->_size; find_index++)//查找检索
{
if (seq->_array[find_index] == x)
{
for (index = find_index; index < seq->_size - 1; index++)//移动检索
{
seq->_array[index] = seq->_array[index + 1];
}
seq->_size--;
break;
}
}
if (find_index == seq->_size)
{
printf("no search\n");
}
}
void RemoveAll(SeqList* seq, DataType x) //
{
size_t index = 0;
size_t dx = 0;
size_t count = 0;
assert(seq);
for (; index < seq->_size;)//边拷贝,边比较
{
if (seq->_array[index] == x)
{
index++;
count++;
}
else
{
seq->_array[dx++] = seq->_array[index++];
}
}
seq->_size -= count;
}
void Modify(SeqList* seq, size_t pos, DataType x)//修改指定位置的数
{
assert(seq);
assert(pos <= seq->_size);
seq->_array[pos] = x;
}
void test()
{
SeqList seq;
size_t index;
PushBack(&seq, 1);
PushBack(&seq, 2);
PrintSeqList(&seq);
PopBack(&seq);
PrintSeqList(&seq);
PushFront(&seq, 4);
PushFront(&seq, 5);
PrintSeqList(&seq);
Insert(&seq, 0, 3);//在下标0位置插入3
PrintSeqList(&seq);
Erase(&seq, 1);//删除找到的下标位置的数
PrintSeqList(&seq);
Remove(&seq, 1);//删掉第一个1出现的位置的1
PrintSeqList(&seq);
RemoveAll(&seq, 2);//删除所有的2
PrintSeqList(&seq);
Modify(&seq, 3, 2);//将下标3的数改为2
PrintSeqList(&seq);
}
int main(void)
{
test();
system("pause");
return 0;
}
c_SeqList
最新推荐文章于 2025-02-14 21:44:54 发布