【数据结构】线性表 顺序表(动态、静态分配,插入删除查找基本操作)解析+完整代码

news2024/9/29 21:27:46

1.线性表的基本概念

  • 定义

    线性表(Linear List)是具有相同数据类型的n个数据元素的有限序列

    • n为表长,n=0时线性表是个空表
  • 前驱、后继

    • 前驱:其中一个数据元素的前一个元素。第一个元素没有前驱。
    • 后继:其中一个数据元素的后一个元素。最后一个元素没有后继。
  • 存储/物理结构

    • 顺序表(顺序存储)
    • 链表(链式存储)

2.顺序表

2.1 顺序表的定义

  • 顺序表定义

    用顺序存储方式实现线性表的储存。

    是用一组地址连续的存储单元依次存储线性表中的数据元素。

    • 特点:

      1.表中元素的逻辑顺序与物理顺序相同。

      2.可以随机存取——知道顺序表起始位置LOC(A)和每个元素所占内存的大小sizeof(ElemType)后,可知道任意一个元素的位置。

  • 优点

    1.可随机访问,O(1)时间内找到指定元素;

    2.存储密度高,每个结点只存储数据元素。

  • 缺点

    1.元素的插入和删除要移动大量数据元素。

    2.需要连续存储空间,不够灵活。

2.1.1 静态分配
//静态分配结构存储
#define MaxSize 10 //最大长度
typedef struct{
    int data[MaxSize]; //静态数组存放数据元素
    int length; //顺序表当前长度
}SqList; //顺序表类型定义

//静态分配初始化
void InitList(SqList &L){
    L.Length=0;
}
  • 如果数组存满怎么办?

    没办法了,因为顺序表表长刚开始确定后就无法改变,∴有了动态分配

2.1.2 动态分配
//动态分配结构存储
#define InitSize 100 //表长度的初始定义
typedef struct{
    ElemType *data; //指示动态分配数组的指针
    int MaxSize; //最大容量
    int length; //当前个数
}SeqList;

//动态分配初始化
void InitList(SeqList &L){
    L.data=(ElemType*)malloc(MaxSize*sizeof(ElemType));
    L.length=0;
    L.MaxSize=InitSize;
}

C动态分配语句

L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
free(L.data);

C++动态分配语句

L.data=new ElemType[InitSize];
delete[]指针变量名;
或
delete 指针变量名;
  • 增加动态数组长度

    void IncreaseSize(SeqList &L,int len){
        int *p=L.data; //将表中数据存储到p中
        L.data=(int*)malloc((L.MaxSize+len)*sizeof(int)); //开辟新空间
        for(int i=0;i<L.length;i++)
        {
            L.data[i]=p[i]; //数据复制到新区域
        }
        L.MaxSize=L.MaxSize+len;
        free(p);
    }
    
  • 注:动态分配不是链式存储,同样顺序存储,只是空间大小可变。

2.2 顺序表的插入

  • 原理

    在线性表L的第i个位置插入元素e:

    将第i个元素及其后面的所有元素向后移一位,腾出空位插e。

    >

//在L的位序i处插入元素e
bool ListInsert(SqList &L,int i,int e){
    //判i范围是否有效
    if(i<1||i>L.length+1)return false;
    //判存储空间是否已满
    if(L.length>=MaxSize)return false;
    
    //将第i个元素及之后元素后移
    for(int j=L.length;j>=i;j--) 
    {
        L.data[j]=L.data[j-1]; //注意:位序和数组下标的关系,并从后面元素依次移动
    }
    L.data[i-1]=e;
    L.length++;
    return true;
}
  • 时间复杂度

    • 最好情况:在表尾插入,元素后移不用执行,O(1)。
    • 最坏情况:在表头插入,元素后移执行n次,O(n)。
    • 平均情况:O(n/2),即O(n)。

2.3 顺序表的删除

  • 原理

    删除顺序表L中的第i个元素:

    将被删元素赋给引用变量e,将第i+1个元素及其后的所有元素往前移一位。

