当前位置: 首页 > news >正文

【数据结构】·顺序表函数实现·赶紧学起来呀

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

🌟前言

本期博客主要是讲解动态的顺序表也就是链表,它比静态表更加具有实用性等等优势,。
好了,接下来让我们一起学习吧 💪

文章目录

  • 🌟前言
  • 一、什么是线性表
  • 二、什么是顺序表
  • 三、使用动态内存函数实现动态顺序表
    • 1.接口实现
      • 1.1 ==定义动态顺序表==
      • 1.2==顺序表的初始化==
      • 1.3==扩容==
      • 1.4==顺序表销毁==
      • 1.5==顺序表尾插==
      • 1.6==顺序表尾删==
      • 1.7==顺序表的头插==
      • 1.8==顺序表的头删==
      • 1.9==顺序表在pos位置插入x==
      • 1.10==在pos指定下标删除元素==
  • 🚩数组越界问题:

一、什么是线性表

🔸 线性表是最基本、最简单、也是最常用的一种数据结构。
🔸 线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
🔸线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,yey

🍉线性表(linear list)是n个具有相同特性的数据元素的有限序列。
常见的线性表有:顺序表、链表、栈、队列、字符串…
需要注意:线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组链式结构的形式存储。

二、什么是顺序表

顺序表的概念:
顺序表用一段物理地址连续的存储单元依次存储数据元素的线性结构。
❗️顺序表又分静态顺序表动态顺序表
接下来的讲解主要是动态顺序表。

三、使用动态内存函数实现动态顺序表

1.接口实现

1.1 定义动态顺序表

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

说明:

◾️ typedef int SLDataType的作用是定义一种类型,后期使用时方便改变存储类型。
◾️为了让定义的结构体使用时更方便,我使用 typedef 将其定义为 SL

1.2顺序表的初始化

//顺序表的初始化
void SeqListInit(SL* ps)
{ps->array = (SLDataType*)malloc(sizeof(SLDataType)*4);if (ps->array = NULL){perror("malloc failed");exit(-1);}ps->size = 0;ps->capacity = 0;
}

我这里刚开始给顺序表初始化了四个大小。

1.3扩容

// 检查空间,如果满了,进行增容
int CheckCapacity(SL* ps)
{if (ps->size == ps->capacity){SLDataType* tmp = NULL;tmp = (SLDataType*)realloc(ps->array, sizeof(ps->array) + sizeof(SLDataType) * INT_SIZE);if (tmp == NULL){perror("扩容失败!");return 0;}else{ps->array = tmp;ps->capacity += INT_SIZE;printf("扩容成功");return 1;}	}return 1;
}

🚦当空间不够时,进行扩容操作,一次在原有基础上增加两个大小。这里由于很多的地方都需要使用扩容操作,所以,我专门将扩容提取出来做成一个函数供其他函数调用

1.4顺序表销毁

// 顺序表销毁
void SeqListDestory(SL* ps)
{free(ps->array);ps->array = NULL;ps->capacity = 0;ps->size = 0;
}

1.5顺序表尾插

// 顺序表尾插
void SeqListPushBack(SL* ps, SLDataType x)
{if (CheckCapacity(ps) == 0){printf("空间已满,插入失败!");}if (CheckCapacity(ps) == 1){ps->array[ps->size] = x;ps->size += 1;}
}

1.6顺序表尾删

// 顺序表尾删
void SeqListPopBack(SL* ps)
{if (ps->size < 1){printf("已经为空,无元素可删除");return;}ps->array[ps->size - 1] = 0;ps->size--;
}

1.7顺序表的头插

思路:
在这里插入图片描述

顺序表要求数据是连续存储的,且必须是从头开始存储。所以,对于顺序表而言如果要实现头插,就需要把数据往后挪动。不能从前往后挪,如果从前往后挪就挪就会把后面的数据覆盖掉。

// 顺序表头插
void SeqListPushFront(SL* ps, SLDataType x)
{//判断空间是否够。//先挪动if (CheckCapacity(ps) == 0){printf("空间已满,头插入失败!");}if (CheckCapacity(ps) == 1){int end = ps->size - 1;while (end>=0){ps->array[end + 1] = ps->array[end];--end;}ps->array[0] = x;ps->size++;}
}

1.8顺序表的头删

思路:
在这里插入图片描述

// 顺序表头删
void SeqListPopFront(SL* ps)
{int n = 1;while (n < ps->size){ps->array[n - 1] = ps->array[n];n++;}ps->size--;
}

1.9顺序表在pos位置插入x

在这里插入图片描述
pos一般都是指下标

// 顺序表在pos位置插入x
void SeqListInsert(SL* ps, size_t pos, SLDataType x)
{assert(pos>=0&&pos<ps->size);if (CheckCapacity(ps) == 0){printf("空间已满,插入失败!\n"); }if (CheckCapacity(ps) == 1){int end = ps->size - 1 ;while (end >= pos){ps->array[end + 1] = ps->array[end];end--;}ps->array[pos] = x;ps->size++;}
}

1.10在pos指定下标删除元素

思路分析:
在这里插入图片描述

// 顺序表删除pos位置的值
void SeqListErase(SL* ps, size_t pos)
{assert(pos >= 0 && pos < ps->size);int n = pos + 1;while (n <= ps->size - 1){ps->array[n - 1] = ps->array[n];n++;}ps->size--;
}

🚩数组越界问题:

假设有一块数组空间,我们的编辑器会在最容易出现越界的位置,比如数组前一段和后一段,放入一些值,程序结束后,他会检查这些值是否发生变化,如果变化了,就说明越界啦。

📋各位友友们,咱下回再见!

别忘了点赞👍 关注 💓加评论 ✏️哟

💙 💜 ❤️ 💚 💔 💓 💗 💕 💞 💘 💖 ✨ ⭐️ 🌟

http://www.lryc.cn/news/99014.html

相关文章:

  • C++,类和对象-多态,制作饮品
  • 网站分析:学习如何分析目标网站的页面结构和URL规律,确定爬取目标和策略。
  • 《向量数据库指南》:向量数据库Pinecone如何集成数据湖
  • Vue3中使用pinia
  • Mysql中(@i:=@i+1)的介绍
  • Nexperia和KYOCERA AVX Components Salzburg 就车规氮化镓功率模块达成合作
  • 数据库应用:Redis安装部署
  • 7.Docker-compose
  • 多线程:管程法
  • 7.1 String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
  • 【C++STL标准库】容器适配器
  • 2023深圳杯(东三省)数学建模ABC题思路及代码
  • Set集合类详解(附加思维导图)
  • 【vue3】vue3接收props以及emit的用法
  • 【Lua学习笔记】Lua入门
  • LLM Data Pipelines: 解析大语言模型训练数据集处理的复杂流程
  • 如何使用postman判断返回结果是否正确
  • A General framework for Prompt
  • 使用python将PDF转word
  • CMU 15-445 -- Logging Schemes - 17
  • 逻辑回归分析实战(根据鸢尾花的性质预测鸢尾花类别)
  • 【每日一题】2050. 并行课程 III
  • 【kubernetes系列】kubernetes之使用kubeadm搭建高可用集群
  • SpringBoot 快速实现 IP 地址解析
  • 【云原生】Docker镜像的创建,Dockerfile
  • 了解Unity编辑器之组件篇Event(七)
  • bash: 睡觉的冒号;是不是两个点?
  • 揭秘爱数AnyShare认知助手:大模型深度产品化,深化人与机器的“分工协作”
  • ad+硬件每日学习十个知识点(10)23.7.21
  • RCU 使用及机制源码的一些分析