顺序表专题

线性表:零个或多个数据元素的有限序列。

目录

前言

一、顺序表是什么?

1. 线性表

1.1  常见的线性表

1.2 逻辑结构(线性结构)

1.2.1 集合结构

1.2.2 线性结构

1.2.3 树形结构

1.2.4 图形结构

1.3 物理结构(顺序存储结构)

1.3.1 顺序存储结构

1.3.2 链式存储结构

二、实现步骤

1.抽象数据结构(内容)

2.增删改查(功能)

2.1 初始化和销毁

2.1.1 初始化顺序表

2.1.2 销毁顺序表

2.1.3 打印顺序表

2.2 扩容 

2.3 头部插入删除/尾部插入删除

2.3.1 顺序表尾部插入数据

2.3.2 顺序表头部插入数据 

2.3.3 顺序表尾部删除数据

2.3.4 顺序表头部删除数据

2.4 指定位置之前插入/删除数据

2.4.1 指定位置之前插入数据

2.4.2 指定位置之前删除数据

2.5 查找数据 

总结


前言

线性表的顺序储存结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。


一、顺序表是什么?

顺序表是线性表的顺序存储结构。

顺序表的底层是数组

1. 线性表

线性表是n个具有相同特性的数据元素的有限序列。

线性表指的是具有部分相同特性的一类数据结构的集合。

1.1  常见的线性表

顺序表、链表、栈、队列、字符串。

1.2 逻辑结构(线性结构)

1.2.1 集合结构

集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。

1.2.2 线性结构

线性结构中的数据元素之间是一对一的关系

1.2.3 树形结构

树形结构中的数据元素之间存在一种一对多的层次关系。

1.2.4 图形结构

图形结构的数据元素是多对多的关系。

1.3 物理结构(顺序存储结构)

1.3.1 顺序存储结构

是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。

1.3.2 链式存储结构

是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。


二、实现步骤

1.抽象数据结构(内容)

代码如下:

typedef int SLDataType;

// 静态顺序表 
#define N 7
typedef struct SeqList
{
    SLDataType arr[N]; //定长数组
    int size;          //有效数据个数
}SL;
    
// 动态顺序表 -- 按需申请
typedef struct SeqList
{
    SLDataType* a;
    int size;     // 有效数据个数
    int capacity; // 空间容量
}SL;

静态顺序表的缺陷:空间给少了不够用,给多了造成空间浪费。

因此,一般都是使用动态顺序表

2.增删改查(功能)

声明代码放到.h文件中,代码如下:

//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL s);

//扩容
void SLCheckCapacity(SL* ps);

//头部插入删除 / 尾部插入删除
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);

//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);

//查找数据
int SLFind(SL* ps, SLDataType x);

实现代码放到.c文件中,代码如下:

2.1 初始化和销毁
2.1.1 初始化顺序表
//初始化顺序表
void SLInit(SL* ps)
{
  ps->arr=NULL;
  ps->size=0;
  ps->capacity=0;
}
2.1.2 销毁顺序表
//销毁顺序表
void SLDestroy(SL* ps)
{
  if(ps->arr!=NULL)
  {
    free(ps);
  }
  ps->arr=NULL;
  ps->size=0;
  ps->capacity=0;
}
2.1.3 打印顺序表
//打印顺序表
void SLPrint(SL s)
{
  for(int i=0;i<s.size;i++)
  {
    printf("%d",s.arr[i]);
  }
  printf("\n");
}
2.2 扩容 
void SLCheckCapacity(SL*ps)
{
  if(ps->size==ps->capacity)
  {
    int newCapacity=ps->capacity==0?4:ps->capacity*2;
    SLDataType*tmp=(SLDataType*)realloc(SL*ps,newCapacity*sizeof(SLDataType));
    if(tmp==NULL)
    {
      perror("realloc failed!");
      exit(1);
    }
    ps->arr=tmp;
    ps->capacity=newCapacity;
  }
}
2.3 头部插入删除/尾部插入删除
2.3.1 顺序表尾部插入数据
//尾部插入
void SLPushBack(SL*ps,SLDataType x)
{
  assert(ps!=NULL);
  SLCheckCapacity(SL);
  ps->arr[ps->size++];
}

尾部直接插入即可

2.3.2 顺序表头部插入数据 
//头部插入
void SLPushFront(SL*ps,SLDataType x)
{
  assert(ps!=NULL);
  SLCheckCapacity(ps);
  for(int i=size;i>0;i--)
  {
    ps->arr[i]=ps->arr[i-1];
  }
  ps->arr[0]=x;
  ps->size++;
}

1.将顺序表中的所有数据都向后挪动一位

2.头部直接插入

2.3.3 顺序表尾部删除数据
void SLPopBack(SL*ps)
{
  assert(ps!=NULL);
  assert(ps->size!=0);
  ps->size--;
}
2.3.4 顺序表头部删除数据
void SLPopFront(SL*ps)
{
  assert(ps!=NULL);
  assert(ps->size!=0)
  for(i=0;i<ps->size-1;i++)
  {
    ps->arr[i]=ps->arr[i+1];
  }
  ps->size--;
}
2.4 指定位置之前插入/删除数据
2.4.1 指定位置之前插入数据
void SLInsert(SL*ps,int pos,SLDataType x)
{
  assert(ps!=NULL);
  assert(pos>=0&&pos<=ps->size);
  SLCheckCapacity(ps);
  for(int i=ps->size-1;i>pos;i--)
  {
    ps->arr[i]=ps->arr[i-1];
  }
  ps->arr[pos]=x;
  ps->size++;
}
2.4.2 指定位置之前删除数据
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--;
}
2.5 查找数据 
void SLFind(SL*ps,SLDataType x)
{
  assert(ps);
  for(int i=0;i<ps->size;i++)
  {
    if(ps->arr[pos]==x)
    {
      //找到了
      return i;    
    }
  }
  //没有找到
  return -1;
}

总结

        以上就是今天要讲的内容,本文仅仅简单介绍了顺序表的C语言实现,而顺序表提供了实现算法的基础结构。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值