【数据结构】C语言中顺序表的基本操作(创建、插入、删除、修改、查看、销毁)

顺序表

优点

  • 地址连续,大小固定
  • 存储密度大
  • 除第0个元素外,其余元素都有前驱;除最后一个元素外,其余元素都有后继
  • 可以通过下标访问,访问非常方便
  • 插入和删除都需要移动元素,不方便

缺点

  • 地址连续的大空间,有时申请会失败
  • 插入和删除时,移动元素,效率比较低

顺序表的定义

在这里插入图片描述

typedef int datatype;   //方便后续数据类型的修改
typedef struct orderlist
{
    datatype * pdata;//一个指针指向连续的存储空间
    int size;//存储空间的大小
    int count;//已经存储的数据个数;
} LIST;

顺序表的创建

/***************************************************
函数名:create
函数功能:创建顺序表
函数参数:顺序表的大小
函数返回值:创建成功返回顺序表的首地址;失败返回NULL
****************************************************/
LIST * create(int size)
{
    LIST * plist=(LIST *)malloc(sizeof(LIST));
        if(NULL==plist)
        {
            return NULL;
        }
    plist->pdata=(datatype *)malloc(sizeof(datatype)*size);
        if(NULL==plist->pdata)
        {
            free(plist);
            plist=NULL;
            return NULL;
        }
    memset(plist->pdata,0,sizeof(datatype)*size);
    plist->size=size;
    plist->count=0;
    return plist;
}

顺序表的插入

插入分为三种情况

  • 头插
    在这里插入图片描述
  • 尾插
    在这里插入图片描述
  • 中间插入
    在这里插入图片描述
/***************************************************
函数名:insert
函数功能:向顺序表中指定位置插入元素
函数参数:1.顺序表地址 2.插入元素 3.插入位置
返回值:成功返回0;失败返回-1;
*****************************************************/
int insert(LIST * plist,datatype newdata,int offset)
{
    int i=0;
    if(NULL==plist || NULL==plist->pdata || plist->count==plist->size || offset>plist->size ||offset<0)
        {
            return 0;
        }
    if(plist->count==offset) //尾插
    {
        plist->pdata[plist->count]=newdata;
        plist->count++;
        return 0;
    }
    else{
        for(i=plist->count-1;i>=0;i--)
        {
            plist->pdata[i+1]=plist->pdata[i];
        }
        plist->pdata[offset]=newdata;
        plist->count++;
        return 0;
        }
}

顺序表的删除

  • 头删
  • 尾删
  • 中间删除
    思维图参考于插入,有点懒就不画图了~~
/**************************************
 函数名:delete
 函数功能:删除顺序表指定位置的数据
 函数参数:1.顺序表的地址 2.被删除的元素 3.删除的位置
 函数返回值:成功时,返回0;失败时,返回-1;
 ***************************************/
int delete(LIST *plist,datatype *savedata,int offset)
{
    int i=0;
    if(NULL==plist || NULL==plist->pdata || 0==plist->count || offset>plist->count || offset<0)
    {
        return -1;
    }
    if((plist->count-1)==offset)
    {
        if(NULL!=savedata)
        {
            *savedata=plist->pdata[offset];
        }
        plist->count--;
        return 0;
    }
    else
    {
        if(NULL!=savedata)
        {
            *savedata=plist->pdata[offset];
        }
        for(i=offset;i<plist->count-1;i++)
        {
            plist->pdata[i]=plist->pdata[i+1];
        }
        plist->count--;
        return 0;
    }
}

顺序表的修改

/**********************************************
函数名:alter
函数功能:修改指定位置数据;
函数参数:1.顺序表的地址 2.新的数据 3.修改的位置 4.保存被修改的值
返回值:成功返回0;失败返回-1;
*********************************************/
int alter(LIST *plist,datatype newdata,int offset,datatype *savedata)
{
  if(NULL==plist || NULL==plist->pdata || 0==plist->count || offset>plist->count || offset<0)
    {
        return -1;
    }
    if(NULL!=savedata)
    {
        *savedata=plist->pdata[offset];
    }
    plist->pdata[offset]=newdata;
    return 0;
}

顺序表的查看

/***********************************************
 函数名:show
 函数功能:查看顺序表中的数据
 函数参数:顺序表地址plist
 函数返回值:无
 ***********************************************/
 void show(LIST *plist)
 {
    int i=0;
    if(NULL==plist || NULL==plist->pdata)
    {
        return;
    }
    for(i=0;i<plist->count;i++)
    {
        printf("%d ",plist->pdata[i]);
    }
    printf("\n\r");
 }

顺序表的销毁

/****************************************************
 函数名:destroy
 函数功能:销毁顺序表
 函数参数:顺序表的地址
 函数返回值:无
 **************************************************/
void destroy(LIST *plist)
{
    if(NULL==plist)
    {
        return ;
    }
    free(plist->pdata);
    plist->pdata=NULL;
    free(plist);
    plist=NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值