//删除L中的第i个元素,并用返回
bool ListDelete(SqList &L,int i,ElemType &e){
    if(i<1||i>L.length)return false;
    
    e=L.data[i-1]; //被删元素给引用变量
    //被删元素后的元素依次后移
    for(int j=i;j<L.length;j++){
        L.data[j-1]=L.data[j];
    }
    L.length--;
    return true;
}
  • 时间复杂度

    • 最坏情况:删除表尾元素,无需移动元素,O(1)。
    • 最好情况:删除表头元素,需移动除表尾外的所有元素,O(n)。
    • 平均情况:O(n/2),即O(n)。

2.4 顺序表的查找

2.4.1 按位查找
ElemType GetElem(SqList L,int i){
    return L.data[i-1];
}
  • 时间复杂度:O(1)
2.4.2 按序查找
int LocateElem(SqList L,ElemType e){
    int i;
    for(i=0;i<L.length;i++)
    {
        if(L.data[i]==e)return i+1; //找到了返回位序
    }
    return 0; //没找到返回0
}
  • 时间复杂度:O(n)

*完整代码 顺序表静态存储

//顺序表 静态分配 线性表下标从0开始
#include<stdio.h>

#define ElemType int

//静态结构体
#define MaxSize 99
typedef struct {
	ElemType data[MaxSize];
	int length;
}SqList;

//初始化
void InitList(SqList &L)
{
	L.length = 0;
}

//求表长
int Length(SqList &L) 
{
	return L.length;
}

//按值查找
int LocateElem(SqList &L,ElemType e) 
{
	for (int i = 0; i < L.length; i++) 
	{
		if (L.data[i] == e) 
		{
			return i + 1;
		}
	}
	return 0;
}

//按位查找
int GetItem(SqList& L, int i) 
{
	return L.data[i-1]; //i是位序,而顺序表从0开始存的,所以i要-1
}

//插入操作
bool ListInsert(SqList& L, int i, ElemType e) 
{
	if (i<1 || i>L.length)return false;
	if (L.length >= MaxSize)return false;

	for (int j = L.length; j >= i; j--) 
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i-1] = e; 
	L.length++;
	return true;
}

//删除操作
bool ListDelete(SqList& L, int i, ElemType& e) 
{
	if (i<1 || i>L.length)return false;

	e = L.data[i-1];
	for (int j = i; j <L.length; j++) 
	{
		L.data[j-1] = L.data[j];
	}
	L.length--;
	return true;
}

//判空操作
bool Empty(SqList& L)
{
	if (L.length == 0)
		return true;
	else
		return false;
}

//销毁操作
void DestroyList(SqList &L)
{
	L.length = 0;
}

//输出
void PrintList(SqList& L) 
{
	for (int i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	printf("\n");
}

int main()
{
	SqList L;
	InitList(L);
	//赋值
	for (int i = 0; i < 10; i++)
	{
		L.data[i] = i;
		L.length++;
	}
	PrintList(L);

	printf("插入:\n");
	int e = -1, pos = 4;
	ListInsert(L, pos , e);
	PrintList(L);

	printf("删除:\n");
	int a;
	ListDelete(L, pos, a);
	PrintList(L);
	printf("%d\n", a);

	printf("按值查找:\n");
	pos = LocateElem(L, 5);
	printf("%d\n", pos);

	printf("按位查找:\n");
	printf("%d", GetItem(L, 3));
}

请添加图片描述

*完整代码 顺序表动态存储

//顺序表 动态分配 
#include<stdio.h>
#include <stdlib.h>

#define ElemType int

//静态结构体
#define InitSize 2
typedef struct {
	ElemType *data;
	int length;
	int MaxSize;
}SeqList;

//初始化
void InitList(SeqList& L)
{
	L.data = (ElemType*)malloc(InitSize * sizeof(ElemType));
	L.length = 0;
	L.MaxSize = InitSize;
}

//增加动态数组长度
void IncreaseSize(SeqList& L, int len) {
	int* p = L.data; //将表中数据存储到p中
	L.data = (int*)malloc((L.MaxSize + len) * sizeof(int)); //开辟新空间
	for (int i = 0; i < L.length; i++)
	{
		L.data[i] = p[i]; //数据复制到新区域
	}
	L.MaxSize = L.MaxSize + len;
	free(p);
}

//求表长
int Length(SeqList& L)
{
	return L.length;
}

//按值查找
int LocateElem(SeqList& L, ElemType e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (L.data[i] == e)
		{
			return i + 1;
		}
	}
	return 0;
}

