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

顺序表:数据结构的“上古神兽”

目录

前言

1、顺序表的概念及结构:

1.1 线性表:

2、顺序表分类:

3、动态顺序表的实现:

初始化:

销毁:

增添:

删除:

打印:

 

总结

 

前言

在计算机科学中,数据结构是组织和存储数据的方式,而顺序表(Sequential List)是最基础且广泛使用的数据结构之一。它以其简单、高效的特点,在众多编程场景中发挥着重要作用。


1、顺序表的概念及结构:

顺序表底层是数组,是线性表的一种,它的物理结构和逻辑结构都是连续的

 

1.1 线性表:

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


2、顺序表分类:

  • 静态顺序表

静态顺序表就相当于一个数组,静态的不能改变它的大小

typedef int SLDataType;
typedef struct SEquence
{
	SLDataType a[7];
	int size;//记录当前有效个数
}Sq;

 静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费

  • 动态顺序表

动态顺序表就相当一个可以变化大小的数组,可以改变它的容量大小

typedef struct SEquence
{
	int* a;
	int size;//记录当前有效个数
	int capacity;//空间大小
}Sq;

3、动态顺序表的实现:

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
typedef struct SEquence
{
	int* a;
	int size;//记录当前有效个数
	int capacity;//空间大小
}Sq;
void Seqinit(Sq* p);
void SeqDestory(Sq* p);
void SeqpushFront(Sq* p,int x);
void SeqpushBack(Sq* p,int x);
void SeqdeleFront(Sq* p);
void SeqdeleBack(Sq* p);
void Seqprint(Sq* p);

初始化:

void Seqinit(Sq* p)
{
	assert(p);
	p->a = (int*)malloc(sizeof(int) * 4);
	if (p->a == NULL)
	{
		perror("malloc fail");
		exit(1);
	}
	p->capacity = 4;
	p->size = 0;
}

销毁:

void SeqDestory(Sq* p)
{
	assert(p);
	free(p->a);
	p->capacity = p->size = 0;
}

增添:

  • 前插

前插入操作是在顺序表的指定位置插入一个新元素。为了保持存储的连续性,需要将插入位置之后的所有元素向后移动一个位置。插入操作的时间复杂度为 O(n)。以下是插入操作的代码实现:

void SeqpushFront(Sq* p, int x)
{
	assert(p);
	if (p->capacity == p->size)
	{
		int* tmp = (int*)realloc(p->a,sizeof(int) * 2 * p->capacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		p->a = tmp;
		p->capacity *= 2;
	}
	for (int i = p->size - 1; i >= 0; i--)
	{
		p->a[i + 1] = p->a[i];
	}
	p->a[0] = x;
	p->size++;
}
  • 后插
void SeqpushBack(Sq* p, int x)
{
	assert(p);
	if (p->capacity == p->size)
	{
		int* tmp = (int*)realloc(p->a,sizeof(int) * 2 * p->capacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		p->a = tmp;
		p->capacity *= 2;
	}
	p->a[p->size++] = x;
}

删除:

  • 后删
void SeqdeleBack(Sq* p)
{
	assert(p);
	p->size--;
}
  • 前删

前删除操作是从顺序表中删除指定位置的元素。为了保持存储的连续性,需要将删除位置之后的所有元素向前移动一个位置。删除操作的时间复杂度为 O(n)。以下是删除操作的代码实现:

void SeqdeleFront(Sq* p)
{
	assert(p);
	for (int i = 0; i < p->size - 1; i++)
	{
		p->a[i] = p->a[i + 1];
	}
	p->size--;
}

打印:

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

 

 


总结

顺序表的特点

  • 优点1. 随机访问高效:由于顺序表的存储是连续的,可以通过索引直接访问任意位置的元素,时间复杂度为 O(1)。这种特性使得顺序表在需要频繁访问元素的场景中表现出色。
  • 2. 存储密度高:顺序表的存储结构简单,除了存储数据元素外,不需要额外的存储空间来维护元素之间的关系,因此存储密度较高。

 

  • 缺点1. 插入和删除效率低:插入和删除操作通常需要移动多个元素以保持存储的连续性,时间复杂度为 O(n),其中 n 是表的长度。这使得顺序表在需要频繁进行插入和删除操作的场景中表现不佳。
  • 2. 存储容量固定:顺序表的存储容量在定义时就已经确定,如果存储空间不足,需要进行扩容操作,这可能会导致较大的开销。

 

相关文章:

  • 程序化广告行业(30/89):利用“4W1H”模型优化广告投放策略
  • windows 10 系统配置Node
  • Unity 项目工程结构目录
  • 【设计原则】迪米特法则(LoD):降低耦合的设计智慧
  • AI视频生成产品体验分享(第2趴):Vidu、Hailuo、Runway、Pika谁更胜一筹?
  • 游戏成瘾与学习动力激发策略研究——了解存在主义心理学(通俗版)
  • Django系列教程(13)——Cookie和Session应用场景及案例
  • Java基础编程练习第34题-正则表达式
  • 关于Number(null) === 0差点引发的事故
  • 【机器学习】特征工程
  • 【Linux】chmod`和`chown`
  • 机器学习概要
  • MySQL 入门大全:查询语言分类
  • 使用Python进行数据分析时,CSV文件导入的两种方法
  • 2025/03/19 Cursor使用方法(Java方向,适合Java后端把家从idea搬家到cursor)
  • 使用Streamlit快速构建数据应用程序
  • 当发现提示少文件,少目录时时,external.css的内容
  • 《算法笔记》9.3小节——数据结构专题(2)->树的遍历 问题 A: 树查找
  • Tomcat - Session 会话保持
  • 《Waf 火绒终端防护绕过实战:系统程序副本+Certutil木马下载技术详解》
  • 上海通报5起违反中央八项规定精神问题
  • 加拿大温哥华发生驾车冲撞人群事件,加拿大总理发声
  • 持续更新丨伊朗内政部长:港口爆炸已致8人死亡750人受伤
  • 一周观展|五一假期将到,特展大展陆续开幕
  • 特朗普将举行集会庆祝重返白宫执政百日,被指时机不当
  • 演员孙俪:中年人没有脆弱的时间,学习胡曼黎不内耗