数据结构之顺序表

本文介绍了SeqList结构体的定义及一系列操作,包括初始化、销毁、检查空间、尾插法、尾删法、头插法、头删法、查找、插入和删除元素。这些操作涉及到动态内存分配和数据移动,确保了列表容量的动态扩展和元素的有效管理。
摘要由CSDN通过智能技术生成
typedef struct SeqListPushBack
{
    SLDataType* a;//SLDataType表示a的数据类型
    int size;
    int capacity;
}
void SeqListInit(SL* ps)
{
    ps->a=NULL;
    ps->size=ps->capacity=0;//初始化表
}
void SeqListDestiry(SL* ps)
{
    free(ps->a);
    ps->=NULL;
    ps->capacity=ps->size=0;//释放表
}

 检查空间是否充足

void SeqListCheckCapacity(SL* ps)
{
//如果没有空间或者空间不足
   if (ps->size==ps->capacity)  //如果ps->size==ps->capacity,说明空间不够
 {
   int  newcapacity=ps->capacity==0?4:ps->capacity*2; //如果原来表的容量为0,则增加4个容量,否则增加两倍的容量
   SLDataType* tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));//开辟空间
   if (tmp==NULL)
   {
   printf("realloc fail\n");//如果开辟空间失败,返回失败
   exit(-1);//终止程序,不能写成return-1
   }
   ps->a=tmp;//开辟空间成功的话,
   ps->capacity=newcapacity;
 }
}
   

1.尾插法

void SeqListPushBack(SL* ps,SLDataType x)//尾插法
{
    //如果没有空间或者空间不足
   if (ps->size==ps->capacity)  //如果ps->size==ps->capacity,说明空间不够
 {
   int  newcapacity=ps->capacity==0?4:ps->capacity*2; //如果原来表的容量为0,则增加4个容量,否则增加两倍的容量
   SLDataType* tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));//开辟空间
   if (tmp==NULL)
   {
   printf("realloc fail\n");//如果开辟空间失败,返回失败
   exit(-1);//终止程序,不能写成return-1
   }
   ps->a=tmp;//开辟空间成功的话,
   ps->capacity=newcapacity;
 }
   ps->a[ps->size]=x;//放入数据
   ps->size++;//向后移
}

 2.尾删法

void SeqListPopBack(SL* ps)//尾删法
{
    //ps->a[ps->size-1]=0;//最后一个元素是size-1,把它置为0,但是如果最后一个数据是0,就多此一举,因此直接执行下面的语句
    assert(ps->size>0);//防止ps->size为负越界,判断一下
    ps->size--;//向前移动
}

3.头插法

void SeqListPushFront(SL* ps,SLDataType x)
{
    //挪动数据
    int end=ps->size-1;//数据从最后一个开始整体向后挪动
    while(end>=0)
    {
       ps->a[end+1]=ps->a[end]; //前一个的值赋值给后一个
       end--;//向前移动
    }
    ps->a[0]=x;//把x的值赋给第一个元素
    ps->size++;//表的大小加一
}

4.头删法

void SeqListPopFront(SL* ps)
{
    assert(ps->0);//表中元素不为0
    int begin=1;
    while(begin<ps->size)
    {
      ps->a[begin-1]=ps->a[begin];
      ++begin;
    }
    ps->size--;//表的大小减一
}

5.找到数据为x的位置下标,没有找到返回-1

void SeqListFind(SL* ps,SLDataType x)
{
    for(int i=0;i<ps->size;i++)
    {
        if(ps->a[i]==x)
        {
            return i;
        }
    }
    return -1;
}

 6.指定pos下标位置插入

void SeqListInsert(SL* ps,int pos,SLDataType x)
{
    if(pos>ps->size||pos<0)
    {
       printf("pos invalid\n");
       return;
    }
    SeqListCheckCapacity(ps);//防止溢出
    int end=ps->size-1;
    while(pos<=end)
    {
        ps->[end+1]=ps->[end];
        --end;//end往前移动,直到与pos相等
    }
    ps->a[pos]=x;//把值赋给pos位置
    ps->size++;//大小加一
}

7. 删除pos位置的数据

void SeqListErase(SL* ps,int pos)
{
   assert(pos>=0&&pos<ps->size);
   int i=pos+1;
   while(i<ps->size)
   {
     ps->a[i-1]=ps->a[i];
      ++i;
    }
    ps->size--;//表的大小减一
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值