数据结构—顺序表

article/2025/8/22 3:35:31

目录

顺序表介绍

创建顺序表类型

初始化顺序表

销毁顺序表

打印顺序表

增加数据

头插

尾插

删除数据

头删

尾删

查找数据

修改指定下标的数据

整体代码


顺序表介绍

什么是顺序表?

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

顺序表分为两种:一种是静态顺序表,另一种是动态开辟的顺序表

说简单一点,其实顺序表就是类比数组!

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

创建顺序表类型

typedef int SLDataType;typedef struct SeqList
{SLDataType* a;int size;int capacity;}SL;

声明一个指针a用于动态开辟空间,用size记录当前顺序表中的数据个数,用capacity记录顺序表的容量大小

初始化顺序表

void SeqListInit(SL*ps)//初始化
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}

初始化就是全部变量置0处理

销毁顺序表

void SeqListDestory(SL* ps)//销毁
{assert(ps);free(ps->a);ps = NULL;ps->capacity = ps->size = 0;
}

因为是在内存的堆上进行动态内存开辟的,所以要及时释放空间,避免内存泄漏

打印顺序表

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

遍历进行打印即可

增加数据

void SeqListCheckCapacity(SL* ps)//检查容量
{    assert(ps);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);}ps->a = tmp;ps->capacity = newcapacity;}
}
void  SeqListInsert(SL* ps,int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SeqListCheckCapacity(ps);int i = 0;for (i=ps->size-1;i>=pos;i--){ps->a[i+1] = ps->a[i];//pos后的数据依次往后面挪动}ps->a[pos] = x;ps->size++;
}

增加数据前,我们都要先检查一下空间容量是否已经满了,满了则需要扩容,容量变为原来的2倍,然后就可以在想要的位置pos插入数据了

头插

void SeqListPushFront(SL* ps, SLDataType x)//在pos=0的位置插入数据
{   assert(ps);SeqListInsert(ps, 0, x);
}

尾插

void SeqListPushBack(SL* ps, SLDataType x)//在size位置插入数据
{   assert(ps);SeqListInsert(ps, ps->size, x);
}

在这里我们都可以调用我们的任意下标pos位置插入的函数,即头插就是在0位置处插入数据,尾插就是在size-1位置处插入数据 

删除数据

void SeqListErase(SL* ps, int pos)
{assert(ps);assert(pos>=0&&pos<=ps->size);int i = 0;for (i=pos;i<ps->size-1;i++){ps->a[i-1] = ps->a[i];}ps->size--;
}

从pos下标位置开始,其后的数据从前往后依次向前覆盖,相当于将哪个数据删除了

头删

void SeqListPopFront(SL* ps)//删除下标为0的位置的数据
{    assert(ps);SeqListErase(ps, 0);
}

尾删

void SeqListPopBack(SL* ps)//删除下标为ps->size - 1的位置的数据
{    assert(ps);SeqListErase(ps, ps->size - 1);
}

头删和尾删原理和头插和尾插类似,我们只需要调用在任意位置pos插入的函数,即头删就是在0的位置删除数据,尾删就是在size-1的位置删除数据

查找数据

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

修改指定下标的数据

void SeqListModify(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);//检查输入下标的合法性ps->a[pos] = x;//修改数据
}

整体代码

