数据结构—顺序表

简介: 数据结构—顺序表

1.顺序表概念

      顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改


2.顺序表分类:

  2.1 静态顺序表:使用定长数组存储元素。(不实用)

  2.2动态顺序表:使用动态开辟的数组存储。


3.实现动态顺序表

     3.1 初始化顺序表  SLInit

void SLInit(SL* ps)
{
  assert(ps != NULL);
  ps->a = NULL;
  ps->size = ps->capacity = 0;
}


  3.2 检查顺序表容量   SLCheckCapacity

void SLCheckCapacity(SL* ps)
{
  assert(ps != NULL);
  // 检查容量空间,满了扩容
  if (ps->size == ps->capacity)
  {
    int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity * sizeof(SLDataType));
    if (tmp == NULL)
    {
      printf("realloc fail\n");
      //exit(-1);
      return;
    }
    ps->a = tmp;
    ps->capacity = newCapacity;
  }
}


   3.3 打印顺序表  SLPrint

void SLPrint(SL* ps)
{
  assert(ps != NULL);
  //assert(ps);
  for (int i = 0; i < ps->size; ++i)
  {
    printf("%d ", ps->a[i]);
  }
  printf("\n");
}


  3.4 尾插 SLPushBack

void SLPushBack(SL* ps, SLDataType x)
{
  assert(ps != NULL);
  SLCheckCapacity(ps);
  ps->a[ps->size] = x;
  ps->size++;
  //SLInsert(ps, ps->size, x);
}

   3.5 头插 SLPushFront

void SLPushFront(SL* ps, SLDataType x)
{
  assert(ps != NULL);
  SLCheckCapacity(ps);
  // 挪动数据
  int end = ps->size - 1;
  while (end >= 0)
  {
    ps->a[end + 1] = ps->a[end];
    --end;
  }
  ps->a[0] = x;
  ps->size++;
  //SLInsert(ps, 0, x);
}

  3.7 头删  SLPopFront

void SLPopFront(SL* ps)
{
  assert(ps != NULL);
  assert(ps->size > 0);
  int begin = 1;
  while (begin < ps->size)
  {
    ps->a[begin - 1] = ps->a[begin];
    ++begin;
  }
  ps->size--;
  //SLErase(ps, 0);
}

 3.8 顺序表查找 SLFind

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

3.9  顺序表修改 SLModify

void SLModify(SL* ps, int pos, SLDataType x)
{
  assert(ps);
  assert(pos >= 0 && pos < ps->size);
  ps->a[pos] = x;
}

 4. 顺序表总结

      4.1 顺序表优化

      使用SLInsert函数实现 尾插,头插

      使用SLErase函数实现 尾删,头删


void SLInsert(SL* ps, int pos, SLDataType x)
{
  assert(ps);
  assert(pos >= 0 && pos <= ps->size);
  SLCheckCapacity(ps);
  // 挪动数据
  int end = ps->size - 1;
  while (end >= pos)
  {
    ps->a[end + 1] = ps->a[end];
    --end;
  }
  ps->a[pos] = x;
  ps->size++;
}
void SLErase(SL* ps, int pos)
{
  assert(ps);
  assert(pos >= 0 && pos < ps->size);
    //两种方法实现
  //int begin = pos;
  //while (begin < ps->size-1)
  //{
  //  ps->a[begin] = ps->a[begin + 1];
  //  ++begin;
  //}
  int begin = pos + 1;
  while (begin < ps->size)
  {
    ps->a[begin - 1] = ps->a[begin];
    ++begin;
  }
  ps->size--;
}

4.2 顺序表的缺点

  由于头插和头删需要移动数据,所以时间复杂度为O(N),所以后面引入链表实现。

相关文章
|
2月前
|
存储 编译器 C语言
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
61 2
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
1月前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
75 3
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
40 6
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
27 3
|
2月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
34 2
|
2月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
25 1
|
2月前
|
存储 算法 索引
【数据结构】——顺序表
【数据结构】——顺序表
|
2月前
|
存储
数据结构1——顺序表
数据结构1——顺序表
20 1