最最简单的数据结构线性表——顺序表(数据结构C语言实现2)

简介: 最最简单的数据结构线性表——顺序表(数据结构C语言实现2)

本节目标

了解线性表结构

能够自己实现顺序表

顺序表oj题

1.线性表概念

1线性表线性表(linear list)


是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。


数组结构形式

image.png

链表结构形式

image.png

我们今天来实现顺序表结构,即数组结构形式的顺序表。

2.顺序表实现

3.顺序表相关OJ题练习


顺序表实现

概念


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


结构


1 静态顺序表:使用定长数组存储。

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

静态顺序表

顺序表都以数组形式,静态顺序表示定长数组。


//顺序表的静态存储
    #define N 7   //定长为7个元素的顺序表
    typedef int SLDataType;
    typedef struct SeqList 
    {
        SLDataType array[N];  //定长数组
        size_t size;   //有效元素个数
    }SeqList;

image.png

这就是静态顺序表,

很明显当顺序表能存下数据的个数是有限的。所以极其不便。我们静态顺序表就介绍到这。


动态顺序表

//顺序表的动态存储
    typedef int SLDataType;
    typedef struct SeqList 
    {
        SLDataType *array;  //指向动态开辟的数组
        size_t size;   //有效元素个数
        size_t capicity; //容量空间大小 
    }SeqList;

image.png

如何实现动态开辟数呢?


void *malloc( size_t size );

<stdlib.h>


Allocates memory blocks.

这是个动态开辟内存空间的函数。

函数的返回值:void*无类型的指针,需要根据自己开辟数据类型的指针强制转换。

函数的常数:size_t字节大小,根据自己需要开辟空间大小。


接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。


线性表就是存数据的一种数据结构,而增删查改等接口的实现是这种数据结构的学习的基础!


// 顺序表的动态存储
typedef struct SeqList
{
SLDataType* array;  // 指向动态开辟的数组
size_t size ;       // 有效数据个数
size_t capicity ;   // 容量空间的大小
}SeqList;
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl);
// 顺序表销毁
void SeqListDestory(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x); 
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 顺序表初始化
void SeqListInit(SeqList* psl)
{
  psl->array = NULL;
  psl->size = 0;
  psl->capacity = 0;
}
// 顺序表销毁
void SeqListDestory(SeqList* psl)
{
  free(psl->array);   //释放空间,防止内存泄漏
  psl->array = NULL;
}
// 顺序表打印
void SeqListPrint(SeqList* psl)
{    
  int i = 0;
  for(i=0;i<psl->size;i++)
  { 
   printf("%d ",psl->array[i]);
  }
  printf("\n");
}
// 检查空间,如果满了,进行增容
void SeqListCheckCapacity(SeqList* psl)
{
  // 满了就要扩容
  if (psl->size == psl->capacity)
  {
  int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
  SLDataType* tmp = (SLDataType*)realloc(psl->array, newcapacity * sizeof(SLDataType));
  if (tmp == NULL)
  {
    printf("realloc fail\n");
    exit(-1);
  }
  else
  {
    psl->array = tmp;
    psl->capacity = newcapacity;
  }
  }
}
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x)
{
  SeqListCheckCapacity(psl);
  psl->array[psl->size] = x;
  psl->size++;
}

image.png

// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x)
{
  SeqListCheckCapacity(psl);
  int i = 0;
  for (i = psl->size; i >0; i--)
  {
   psl->array[i]=psl->array[i-1];
  }
  psl->array[i] = x;
  psl->size++;
}

image.png

//顺序表尾删
void SeqListPopBack(SeqList* psl)
{
  psl->size--;
}

image.png

// 顺序表头删
void SeqListPopFront(SeqList* psl)
{
  int end = 0;
  while (end<psl->size)
  {
  psl->array[end] = psl->array[end+1];
  end++;
  }
  psl->size--;
}

image.png

// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x)
{
  if (psl == NULL)
  return 0;
  int i = 0;
  for (i = 0; i < psl->size; i++)
  {
  if (psl->array[i] == x)
  {
    printf("找到了、下标为:%d\n", i);
    return i;
     }
  }
  printf("找不到\n");
  return -1;
}

image.png


// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
  SeqListCheckCapacity(psl);
  if (psl->size > pos)
  {
  int i = 0;
  for (i = psl->size; i>pos; i--)
  {
    psl->array[i] = psl->array[i - 1];
  }
  psl->array[i] = x;
  psl->size++;
  }
  else
  {
  printf("该位置不存在\n");
  }
}

image.png

// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos)
{
  if (psl == NULL)
  return 0;
  if (psl->size > pos)
  {
  int i = 0;
  for (i = pos; i < psl->size-1; i++)
  {
    psl->array[i] = psl->array[i + 1];
  }
  psl->size--;
  }
}

image.png

目录
相关文章
|
11月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
435 1
|
8月前
|
定位技术 C语言
c语言及数据结构实现简单贪吃蛇小游戏
c语言及数据结构实现简单贪吃蛇小游戏
|
9月前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
9月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
243 7
|
9月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
369 5
|
9月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
200 5
|
10月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
11月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
282 1
|
19天前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
523 0