//按位查找
int GetItem(SeqList& L, int i)
{
	return L.data[i - 1]; //i是位序,而顺序表从0开始存的,所以i要-1
}

//插入操作
bool ListInsert(SeqList& L, int i, ElemType e)
{
	if (i<1 || i>L.length)return false;
	if (L.length >= L.MaxSize)return false;

	for (int j = L.length; j >= i; j--)
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e; 
	L.length++;
	return true;
}

//删除操作
bool ListDelete(SeqList& L, int i, ElemType& e)
{
	if (i<1|| i>L.length)return false;

	e = L.data[i - 1];
	for (int j = i; j < L.length; j++)
	{
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}

//判空操作
bool Empty(SeqList& L)
{
	if (L.length == 0)
		return true;
	else
		return false;
}

//销毁操作
void DestroyList(SeqList& L)
{
	free(L.data);
	L.data = NULL; // 避免悬挂指针
	L.length = 0;
}

//输出
void PrintList(SeqList& L)
{
	for (int i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	printf("\n");
}

int main()
{
	SeqList L;
	InitList(L);
	IncreaseSize(L, 9);

	//赋值
	for (int i = 0; i < 10; i++)
	{
		L.data[i] = i;
		L.length++;
	}
	PrintList(L);

	printf("插入:\n");
	int e = -1, pos = 5;
	ListInsert(L, pos, e);
	PrintList(L);

	printf("删除:\n");
	int a;
	ListDelete(L, pos, a);
	PrintList(L);
	printf("%d\n", a);

	printf("按值查找:\n");
	pos = LocateElem(L, 5);
	printf("%d\n", pos);

	printf("按位查找:\n");
	printf("%d", GetItem(L, 3));

	DestroyList(L);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

索引使用规则1——最左前缀法则

这篇文章主要介绍索引的使用规则——最左前缀法则&#xff0c;关于索引的效率&#xff0c;可以查看上一篇文章索引的有效性 最左前缀法则&#xff1a;索引使用了复合索引&#xff0c;也就是联合索引&#xff0c;使用一个索引名称索引了好几个字段。在这类索引中需要遵守最左前…

Unity零基础到进阶 | Unity中的 RectTransformUtility 方法整理汇总

Unity零基础到进阶 ☀️| RectTransformUtility 方法整理汇总一、RectTransformUtility 官方文档1.1 RectTransformUtility.CalculateRelativeRectTransformBounds&#xff08;重&#xff09;1.2 RectTransformUtility.FlipLayoutAxes1.3 RectTransformUtility.FlipLayoutOnAxi…

pytorch -- CIFAR10 完整的模型训练套路

网络结构 代码 # CIFAR 10完整的模型训练套路&#xff1a; import torch.optim import torchvision from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom model import *# 1. 准备数据集 train_data torch…

用 React 实现搜索 GitHub 用户功能

用 React 实现搜索 GitHub 用户功能 在本篇博客中&#xff0c;我们将介绍如何在 React 应用中搜索 GitHub 用户并显示他们的信息。 创建 React 应用 首先&#xff0c;我们使用 Create React App 创建一个新的 React 应用。Create React App 是一个快速搭建 React 项目的工具…

【QT+QGIS跨平台编译】之五十四:【QGIS_CORE跨平台编译】—【qgssqlstatementlexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…

Vue笔记(一)

常用指令 1.v-show与v-if底层原理的区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个V…

【教3妹学编程-算法题】匹配模式数组的子数组数目 I

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到上海女老师出轨男学生的瓜啊。 2哥 : 看到 了&#xff0c;真的是太毁三观了&#xff01; 3妹&#xff1a;是啊&#xff0c; 老师本是教书育人的职业&#xff0c;明确规定不能和学生谈恋爱啊&#xff0c;更何况是出轨。 2哥 : 是啊…

好用的IP反查接口

IP-API.com - Geolocation API - Documentation - JSON 自定义返回参数调用&#xff08;1&#xff09;&#xff1a; http://ip-api.com/json/24.48.0.1?fieldsstatus,message,country,countryCode,region,regionName,cityhttp://ip-api.com/json/24.48.0.1?fieldscountry,co…

读人工不智能:计算机如何误解世界笔记04_数据新闻学

1. 计算化和数据化的变革 1.1. 每一个领域都在进行计算化和数据化的变革 1.1.1. 出现了计算社会科学、计算生物学、计算化学或其他数字人文学科 1.1.2. 生活已走向计算化&#xff0c;人们却一点也没有变 1.2. 在如今的计算化和数据化世界中&#xff0c;调查性新闻的实践必须…

vue - - - - Vue3+i18n多语言动态国际化设置

Vue3i18n多语言动态国际化设置 前言一、 i18n 介绍二、插件安装三、i18n配置3.1 创建i18n对应文件夹/文件3.2 en-US.js3.3 zh-CN.js3.4 index.js 四、 mian.js 引入 i18n配置文件五、 组件内使用六、使用效果 前言 继续【如何给自己的网站添加中英文切换】一文之后&#xff0c…

【MySQL】SQL 优化

MySQL - SQL 优化 1. 在 MySQL 中&#xff0c;如何定位慢查询&#xff1f; 1.1 发现慢查询 现象&#xff1a;页面加载过慢、接口压力测试响应时间过长&#xff08;超过 1s&#xff09; 可能出现慢查询的场景&#xff1a; 聚合查询多表查询表数据过大查询深度分页查询 1.2 通…

【Flink精讲】Flink反压调优

Flink 网络流控及反压的介绍&#xff1a; Apache Flink学习网 反压的理解 简单来说&#xff0c; Flink 拓扑中每个节点&#xff08;Task&#xff09;间的数据都以阻塞队列的方式传输&#xff0c;下游来不及消费导致队列被占满后&#xff0c;上游的生产也会被阻塞&#xff0c;…

Jessibuca 插件播放直播流视频

jessibuca官网&#xff1a;http://jessibuca.monibuca.com/player.html git地址&#xff1a;https://gitee.com/huangz2350_admin/jessibuca#https://gitee.com/link?targethttp%3A%2F%2Fjessibuca.monibuca.com%2F 项目需要的文件 1.播放组件 <template ><div i…

Qt项目:网络1

文章目录 项目&#xff1a;网路项目1&#xff1a;主机信息查询1.1 QHostInfo类和QNetworkInterface类1.2 主机信息查询项目实现 项目2&#xff1a;基于HTTP的网络应用程序2.1 项目中用到的函数详解2.2 主要源码 项目&#xff1a;网路 项目1&#xff1a;主机信息查询 使用QHostI…

浅析ARMv8体系结构:原子操作

文章目录 概述LL/SC机制独占内存访问指令多字节独占内存访问指令 独占监视器经典自旋锁实现 LSE机制原子内存操作指令CAS指令交换指令 相关参考 概述 在编程中&#xff0c;当多个处理器或线程访问共享数据&#xff0c;并且至少有一个正在写入时&#xff0c;操作必须是原子的&a…

JAVA集合进阶(Set、Map集合)

一、Set系列集合 1.1 认识Set集合的特点 Set集合是属于Collection体系下的另一个分支&#xff0c;它的特点如下图所示 下面我们用代码简单演示一下&#xff0c;每一种Set集合的特点。 //Set<Integer> set new HashSet<>(); //无序、无索引、不重复 //Set<…

【kubernetes】关于k8s集群中kubectl的陈述式资源管理

目录 一、k8s集群资源管理方式分类&#xff1a; &#xff08;1&#xff09;陈述式资源管理方式&#xff1a;增删查比较方便&#xff0c;但是改非常不方便 &#xff08;2&#xff09;声明式资源管理方式&#xff1a;yaml文件管理 二、陈述式资源管理方法&#xff1a; 三、ku…

计算机设计大赛 深度学习大数据物流平台 python

文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 &#x1f5…

Nodejs 第四十二章(jwt)

什么是jwt? JWT&#xff08;JSON Web Token&#xff09;是一种开放的标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用间传递信息的一种方式。它是一种基于JSON的安全令牌&#xff0c;用于在客户端和服务器之间传输信息。 https://jwt.io/ JWT由三部分组成&…

FL Studio All Plugins Edition2024中文完整版Win/Mac

FL Studio All Plugins Edition&#xff0c;常被誉为数字音频工作站&#xff08;DAW&#xff09;的佼佼者&#xff0c;是音乐制作人和声音工程师钟爱的工具。它集音频录制、编辑、混音以及MIDI制作为一体&#xff0c;为用户提供了从创作到最终作品输出的完整工作流程。这个版本…