c_SeqList

//顺序表,栈上分配静态*****//凡是有关设计_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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值