你真的了解线性表中的顺序表了吗?(静态与动态顺序)

时间:2024-02-11 23:39:06 标签:  顺序  

 今天开启我们数据结构中的第二篇文章了,过了几天我们今天就来了解了解我们常说的顺序表。

在这之前我们也先了解一下线性表。

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

那么我们今天就来学习一下顺序表!!!

目录

顺序表的概念

静态顺序表功能的简单实现

动态顺序表的功能简单实现



顺序表的概念

顺序表是一种常见的数据结构,它是将数据元素按照一定的顺序依次存储在连续的存储空间中。
 
顺序表的基本思想是使用一块连续的内存空间来存储数据元素,每个元素按照特定的顺序依次排列。通常,元素在顺序表中的位置可以通过索引来访问,索引从 0 开始递增。
 
顺序表的优点包括:
 
1. 实现简单:顺序表的实现相对简单,易于理解和操作。
2. 随机访问:可以通过索引快速地访问任意位置的元素,具有较高的访问效率。
3. 内存效率:由于元素连续存储,所以可以有效地利用内存空间。

 
然而,顺序表也有一些限制和缺点:
 
1. 插入和删除操作:在顺序表中进行插入和删除操作可能需要移动其他元素,导致较高的时间复杂度。
2. 固定大小:顺序表的大小通常是固定的,在需要扩展时可能需要重新分配内存并复制元素。
3. 内存需求:顺序表需要连续的内存空间,如果数据量较大,可能会受到内存限制。
 

为了克服顺序表的一些限制,可以使用链式结构(如链表)或其他更复杂的数据结构来实现。具体选择取决于具体的应用场景和对数据操作的需求。
 
顺序表在许多编程语言中都有直接的实现,例如数组。它们在需要快速随机访问和顺序处理数据的情况下非常有用,例如在排序、查找、遍历等操作中。


静态顺序表功能的简单实现

根据上方的描述其实在像C语言中的数组也是一个顺序表。 那么下面我们就用数组和代码实现一个顺序表的增,删,查,改函数接口。

 

顺序表的静态储存

struct SEQlist
{int arr[MAXSIZE];int size;};

这里因为数据不同,我们需要创建一个结构体,我们现在使用整形数组来举例。这里的size是指顺序表里有的有效数据,MAXSIZE为宏定义的最大元素数。 

注:这里把结构体命名为SL ,详情如头尾文件定义如下:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 10typedef struct SEQlist SL;
void Init(SL* s);
void Print(SL* s);
void pushFront(SL* s, int x);

 静态顺序表的格式化接口函数

void Init(SL* s)
{memset(s->arr, 0, sizeof(int) * MAXSIZE);s->size = 0;}

 

这里格式化我们就把数组中的数据都格式化为0,size也格式化为0,格式化我们可以用循环来进行赋值,但是这里我们就用了一个函数进行赋值。函数为memset.

关于memset的介绍各位可以看一下这里:

这里显示了他的头文件和用法,已经被我给圈起来了。 

void * memset ( void * ptr, int value, size_t num );其中num是内容字节大小。

静态顺序表的头插接口函数

 

void pushFront(SL* s, int x)
{int end = s->size - 1;for (int i = end; i >= 0; --i){s->arr[i + 1] = s->arr[i];}s->arr[0] = x;s->size++;}

头插功能即在顺序表开头插上数据。


静态顺序表打印接口

 

