数据结构-顺序表(2)详细解析

上期我们讲了顺序表的尾插、头插、尾删、头删,接下来我们继续讲关于顺序表的其他操作,来彻底把顺序表讲明白。在最后我会把整个顺序表的代码都附上。

3.9 顺序表在指定位置之前插入数据

void SLInsert(SL *ps ,int pos,SLDataType x)
{
    assert(ps);
    assert(pos>=0&&pos<ps->size);
    SLCheckCapacity(ps);
    for(int i=ps->size;i>pos;i--)
    {
        ps->arr[i]=ps->arr[i-1];
    }
    ps->arr[pos];
    ps->size++;

}

我们自己在写代码的时候,需要注意for循环中i的结束条件,我建议大家可以自己画个图,再带入条件自然就出来了。

3.10 在顺序表中删除某个位置的数据

void SLErase(SL *ps,int pos)
{
    assert(ps);
    assert(pos>=0&&pos<ps->size);
    for(int i=pos;i<ps->size-1;i++)
    {
        ps->arr[i]=ps->arr[i+1];
    }
    ps->size--;
}

3.11 在顺序表中查找某个数据

int SLFind(SL* ps,SLDataType x)
{
    assert(ps);
    for(int i=0;i<ps->size;i++)
    {
        if(ps->arr[i]==x)
        return i;
    }
    printf("没有找到!");
    return -1;
}

这些大概就是所有顺序表的内容,下面我把整个顺序表的代码放到下面

Seqlist.c:

#include"Seqlist.h"
void SLInit(SL* ps)
{
    assert(ps);
    ps->arr=NULL;
    ps-> capacity=ps->size=0;
}

void SLDestroy(SL* ps)
{
    assert(ps);
    free(ps->arr);
    ps->arr=NULL;
    ps->capacity=ps->size=0;
}

void SLPrint(SL s)
{
    for(int i=0;i<s.size;i++)
    {
        printf("%d  ",s.arr[i]);
    }
    printf("\n");
}

void SLCheckCapacity(SL *ps)
{
    if(ps->capacity==ps->size)
    {
        int NewCapacity=ps->capacity==0?4:2*ps->capacity;
        SLDataType * tmp=(SLDataType*)realloc(ps->arr,NewCapacity*sizeof(SLDataType));
        if(tmp==NULL)
        {
            perror("realloc fail");
            exit(1);
        }
        ps->arr=tmp;
        ps->capacity=NewCapacity;
    }

}

void SLPushBack(SL *ps,SLDataType x)
{
    //温柔的方式
    // if(ps==NULL)
    // {
    //     return ;
    // }
    //或者直接assert
    assert(ps);
    // if(ps->capacity==ps->size)
    // {
    //     int NewCapacity=ps->capacity==0?4:2*ps->capacity;
    //     SLDataType * tmp=(SLDataType*)realloc(ps->arr,NewCapacity*sizeof(SLDataType));
    //     if(tmp==NULL)
    //     {
    //         perror("realloc fail");
    //         exit(1);
    //     }
    //     ps->arr=tmp;
    //     ps->capacity=NewCapacity;
    // }
    SLCheckCapacity(ps);
    ps->arr[ps->size++]=x;
}

void SLPushFront(SL*ps ,SLDataType x)
{
    assert(ps);
    SLCheckCapacity(ps);
    for(int i=ps->size;i>=0;i--)
    {
        ps->arr[i]=ps->arr[i-1];
    }
    ps->arr[0]=x;
    ps->size++;
}

void SLPopBack(SL* ps)
{
    assert(ps);
    assert(ps->size);
    --ps->size;
}

void SLPopFront(SL* ps)
{
    assert(ps);
    assert(ps->size);
    for(int i=0;i<ps->size-1;i++)
    {
        ps->arr[i]=ps->arr[i+1];
    }
    --ps->size;
}

void SLInsert(SL *ps ,int pos,SLDataType x)
{
    assert(ps);
    assert(pos>=0&&pos<ps->size);
    SLCheckCapacity(ps);
    for(int i=ps->size;i>pos;i--)
    {
        ps->arr[i]=ps->arr[i-1];
    }
    ps->arr[pos];
    ps->size++;

}

void SLErase(SL *ps,int pos)
{
    assert(ps);
    assert(pos>=0&&pos<ps->size);
    for(int i=pos;i<ps->size-1;i++)
    {
        ps->arr[i]=ps->arr[i+1];
    }
    ps->size--;
}

int SLFind(SL* ps,SLDataType x)
{
    assert(ps);
    for(int i=0;i<ps->size;i++)
    {
        if(ps->arr[i]==x)
        return i;
    }
    printf("没有找到!");
    return -1;
}

Seqlist.h:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
//动态顺序表
typedef struct SeqList
{
    SLDataType * arr;
    int size;//有效数据的个数
    int capacity;//空间大小
}SL;

void SLInit(SL *ps);
void SlDestroy(SL * ps);
void SLCheckCapacity(SL *ps);
void SLPrint(SL s);
void SLPushBack(SL * ps,SLDataType x);
void SLPushFront(SL* ps,SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
void SLInsert(SL*ps ,int pos,SLDataType x);
void SLErase(SL* ps,int pos);
int SLFind(SL*ps ,SLDataType x);

test.c: 这个就是测试你写的功能对不对,可以自己测试各个函数的功能!

#include"Seqlist.h"


void test01()
{
    SL T;
    SLInit(&T);
    SLPushBack(&T,3);
    SLPushBack(&T,4);
    SLPushBack(&T,6);
    SLPushBack(&T,9);
    SLPrint(T);
    SLErase(&T,2);
    int m=SLFind(&T,9);
    printf("%d",m);
}
int main()
{
    test01();
    return 0;
}

接下来我会继续更新数据结构的知识,下一个专题就到链表啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值