//SList.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int SLDataType;
typedef struct SeqList
{SLDataType* a;int size;int capacity;}SL;void SeqListInit(SL* ps);//初始化void SeqListDestory(SL* ps);//销毁void SeqListCheckCapacity(SL* ps);//检查容量void SeqListPopFront(SL* ps);//头删void SeqListPopBack(SL* ps);//尾删void SeqListErase(SL* ps, int pos);//直接删void  SeqListInsert(SL* ps, int pos, SLDataType x);//直接插void SeqListPushFront(SL* ps, SLDataType x);//头插void SeqListPushBack(SL* ps, SLDataType x);//尾插void SeqListPrint(SL* ps);//打印void SeqListModify(SL* ps, int pos, SLDataType x);//修改指定下标位置元素int SeqListFind(SL* ps, SLDataType x);//查找数据//SList.cvoid SeqListInit(SL*ps)//初始化
{ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
void SeqListDestory(SL* ps)//销毁
{free(ps->a);ps = NULL;ps->capacity = ps->size = 0;
}
void SeqListCheckCapacity(SL* ps)//检查容量
{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);}ps->a = tmp;ps->capacity = newcapacity;}
}//头删
void SeqListPopFront(SL* ps)//删除下标为0的位置的数据
{SeqListErase(ps, 0);
}
//尾删
void SeqListPopBack(SL* ps)//删除下标为ps->size - 1的位置的数据
{SeqListErase(ps, ps->size - 1);
}//直接删
void SeqListErase(SL* ps, int pos)
{assert(ps);assert(pos>=0&&pos<=ps->size);int i = 0;for (i=pos;i<ps->size-1;i++)//从pos下标位置开始,其后的数据从前往后依次向前覆盖{ps->a[i-1] = ps->a[i];}ps->size--;
}
//查找数据
int SeqListFind(SL* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}//修改指定下标位置元素
void SeqListModify(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);//检查输入下标的合法性ps->a[pos] = x;//修改数据
}//直接插
void  SeqListInsert(SL* ps,int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SeqListCheckCapacity(ps);int i = 0;for (i=ps->size-1;i>=pos;i--){ps->a[i+1] = ps->a[i];//pos后的数据依次往后面挪动}ps->a[pos] = x;ps->size++;
}//头插
void SeqListPushFront(SL* ps, SLDataType x)//在pos=0的位置插入数据
{SeqListInsert(ps, 0, x);
}//尾插
void SeqListPushBack(SL* ps, SLDataType x)//在size位置插入数据
{SeqListInsert(ps, ps->size, x);
}//打印
void SeqListPrint(SL* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d-> ",ps->a[i]);}printf("\n");
}//test.cvoid test()
{SL a;SeqListInit(&a);SeqListInsert(&a,0,1);SeqListInsert(&a, 1, 2);SeqListErase(&a,1);SeqListPrint(&a);
}
int main()
{test();return 0;
}

记得在每个函数传入指针时加入assert(ps);断言报错一下,以防传入空指针!

谢谢各位的观看!


http://chatgpt.dhexx.cn/article/pDF9BXgK.shtml

相关文章

Java实现顺序表

目录 一、顺序表的简单理解 1、为什么我们要以数组为基础来构建顺序表呢&#xff1f; 2、顺序表都具有哪些功能 二、顺序表的代码实现 1、构建并且初始化顺序表 2、在顺序表中添加元素 1、判断需要添加元素的下标是否在顺序表的范围内 2、如果添加元素下标合法&#xff…

创建一个顺序表

#include <stdio.h> #include <stdlib.h> #define Size 5 //对Size进行宏定义&#xff0c;表示顺序表申请空间的大小 typedef struct Table{ //定义个顺序表结构体 int * head;//声明了一个名为head的长度不确定的数组&#xff0c;也叫“动态数组”int length;//…

顺序表的插入和删除

前言 相信通过上一篇文章&#xff08;顺序表的定义&#xff09;大家已经能动手定义一个顺序表&#xff0c;并且知道顺序表如何进行初始化的工作。当完成一个顺序表的建立和初始化后&#xff0c;我们得到的会是一个空的顺序表&#xff08;空表&#xff09;&#xff0c;所以这篇…

数组和顺序表的区别

前言 看到很多人直接将顺序表等同于数组&#xff0c;认为顺序表就是数组&#xff0c;但这样做容易造成概念混淆。 下面就对这两个概念进行解释&#xff0c;帮助大家进行区分。 什么是顺序表 在解释什么是顺序表之前&#xff0c;我们还需要了解一点基础知识。 数据结构 数据…

数据结构之顺序表:顺序表的结构及基本操作

目录 一、数据结构1.1 算法与数据结构的区别 二、顺序表2.1 顺序表的基本形式【重点】2.2 顺序表的两种基本实现方式【重点】1、一体式结构&#xff1a;2、分离式结构: 2.3 元素存储区替换与扩充1. 元素存储区的替换2. 元素存储区的扩充 2.4 顺序表的操作1. 增加元素2. 删除元素…

简洁顺序表

目录 前言 一、初始准备 二、尾插尾删 三、头插尾删 四、随机位置插入删除 五、顺序表缺陷 六、全部代码 前言 顺序表和链表都是线性表 顺序表的本质就是数组&#xff0c;能够连续存储数据 一、初始准备 建立结构体 静态版本 由于静态版本容量是固定的&#xff0c…

~~顺序表~~

1.线性结构的特点是&#xff1a; 在数据元素的非空有限集中&#xff1a; (1).存在唯一的一个被称为“第一个”的数据元素 (2).存在唯一的一个被称为“最后一个”的数据元素 (3).除第一个之外&#xff0c;集合中的每个数据元素都只有一个前驱 (4).除第一个之外&#xff0c;…

顺序表的定义

1.顺序表的定义 顺序表——用顺序存储的方式实现线性表顺序存储 eg: A1-A2-A3-A4-A5 如果第一个位置是location(L)&#xff0c;那么第二个就是location(L)数据元素大小 [sizeof(ElemType)可以查看数据元素大小] 2.顺序表的实现——静态分配 #define MaxSize 10 //定义最大长…

C语言实现顺序表

c语言实现顺序表 线性表是最简单的数据结构&#xff0c;而顺序表又是最简单的线性表&#xff0c;其基本思想是用一段地址连续的储存单元依次存储线性表的数据元素&#xff0c;比如我们常用的一维数组&#xff0c;下面代码实现了顺序表的定义以及基本操作。 编译环境&#xff…

顺序表的实现

目录 1.顺序表的概念 2.静态顺序表 分析&#xff1a; 3.动态顺序表 分析&#xff1a; 4.顺序表初始化 5.顺序表尾部操作 5.1尾插 空间检查函数实现 分析&#xff1a; 5.2尾删 分析&#xff1a; 6.顺序表的头部操作 6.1头插 分析&#xff1a; 6.2头删 分析&…

【C语言】顺序表的创建

一、代码实现部分&#xff1a; 1、顺序表是线性表的基础部分&#xff0c;至于顺序表&#xff0c;在本人看来无异于数组。至于线性表的概念&#xff0c;在此不再赘述。接下来尝试利用C语言对线性表中的顺序表进行代码实现&#xff08;此程序中规定用户输入的数据类型为int类型&a…

顺序表和链表

1.今天给大家介绍线性表中两个常见的结构顺序表和链表&#xff0c;其中链表又包括单链表和带头双向循环链表。 2.此部分的全部代码放在个人gitee中 &#xff0c;需要的自行拿取&#xff0c;前后文件依次对应SeqList SList DList。gitee链接点这里 一、线性表 1.线性表 线性表&…

顺序表的增删查改

数据结构 是数据存储的方式&#xff0c;对于不同的数据我们要采用不同的数据结构。就像交通运输&#xff0c;选用什么交通工具取决于你要运输的是人还是货物&#xff0c;以及它们的数量。 顺序存储结构 包括顺序表、链表、栈和队列等。 例如腾讯QQ中的好友列表&#xff0c;…

顺序表初始化

文章目录 1. 顺序表2. 顺序表的初始化 1. 顺序表 顺序表(顺序存储结构) 存储数据时&#xff0c;会提前申请一整块足够大小的物理空间&#xff0c;然后将数据依次存储到一整块连续的存储空间内&#xff0c;存储时做到数据元素之间不留一丝缝隙。 使用顺序表存储集合 {1,2,3,4,…

顺序表的创建

三个朋友今天全部上岸大厂&#xff0c;祝贺。&#xff08;太羡慕了&#xff09; 静态分配创建一个顺序表&#xff1b; 1.顺序表的定义&#xff1a; #define MaxSize 10 typedef struct {ElemType data[MaxSize];int length; }SqlList;这里我们用结构体的方式定义以一个顺序表…

顺序表的详解

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串.... 即顺序表为线性表的一种&#xff0c; 顺序表是一种物理地址连续的存储单元依次存储数据元素的线性结构&#…

什么是顺序表

顺序表 在程序中&#xff0c;经常需要将一组&#xff08;通常是同为某个类型的&#xff09;数据元素作为整体管理和使用&#xff0c;需要创建这种元素组&#xff0c;用变量记录它们&#xff0c;传进传出函数等。一组数据中包含的元素个数可能发生变化&#xff08;可以增加或删…

数据结构——顺序表

目录 一. 什么是顺序表&#xff1f; 1&#xff0c;静态顺序表 2&#xff0c;动态顺序表 ①动态顺序表的实现及其初始化 ②空间的创建 ③顺序表的打印和销毁 ④顺序表的尾部插入和删除 ⑤顺序表的头部插入和删除 ⑥顺序表pos位置的插入和删除 ⑦顺序表指定元素的删除 二&am…

【数据结构】——顺序表介绍(独家介绍,小白必看!!)

重点和易错点都用彩笔标记出来了&#xff0c;放心食用&#xff01;&#xff01; 数据结构分为线性表和非线性表&#xff0c;今天我们要学习的顺序表就是线性表中的一个小类。那么&#xff0c;何为线性表&#xff0c;线性表是指n个具有相同性质的数据元素的有限序列&#xff0c…

顺序表详解

目录 一、线性表的概念 二、顺序表 1、顺序表的概念 1&#xff09;. 静态顺序表&#xff1a;使用定长数组存储元素。 2&#xff09;. 动态顺序表&#xff1a;使用动态开辟的数组存储。 三、接口实现 1、创建 2、初始化 3、扩容 4、尾插 5、打印 6、销毁 7、尾删 越界&…