简洁顺序表

article/2025/8/22 3:36:45

目录

前言

一、初始准备

二、尾插尾删

三、头插尾删

四、随机位置插入删除

五、顺序表缺陷

六、全部代码


前言

顺序表和链表都是线性表

顺序表的本质就是数组,能够连续存储数据

一、初始准备

建立结构体

静态版本

由于静态版本容量是固定的,所以只需两个成员即可,即数据成员和记录有效数据的成员

由于静态版本不好控制容量大小,大了容易造成浪费,小了无法使用,所以选择动态版本更合适

动态版本

有3个成员,一个是数据成员类型的指针,指向开辟空间的起始位置,第二个则是记录有效数据的成员,第三个则是目前容量的大小

因为结构体类型名字太长,不方便使用,所以用typedef将其类型名修改

为了方便存储不同类型的数据,则也用typedef将类型名修改,比如存储浮点型数据时,只要将int改为float或double即可

初始化结构体变量

由于要改变实参,所以必须传地址,即

把其数据成员全部置为0或NULL

判断容量

由于起初没有开辟空间,所以不知道是满了,还是根本就没开辟空间,所以用条件操作符来判断

同时还要判断增容是否失败,失败了就提示一下,然后exit(-1)退出程序

由于realloc增容有两种情况,所以采用把起始地址返回给一个临时指针变量,增容成功后再赋值给原来的指针变量即可

销毁顺序表和初始化顺序表差不多,只是多了个free

调试看写的代码是否没有错误太麻烦,所以得打印

二、尾插尾删

每次尾插数据时都要判断容量是否足够

每次尾删时都要查看顺序表中还有没有数据,采用断言的方式,方便找错

三、头插尾删

每次头插也要判断容量是否足够

头插需要往后挪动数据,把第一个元素的空间空出来,再插入像插入的数据

每次头删时都要查看顺序表中还有没有数据,采用断言的方式,方便找错

 

四、随机位置插入删除

要想对随机位置的数据进行插入与删除,那就必须得先找到其下标

查找下标,循环遍历即可,找得到就返回其下标,找不到就返回-1

 每次随机插入都要判断容量是否足够

同时还要判断i是否再数组下标范围内,采用断言,方便找错

 随机删除要判断i是否再数组下标范围内,采用断言,方便找错

五、顺序表缺陷

空间不够了,需要扩容,扩容是有消耗的

避免频繁扩容,一次一般是扩容2倍,可能存在一定空间的的浪费

头插或者中间插入时,需要挪动数据,也是有消耗的

六、全部代码