void Print(SL* s)
{for (int i = 0; i < s->size; i++){printf("%d ", s->arr[i]);}

 就将数据打印完出来。

 

总结:静态顺序表的缺点还是很明显的,不能够灵活运用数据的大小是固定的,即MAXSIZE,给少了不够用,给多了就用不完。那么接下来我们就弄一个静态的顺序表。


动态顺序表的功能简单实现

这里我们在创建一个结构体,不同的是,因为我们要实现一个动态的顺序表,所以我们不再创建数组,而设置一个指针来实现动态。

struct SQ
{int* a;int size;int capacity};

后面我把此结构SEQ。


动态顺序表的格式化插口

void Init(SEQ* s)
{s->a = NULL;s->size = 0;     // 表示数组中存储了多少个数据s->capacity = 0;  数组实际能存数据的空间容量是多大 }

这里我们将a 指向一个空指针。


动态顺序表的检查与扩容插口函数

void CheckCapacity(SEQ* s)
{// 如果没有空间或者空间不足,那么我们就扩容if (s->size == s->capacity){int newcapacity = s->capacity == 0 ? 4 : s->capacity * 2;int* tmp = (int*)realloc(s->a, newcapacity*sizeof(int));if (tmp == NULL){printf("realloc 失败\n");exit(-1);}s->a = tmp;s->capacity = newcapacity;}
}

 这里我们首先检查有没有空间和空间是否足够,如不够则进行扩容,这里扩容我们用到realloc 函数,函数具体使用方法和头文件详情请看下图。

 动态顺序表的尾插和尾删插口函数

void SeqListPushBack(SEQ* s, int x)
{CheckCapacity(s);s->a[s->size] = x;s->size++;
}void SeqListPopBack(SEQ* s)
{// 暴力处理方式assert(s->size > 0);s->size--;
}

 这里就是简单的增加删减,需要注意在尾插时先进行检查容量是否充足。即先调用CheckCapacity函数。

删的时候只要将数据size减1,在打印数据时也只打印前size位数据,所以减减后也可以当作删除了尾部数据。


 动态顺序表的头插和头删函数

 

void SeqListPushFront(SEQ* s, int x)
{CheckCapacity(ps);// 挪动数据int end = s->size - 1;while (end >= 0){s->a[end + 1] = s->a[end];--end;}s->a[0] = x;s->size++;
}void SeqListPopFront(SEQ* s)
{assert(s->size > 0);// 挪动数据int begin = 1;while (begin < s->size){s->a[begin - 1] = s->a[begin];++ begin;}s->size--;
}

也是像上面一样简单增删就不过多解释了 。


动态顺序表的销毁插口

所为销毁也就是令指针销毁,然后让数据和容量位0.

void SeqListDestory(SEQ* s)
{free(s->a);s->a = NULL;s->capacity = s->size = 0;
}

下面给大家看一下插口函数效果。


头插几个数据 

int main()
{Init(&s);SeqListPushFront(&s, 1);SeqListPushFront(&s, 2);SeqListPushFront(&s, 3);SeqListPushFront(&s, 4);SeqListPushFront(&s, 11);Print(&s);return 0;
}

 


再头删几个数据

int main()
{Init(&s);SeqListPushFront(&s, 1);SeqListPushFront(&s, 2);SeqListPushFront(&s, 3);SeqListPushFront(&s, 4);SeqListPushFront(&s, 11);Print(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPopFront(&s);Print(&s);return 0;
}


下面就是尾插和尾删了

我们尾插55,95,22,然后又尾删掉三个数据

int main()
{Init(&s);SeqListPushFront(&s, 1);SeqListPushFront(&s, 2);SeqListPushFront(&s, 3);SeqListPushFront(&s, 4);SeqListPushFront(&s, 11);Print(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPopFront(&s);Print(&s);SeqListPushBack(&s,55);SeqListPushBack(&s,95);SeqListPushBack(&s,22);Print(&s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPopBack(&s);Print(&s);return 0;
}

 

 


好了今天到这就结束了。

来源:分享自作者个人站点/博客

智能推荐

 今天开启我们数据结构中的第二篇文章了&#xff0c;过了几天我们今天就来了解了解我们常说的顺序表。 在这之前我们也先了解一下线性表。 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构&#xff0c;

标签:顺序  

目录 1.什么是顺序表 2.动态顺序表实现

标签:顺序  

首先我们要知道什么是顺序表: 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝,顺序表分为静态顺序表(使⽤定⻓数组存储元素)和动态顺序表(按需申请) 静态顺序表缺点: 空间给少了不够⽤,给多了造成空间浪费 拿出来我之前以及写好了的顺序表的代码:

标签:顺序  

目录 一、设计框架 1、功能要求​

标签:静态  

文章目录 1. 线性表2. 顺序表3. 模拟实现顺序表 1. 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元

标签:顺序  

       本篇博客详细总结数据结构中的第一种结构:线性表之不定长顺序表&#xff0c;主要从以下几个方面梳理&#xff1a;线性表的定义、顺序表的概念、顺序表的基本操作&#xff1a;增删改查的基本思想及代码实现、基本操作的算法效率分析(时间复杂度和空间复杂度)、顺序表的优缺点适用场合&#xff0c;以及常见的面试题。 一、线性表的定义        线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈

标签:顺序  

与前面用动态顺序表相比&#xff0c;区别在使用的是静态数组&#xff1a;  实现过程大差不差&#xff0c;具体代码如下&#xff1a; //Sta_Contact.h#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <asser

标签:静态  

 本文中&#xff0c;我们将使用顺序表的结构来完成通讯录的实现。 我们都知道&#xff0c;顺序表实际上就是一个数组。而使用顺序表来实现通讯录&#xff0c;其内核是将顺序表中存放的数据类型改为结构体&#xff0c;将联系人的信息存放到结构体中&#xff0c;通过对顺序表的操作来访问通讯录。 所以我们可以将通讯录理解为套壳的顺序表。 一、功能 &#xff08;1&#xf

标签:顺序  

&#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在c

标签:数据结构  

1 #include<iostream> 2 #include<string> 3 using n

标签:数据结构  顺序  线性表  

1. 轮转数组 代码实现&#xff1a; // 逆置数组void nizhi_

标签:习题  

&#x1f435;本篇文章将对ArrayList类进行讲解 一、ArrayList类介绍 上篇文章我们对顺序表的增删查改等方法进行了模拟实现&#xff0c;实际上Java提供了ArrayList类&#xff0c;而在这个类中就包含了顺序表的一系列方法&#xff0c;这样在用顺序表解决问题时就不用每次都去实现它

标签:顺序  

        本篇将讲解一些关于顺序表的内容&#xff0c;顺序表分为静态顺序表和动态顺序表&#xff0c;其中经常用到的为动态顺序表&#xff0c;所以本篇将以动态顺序表为重点给出一些关于动态顺序表的操作。         因为顺序表的实现逻辑较为简单&#xff0c;对于代码的讲解大多以注释给出。 1.顺序表相关操作         以下包括顺序表的抽象类型定义、两种顺序表的定义方式、以及一些相关操作&#xff1a; #include <stdio.h>#include

标签:顺序  

目录 前言&#xff1a; 顺序表&#xff08;ArrayList&#xff09;&#xff1a;

标签:顺序  

小伙伴们好&#xff0c;学完C语言&#xff0c;就要开始学数据结构了&#xff0c;数据结构也是非常重要的&#xff0c;今天我们主要来学习在数据结构中最常用的增删改查操作。话不多说&#xff0c;一起来学习吧 1.数据结构相关概念 1.什么是数据结构&#xff1f; 数据结构是由“数据”和“结构

标签:顺序  

顺序存储的定义:定义:由零个或多个数据元素组成的有限序列。首先他是一个序列,也就是说元素之间是有先来后到若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继另外,线性表强调是有限的。数学语言的定义:  若将线性表记为(a1,...,ai-1,ai,ai+1,...an),则表中ai-1领先于ai,ai领先于

标签:数据结构  算法  顺序  结构  线性表  

欢迎来到博主的新专栏——C语言数据结构 博主ID&#xff1a;代码小豪 文章目录 顺序表线性表是什么顺序表的线性逻辑结构静态顺序表

标签:数据结构  

2021 年全网小程序数量就已超 700 万,从微信开始,到其他各大平台,如抖音、支付宝,小程序发展迅猛,2023年小程序仍有着巨大的发展潜力。现在。人们逐渐发现,日常的生活、出行、购物各个方面都越来越离不开小程序。以微信为代表,小程序生态的价值凸显。今天就来跟大家分享什么是小程序生态,以及从哪里入手打造自己的小程序生态。一、为什么要做小程序生态为什么企业都在关注小程序生态的建设,主要在于以下几点:

标签:带你  生态  程序  

简介&#xff1a;本系列博客为C项目系列内容&#xff0c;通过代码来具体实现某个经典简单项目 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;

标签:顺序  

本文章主要对顺序表的介绍以及数据结构的定义,以及几道相关例题,帮助大家更好理解顺序表. 文章目录 前言 一、顺序表的静态实现

标签:顺序  

        数据结构是计算机存储&#xff0c;组织数据的方式。数据结构和算法是不分家的&#xff0c;属于是算法的基础。数据结构会用到结构体&#xff0c;指针&#xff0c;结构体指针&#xff0c;动态内存管理的相关知识&#xff0c;这些知识一定要掌握扎实。接下来的一段时间让我们一起来学习数据结构方面的知识吧&#xff01; 1. 顺序表的概念和结构 1.1 线性表         线性表是n个具有相同特性的数据元素的1有限序列。线性表是一种在实际应用中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串······         线性表在逻辑上是线性结构&#x

标签:数据结构  

思维导图 练习 头文件 1 #ifndef __HEAD_H__2 #define __HEAD_H__3 4 5 #include <stdio.h>6 #include <string.h>7 #include <stdlib.h>8 9 10 #define MAXSIZE

标签:数据结构  

1、顺序表的概念及结构 1.1 线性表 线性表&#xff08; linear list &#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串...

标签:数据结构  

文章目录 一、线性表1、线性表1.1、线性表的定义1.2、线性表的操作 2、顺序表2.1、

标签:数据结构  

猜你喜欢

ArrayList 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用

标签:数据结构  

实现顺序表的增删改查,先对函数进行定义&#xff0c;再在主函数中使用 头文件&#xff1a; #pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>#define INIT_CAPACITY 4typedef int SLDataType;// 动态顺序表 -- 按需申请typedef struct SeqList{SLDataType* a;int size; // 有效数据个数int capacity; // 空间容量}SL;//初始化和销毁void SLInit(SL*

标签:顺序  

                                                   创作不易&#xff0c;友友们给个三连呗&#xff01;        本文为博主在DS学习阶段的第一篇博客&#xff0c;所以会介绍一下数据结构&#xff0c;并在最后学习对顺序表的实现&#xff0c;在友友们学习数据结构之前&#xff

标签:顺序  

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;

标签:顺序  

1.逻辑结构 顺序表和链表都属于线性表&#xff0c;都是线性结构 2.存储结构 顺序表&#xff1a;顺序存储 优点&#xff1a;支持随机存取&#xff0c;存储密度高 缺点&#x

标签:数据结构  

一&#xff0c;移除元素 思路&#xff1a;定义一个循环遍历数组&#xff0c;如果遇到的不是val就记录下来这个元素&#xff0c;如果不是就跳过

标签:算法  

今天我们来谈一谈TDD 和 BDD 两项实践。我们先来说说 TDD,也就是测试驱动开发(Test Drvien Development)。TDD 的节奏或许你已经迫不及待地要举手了:“TDD 我知道,就是先写测试,后写代码。”但真的是这样吗?严格地说,“先写测试、后写代码”的做法叫测试先行开发(Test First D

标签:你真  TDD  BDD  

遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存储的。其他的数据结构(树、图)、算法等基本都是建立在这样一个物理结构之上的,也可以说,物理结构就是数据结构的根本。在这里,我们先介绍两个物理结构,也是我们将来学习数据结构的基石,它们就是顺序表和链表。顺序表不扯复杂的定义,不扯什么数学表达式,我们最直观的理解,顺序表就是数组。是不是非常简单,没错,在 PHP 或者 C 的世界中,我们就把顺序表定义为数组,而相同的名词还包括:顺序存储、顺序结构等。只要看到这种名词,马上想到数组就可以了。当然

标签:不清楚  数据结构  别再  顺序  链表  

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨.

标签:数据结构  

模拟ArrayLIst的底层实现package com.tedu.api04.list;import java.util.Objects;/** * @author LIGENSEN * Date: 2023/7/20 11:35 */public class ArrayListDemo { public static void main(String[] args) { ArrList<String> list=new ArrList<>(1); list.add(a);

标签:底层  顺序  ArrayList  

目录 顺序表 1.简单了解顺序表 2.顺序表的分类

标签:数据结构  

顺序表和链表 一.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性

标签:数据结构  

1.什么叫函数重载&#xff1f; 函数重载&#xff08;Function Overloading&#xff09;是指在同一个作用域内&#xff0c;允许定义多个具有相同名称但参数列表不同的函数。具体而言&#xff0c;函数重载允许你定义同名的函数&#xff0c;但这些函数应该有不同的参数类型、参数个数或者参数顺序。 举例

标签:你真  

1. 前言 在我们的日常开发中&#xff0c;Git扮演着重要的角色&#xff0c;负责管理代码的版本。分支管理在开发过程中具有显著的影响。通常情况下&#xff0c;我们有生产、预发、测试和开发这几种分支。根据项目的不同阶段&#xff0c;我们会将代码提交到相应

标签:你真  

几道相关例题,帮助大家更好理解顺序表. 文章目录 前言 一、顺序表

标签:顺序  

目录 1. 引子&#xff1a;线性表2. 简单数据结构&#xff1a;顺序表2.1 顺序表简介与功能模块分析2.2 顺序表的实现2.2.1 顺

标签:数据结构  

本文由&#64;睡觉待开机原创&#xff0c;转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01;

标签:数据结构  

好&#xff0c;现在我们来做通讯录 上代码 文件1&#xff1a;SeqList.h #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <string.h>typedef struct SLcdatatype{char name[10];int age;char sex[10];char tele[15];}SLc;//typedef int SLdatatype;//顺序

标签:顺序  

朋友们大家好啊&#xff0c;本节内容我们进入数据结构的第二节&#xff0c;顺序表有关内容&#xff0c;同步我们会学习计组原理与cpp相关知识&#xff0c;求三连啊&#xff01;

标签:数据结构  

                                                 &#x1f3ac;慕斯主页&#xff1a;

标签:静态  

什么是 CSS?CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CSS 文件中多个样式定义可层叠为一个样式解决了一个很大的问题HTML 标签原

标签:你真  CSS  

别丢了你的勇敢 前言&#xff1a; 自今日起&#xff0c;我们正式越过C语言的大山&#xff0c;走向了数据结构的深山&#xff0c;现如今摆在我们面前的第一个坎就是顺序表&#xff0c;

标签:数据结构  

&#xff08;图片由AI生成&#xff09;  0.前言 在程序设计的世界里&#xff0c;数据结构是非常重要的基础概念。本文将专注于C语言中的一种基本数据结构——顺序表。我们将从数据结构的基本概念讲起&#xff0c;逐步深入到顺序表的内部结构、分类&#xff0c;最后通过一个实战项目来具体展示顺序表的应用。 1.什么是数据结构 数据结构是计算机科学中的一个

标签:数据结构  

目录2.4 线性表的顺序表示和实现2.4.1 线性表的顺序存储表示2.4.2 顺序表中基本操作的实现顺序表基本操作详细代码2.4 线性表的顺序表示和实现2.4.1 线性表的顺序存储表示//定义顺序表typedef struct { Elempty *elem;//存储空间的基地址 int length;//当前长度}*SqList,LNode;//顺序表的结构

标签:数据结构  语言版  学习笔记  顺序  操作  

什么是装饰器,它们如何被使用,以及我们如何利用它们来构建代码。我们将看到装饰器是如何成为一个强大的工具,可以用来为我们的应用程序添加功能,并且可以在Python编程语言中找到。装饰器顺序在Python中,装饰器是一个特殊的函数,可以修改另一个函数的行为。装饰器是一种设计模式,它在不改变现有对象结构的情况下为其增加新的功能,通常在定义一个函数或一个类之前调用。Python 中的装饰器是修改函数和类的一个强大工具。装饰器是一个函数,它接受另一个函数作为参数,并返回一个包裹原函数的新函数。它也可以用来修改一个函数的行为而不改变函数本身的代码。这对于向现有的函数添加功能或改变一个函数在特定环境下的行为很有

标签:顺序  python  

相关问题

相关文章

热门文章

推荐文章

相关标签