数据结构学习笔记——线性表之顺序表(c语言实现)

1.概念

顺序表即线性表的顺序存储结构 ,指的是用一段地址连续的存储单元依次存储线性表数据元素。在线性表中,每个数据元素的类型都相同,一般可以用一维数组来实现顺序存储结构。
在这里插入图片描述

2.实现

完整代码下载地址 https://download.csdn.net/download/luotuoxiansheng/10746233

(1)建立顺序表的结构

利用c语言结构体来建立顺序表的结构,顺序表结构体中包含数据和表长。

  #define MAXSIZE 10      //存储空间初始分配量
    typedef int ElemType;   //定义类型,此处为int(可变)
    typedef int Status;
    typedef struct
    {
        ElemType data[MAXSIZE];//创建数组存储空间
        int length;            //线性表当前长度
    }sqlist;
(2)初始化表单

初始化一个n长度的顺序表并打印,表单数据初始化为1~n,n为函数形参InitLength。

12345n

示例代码:

void sqlistInit(sqlist *sl,int InitLength)
{
    int j;
    sl->length=0;
    printf("当前表单:");
    for(j=0;j<InitLength;j++)
    {
       sl->data[j]=j+1;
       printf("%d ",sl->data[j]);
       ++sl->length;
    }
     printf("\n初始表单长度:%d\n",sl->length);
}

结果演示:
在这里插入图片描述
在这里插入图片描述

(3)增:在表中第i个位置增加数据e

在这里插入图片描述
示例代码:

Status sqlistInsert(sqlist *L,int i,ElemType e)
{
  int k;
  if(L->length==MAXSIZE)//表已满
    {
     printf("表已满!\n");
     return error;
    }
  if(i<1||i>L->length+1)//i不在范围内
    {
     printf("插入位置不在表单范围内!\r\n\n");
     return error;
    }
  if(i<L->length+1)//插入数据不在表尾
  {
      for(k=L->length;k>=i;k--)//插入位置后数据元素依次向后移动一位
        L->data[k]=L->data[k-1];
  }
  L->data[i-1]=e;//插入新元素
  L->length++;
  return ok;
}

结果演示:
在任意位置插入数字:
在这里插入图片描述
也可以在头部和尾部插入:
在这里插入图片描述

(4)删:删除表中第i个位置数据

要删除第i个数据,即将i位置后数据依次左移,表长减一
在这里插入图片描述
示例代码:

Status sqlistDelete(sqlist *L,int i)
{
  int k;
  if(L->length==0)//空表
    {
     printf("无删除对象,这是一个空表!\n");
     return error;
    }
  if(i<1||i>L->length)//i不在范围内
    {
     printf("找不到该删除对象!\r\n\n");
     return error;
    }
  for(k=i;k<L->length;k++)//第i个位置后数据依次左移
    L->data[k-1]=L->data[k];
  L->length--;
  return ok;
}

结果演示:
删除第三个数字
在这里插入图片描述

(5)改:改变表中第i个位置数据

在这里插入图片描述
示例代码:

Status sqlistChange(sqlist *L,int i,ElemType e)
{
  int k;
  if(L->length==0)//空表
    {
     printf("无改变对象,这是一个空表!\n");
     return error;
    }
  if(i<1||i>L->length)//i不在范围内
    {
     printf("找不到该对象!\r\n\n");
     return error;
    }
  L->data[i-1]=e;//改变数值
  return ok;
}

在这里插入图片描述

(6)查:查找表中第i个位置数据,并返回该值

第i个数据即为元素da[i-1],在表单范围内返回该值即可
示例代码:

Status sqlistLocate(sqlist *L,int i)
{
  int k;
  if(L->length==0)//空表
    {
     printf("这是一个空表!\n");
     return error;
    }
  if(i<1||i>L->length)//i不在范围内
    {
     printf("找不到该对象!\r\n\n");
     return error;
    }
  return L->data[i-1];
}

结果演示:
在这里插入图片描述

(7)其他

此外还设计了打印表单,清零表单,重置表单等操作,详见完整代码
https://download.csdn.net/download/luotuoxiansheng/10746233

3.优劣势分析
优点缺点
  • 不需要为表中元素之间的逻辑关系而增加额外的存储空间
  • 可以快速地存取表中任意位置的元素
  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时,难以确定存储空间的容量
  • 造成存储空间的“碎片”及浪费

以上就是对顺序存储结构的线性表的学习及分享。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值