//头文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//静态版本
//typedef int DataType;
//#define N 1000
//typedef struct SeqList
//{
//	DataType a[N];
//	int sz;
//}SL;//动态版本
typedef int DataType;
typedef struct SeqList
{DataType* a;int sz;//有效数据的个数int capacity;//以开辟空间的大小
}SL;//初始化顺序表
void SeqListInit(SL* ps);
//检查容量
void SeqListCheckCapacity(SL* ps);
//销毁循序表
void SeqListDestroy(SL* ps);
//打印顺序表
void SeqListPrint(SL* ps);
//尾插
void SeqListPushBack(SL* ps, DataType x);
//尾删
void SeqListPopBack(SL* ps);
//头插
void SeqListPushFront(SL* ps, DataType x);
//头删
void SeqListPopFront(SL* ps);
//查找
int SeqListFind(SL* ps, DataType pos);
//随机位置插入
void SeqListInsert(SL* ps, DataType x);
//随机位置删除
void SeqListDelete(SL* ps);//定义文件
#include"SeqList.h"void SeqListInit(SL* ps)
{ps->a = NULL;ps->sz = 0;ps->capacity = 0;
}void SeqListCheckCapacity(SL* ps)
{if (ps->sz == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;DataType* tmp = (DataType*)realloc(ps->a, sizeof(DataType) * newcapacity);if (tmp == NULL){printf("增容失败\n");exit(-1);}ps->capacity = newcapacity;ps->a = tmp;}
}void SeqListDestroy(SL* ps)
{free(ps->a);ps->a = NULL;ps->sz = 0;ps->capacity = 0;
}void SeqListPrint(SL* ps)
{int i = 0;for (i = 0; i < ps->sz; i++){printf("%d ", ps->a[i]);}printf("\n");
}void SeqListPushBack(SL* ps, DataType x)
{SeqListCheckCapacity(ps);ps->a[ps->sz] = x;ps->sz++;
}void SeqListPopBack(SL* ps)
{assert(ps->sz > 0);ps->sz--;
}void SeqListPushFront(SL* ps,DataType x)
{SeqListCheckCapacity(ps);int end1 = ps->sz;while (end1){int end2 = end1 - 1;ps->a[end1--] = ps->a[end2];}ps->a[end1] = x;ps->sz++;
}void SeqListPopFront(SL* ps)
{assert(ps->sz > 0);int begin1 = 0;while (begin1 < ps->sz){int begin2 = begin1 + 1;ps->a[begin1++] = ps->a[begin2];}ps->sz--;
}int SeqListFind(SL* ps, DataType pos)
{int cur = 0;while (cur < ps->sz){if (ps->a[cur] == pos){return cur;}else{cur++;}}return -1;
}void SeqListInsert(SL* ps, DataType x)
{SeqListCheckCapacity(ps);int i = SeqListFind(ps, 5);assert(i >= 0 && i <= ps->sz);int end1 = ps->sz;while (end1 > i){int end2 = end1 - 1;ps->a[end1--] = ps->a[end2];}ps->a[end1] = x;ps->sz++;
}void SeqListDelete(SL* ps)
{int i = SeqListFind(ps, 5);assert(i >= 0 && i <= ps->sz);while (i < ps->sz){int cur = i + 1;ps->a[i++] = ps->a[cur];}ps->sz--;
}//测试文件
#include"SeqList.h"
void test1()
{SL s;SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPushBack(&s, 6);SeqListPushBack(&s, 7);SeqListPrint(&s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPrint(&s);SeqListDestroy(&s);
}
void test2()
{SL s;SeqListInit(&s);SeqListPushFront(&s, 1);SeqListPushFront(&s, 2);SeqListPushFront(&s, 3);SeqListPushFront(&s, 4);SeqListPushFront(&s, 5);SeqListPushFront(&s, 6);SeqListPushFront(&s, 7);SeqListPrint(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPrint(&s);/*int ret = SeqListFind(&s, 3);printf("查找的数的下标为:%d\n", ret);*/SeqListDestroy(&s);
}
void test3()
{SL s;SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPushBack(&s, 6);SeqListPushBack(&s, 7);SeqListInsert(&s, 15);SeqListPrint(&s);SeqListDelete(&s);SeqListPrint(&s);
}
int main()
{//test1();//test2();test3();return 0;
}


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

相关文章

~~顺序表~~

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、尾删 越界&…

php的strstr是什么意思,php strstr函数怎么用

strstr()函数是PHP中的一个内置函数&#xff0c;语法为strstr(string,search,before_search) &#xff0c;用于搜索字符串在另一字符串中是否存在&#xff0c;如果是&#xff0c;返回该字符串及剩余部分&#xff0c;否则返回 FALSE。此函数区分大小写。 php strstr()函数怎么用…

【数据结构】--- kmp算法和strstr函数

kmp算法和strstr函数 引言一、概念分析分析原理分析 KMP算法原理基本操作图解KMP原理 三、复杂度分析四、KMP算法代码 引言 现实生活中&#xff0c;字符串匹配在很多的应用场景里都有着极其重要的作用&#xff0c;包括生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网…

实现strstr函数

strstr函数的作用是寻找子字符串在目标字符串中第一次出现的位置。 #include <stdio.h> #include<stdlib.h> #include<assert.h> const char * Strstr(const char * str1, const char * str2) {assert(str1 ! NULL);assert(str2 ! NULL);char* cur str1;ch…

字符串函数剖析(3)---strstr函数

1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数&#xff1a;在一个字符串中查找子串 学习新函数时&#xff0c;先去c库查找该函数的相关资料&#xff0c;更加助于你的学习 const char * strstr ( const char * str1, const char * str2 );先看函数…

C语言strstr()函数用法-字符串查找

1.函数定义 strstr()函数是一个参数为两个字符指针类型&#xff0c;返回值是char*类型的函数。 用于找到子串&#xff08;str2&#xff09;在一个字符串&#xff08;str1&#xff09;中第一次出现的位置&#xff08;不包括str2的串结束符&#xff09;&#xff0c;并返回该位置…

ConcurrentHashMap 实现原理

一. ConcurrentHashMap 是什么 在并发编程中&#xff0c;ConcurrentHashMap 是一个经常被使用的数据结构&#xff0c;相比于 Hashtable 以及Collections.synchronizedMap() 来说&#xff0c;ConcurrentHashMap 在线程安全的基础上提供了更好的写并发能力&#xff0c;同时还降低…