03 顺序表

目录

  1. 线性表
  2. 顺序表
  3. 练习

线性表(Linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串。。。

线性表在逻辑上时线性结构,是连续的一条直线。但在物理结构上不一定是连续的,存储时,通常以数组和链式结构的形式存储

在这里插入图片描述

2. 顺序表

2.1 概念和结构

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

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素
    在这里插入图片描述

  2. 使用动态开辟的数组

在这里插入图片描述

2.2 接口实现

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

头文件

#pragma once
#include <stdio.h>
顺序表的静态存储
//#define N 7
//typedef int SLDataType;
//
//typedef struct _SeqList
//{
//	SLDataType array[N];   //定长数组
//	size_t size;           //有效数据的个数
//}SeqList;

//顺序表的动态存储
typedef int SLDataType;

typedef struct _SeqList
{
	SLDataType *array;   //动态开辟的数组
	size_t size;           //有效数据的个数
	size_t capacity;      //容量大小
}SeqList;

//接口
//初始化
void SLInit(SeqList* psl);

//增加
//头插
void SLPushFront(SeqList* psl, SLDataType data);
//尾插
void SLPushBack(SeqList* psl, SLDataType data);
//中间插
void SLInsert(SeqList* psl, int pos, SLDataType data);

//打印
void SLPrint(SeqList* psl);
//头删
void SLPopFront(SeqList* psl);
//尾删
void SLPopBack(SeqList* psl);
//中间删 
void SLEarse(SeqList* psl, int pos);

//查询
int SLFind(SeqList* psl, SLDataType data);
// 修改
void SLModify(SeqList* psl, int pos, SLDataType data);
//销毁
void SLDestory(SeqList* psl);

实现文件

#include "SeqList.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void SLInit(SeqList* psl)
{
	assert(psl);
	psl->array = (SLDataType*)malloc(sizeof(SLDataType) * 4);
	if (psl->array == NULL)
	{
		perror("malloc fail");
		return;
	}
	psl->capacity = 4;
	psl->size = 0;
}

//检查容量
void CheckCapc(SeqList* psl)
{
	assert(psl);

	if (psl->size == psl->capacity)
	{
		SLDataType* temp = (SLDataType*)realloc(psl->array, sizeof(SLDataType) * psl->capacity * 2);
		if (temp == NULL)
		{
			perror("realloc fail");
			return;
		}

		psl->array = temp;
		psl->capacity = psl->capacity * 2;

	}

}

void SLPushFront(SeqList* psl, SLDataType data)
{
	assert(psl);
	/*CheckCapc(psl);

	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->array[end + 1] = psl->array[end];
		end--;
	}
		
	psl->array[0] = data;
	psl->size++;*/
	//调用中间插入
	SLInsert(psl, 0, data);
}

void SLPushBack(SeqList* psl, SLDataType data)
{
	assert(psl);
	/*CheckCapc(psl);
	psl->array[psl->size] = data;
	psl->size++;*/

	//调用中间插入
	SLInsert(psl, psl->size, data);
}

void SLInsert(SeqList* psl, int pos, SLDataType data)
{
	assert(psl);
	assert(pos >= 0 && pos <= psl->size);
	CheckCapc(psl);

	int end = psl->size - 1;
	while (end >= pos)
	{
		psl->array[end + 1] = psl->array[end];
		end--;
	}
	psl->array[pos] = data;
	psl->size++;
}

void SLPrint(SeqList* psl)
{
	assert(psl);

	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->array[i]);
	}
	printf("\r\n");
}

void SLPopFront(SeqList* psl)
{
	assert(psl);
	assert(psl->size > 0);
	/*int start = 0;
	while (start < psl->size - 1)
	{
		psl->array[start] = psl->array[start + 1];
		start++;
	}

	psl->size--;*/
	SLEarse(psl, 0);
}

void SLPopBack(SeqList* psl)
{
	assert(psl);
	assert(psl->size > 0);
	psl->size--;
}

void SLEarse(SeqList* psl, int pos)
{
	assert(psl);
	assert(psl->size > 0);

	int start = pos + 1;
	while (start < psl->size)
	{
		psl->array[start - 1] = psl->array[start];
		start++;
	}

	psl->size--;
}

int SLFind(SeqList* psl, SLDataType data)
{
	assert(psl);
	int i = 0;
	for (; i < psl->size; i++)
	{
		if (psl->array[i] == data)
			return i;
	}

	return -1;
}

void SLModify(SeqList* psl, int pos, SLDataType data)
{
	assert(psl);
	assert(pos >= 0 && pos <= psl->size);

	psl->array[pos] = data;
}

void SLDestory(SeqList* psl)
{
	assert(psl);

	if (psl->array != NULL)
	{
		free(psl->array);
		psl->array = NULL;
	}
	psl->capacity = 0;
	psl->size = 0;
	psl = NULL;
}

主文件

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "SeqList.h"

int main()
{
	SeqList array;
	SLInit(&array);
	//增加
	SLPushBack(&array, 1);
	SLPushBack(&array, 2);
	SLPushBack(&array, 3);
	SLPushBack(&array, 4);
	SLPushBack(&array, 5);

	SLPushFront(&array, 6);
	SLPrint(&array);
	//删除
	SLPopBack(&array);
	SLPrint(&array);
	SLPopFront(&array);
	SLPrint(&array);
	SLInsert(&array, 4, 4);
	SLPrint(&array);
	//删除指定元素
	SLEarse(&array, 2);
	SLPrint(&array);
	SLInsert(&array, 4, 8);
	SLPrint(&array);

	int pos = SLFind(&array, 8);
	if (pos != -1)
	{
		SLModify(&array, pos, 10);
	}
	SLPrint(&array);
	SLDestory(&array);

	return 0;
}

传入顺序表指针的函数都需要检查一下指针是否为空,用断言直接报错的好处在于运行的时候哪里出问题报错提示很明显

菜单界面在调试阶段最好别加,影响调试效率,菜单界面也不是必须的

菜单项在添加数据的时候,如何判断输入数据结束了。用-1或某个值也可能遇到用户刚好需要存入-1的情况。这时可以先输入插入数据的数量,再逐个输入数据

当scanf接收输入失败的时候会卡住下次输入,如果不清空缓冲区,可能会无限读入,可以通过判断scanf返回值看是否输入成功

3. 练习

移除元素: https://leetcode.cn/problems/remove-element/

在这里插入图片描述

第一种:
暴力求解,遍历数组,遇到和值一样的,将后面的往前覆盖,继续查找
在这里插入图片描述
时间复杂度:O(N2)
空间复杂度: O(1)

第二种:
新建一个数组,遇到值和给定值不一样的放入新数组里
在这里插入图片描述
时间复杂度:O(N)
空间复杂度: 开辟了新数组, O(N)

第三种:
和第二种思路相似,但不开辟新数组,在原数组上修改。用两个下标,一个des,一个src,遇到和给定值不一样的,将des处值改为src的值,两个下标都增加1,遇到一样的,只增加src下标。当src遍历完数组,返回长度

在这里插入图片描述

int removeElement(int* nums, int numsSize, int val) {
    
    int sign1 = 0;
    int sign2 = 0;
    for(int i = 0; i < numsSize; i++)
    {
        if(nums[sign1] != val)
        {
            nums[sign2] = nums[sign1];
            sign1++;
            sign2++;
        }else
        {
            sign1++;
        }
    }

    return sign2;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端框架前置课Node.js学习(1) fs,path,模块化,CommonJS标准,ECMAScript标准,包

目录 什么是Node.js 定义 作用: 什么是前端工程化 Node.js为何能执行Js fs模块-读写文件 模块 语法: 1.加载fs模块对象 2.写入文件内容 3.读取文件内容 Path模块-路径处理 为什么要使用path模块 语法 URL中的端口号 http模块-创建Web服务 需求 步骤: 案例:浏…

Detection-friendly dehazing: object detection in real-world hazy scenes

Detection-friendly dehazing: object detection in real-world hazy scenes 摘要 提出了一种联合架构BAD-Net&#xff0c;将去雾模块和检测模块连接成一个端到端的方法。另外&#xff0c;设计了了两个分支结构&#xff0c;用注意力融合模块来充分结合有雾和去雾特征&#xf…

【python】11.文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;但是这里我们并不浪费笔墨介绍这个概念&#xff0c;请大…

Python展示 RGB立方体的二维切面视图

代码实现 import numpy as np import matplotlib.pyplot as plt# 生成 24-bit 全彩 RGB 立方体 def generate_rgb_cube():# 初始化一个 256x256x256 的三维数组rgb_cube np.zeros((256, 256, 256, 3), dtypenp.uint8)# 填充立方体for r in range(256):for g in range(256):fo…

kubectl与 jq的另外一些用法

背景&#xff1a; 在日常运维工作中&#xff0c;我们需要管理和操作大量的配置文件&#xff0c;这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象&#xff0c;它用于存储应用的配置信息。有时&#xff0c;我们需要查找哪些 Confi…

【WPF.NET开发】OpenType字体

本文内容 OpenType 字体格式变量大写字母连字花体备用项数字样式版式类 本主题概述了 Windows Presentation Foundation (WPF) 中 OpenType 字体技术的一些主要功能。 1、OpenType 字体格式 OpenType 字体格式是 TrueType 字体格式的扩展&#xff0c;增加了对 PostScript 字…

Linux-ARM裸机(十一)-UART串口通信

无论单片机开发还是嵌入式 Linux 开发&#xff0c;串口都是最常用到的外设。可通过串口将开发板与电脑相连&#xff0c;然后在电脑上通过串口调试助手来调试程序。还有很多的模块&#xff0c;比如蓝牙、GPS、 GPRS 等都使用的串口来与主控进行通信的&#xff0c;在嵌入式 Linux…

java如何修改windows计算机本地日期和时间?

本文教程&#xff0c;主要介绍&#xff0c;在java中如何修改windows计算机本地日期和时间。 目录 一、程序代码 二、运行结果 一、程序代码 package com;import java.io.IOException;/**** Roc-xb*/ public class ChangeSystemDate {public static void main(String[] args)…

compose 实验

cd /opt mkdir compose_nginx cd compose_nginx mkdir nginx cd nginx/ 此时顺便将nginx安装包拖进来 vim Dockerfile mkdir /opt/compose_nginx/wwwroot echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html docker netw…

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…

HTML--CSS--浮动布局及定位布局

正常文档布局 块元素独占一行 行内元素在有多个的时候&#xff0c;就是从左到右排在一行 块元素包括&#xff1a;div,p,hr 行内元素&#xff1a;span,i,img 浮动布局 float 属性&#xff1a; left 向左 right 向右 作用我目前看起来就是浮动元素的宽度是由内容决定的&#x…

MySQL面试题 | 10.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

LLM之幻觉(二):大语言模型LLM幻觉缓减技术综述

LLM幻觉缓减技术分为两大主流&#xff0c;梯度方法和非梯度方法。梯度方法是指对基本LLM进行微调&#xff1b;而非梯度方法主要是在推理时使用Prompt工程技术。LLM幻觉缓减技术&#xff0c;如下图所示&#xff1a; LLM幻觉缓减技术值得注意的是&#xff1a; 检索增强生成&…

pytorch集智-5手写数字识别器-卷积神经网络

1 简介 简称&#xff1a;CNN&#xff0c;convolutional neural network 应用场景&#xff1a;图像识别与分类&#xff08;CNN&#xff09;&#xff0c;看图说话&#xff08;CNNRNN&#xff09;等 优越性&#xff1a;和多层感知机相比&#xff0c;cnn可以识别独特的模式&…

如何做用户分层和标签体系

“活动作了一场接一场&#xff0c;简直要累死了&#xff0c;拉进来的客户也没有多少&#xff0c;投入产出完全不成比例&#xff0c;怎么办&#xff1f;“ “有那么多注册用户&#xff0c;但是GMV怎么才这么点&#xff0c;他们怎么不买啊&#xff0c;难道都是羊毛党&#xff1f;…

使用 TiUP 部署 TiDB 集群

TIDB优点 支持分布式且支持事务的关系型数据库&#xff0c;不用考虑分库分表 同时满足了可伸缩&#xff0c;高可用&#xff0c;关系型&#xff0c;支持事务。 基本上按官网的文档来就行了。 在线部署 以普通用户身份登录中控机。以 tidb 用户为例&#xff0c;后续安装 TiUP …

常用界面设计组件 —— 窗体(QT)

二、常用界面设计组件2.1 窗体2.1.1 设置窗体位置、大小及背景颜色2.1.2 设置窗体标题2.1.3 多窗体调用 二、常用界面设计组件 组件是GUI的基本元素&#xff0c;也称为UI控件。它接受来自底层平台的不同用户事件&#xff0c;如鼠标和键盘事件&#xff08;以及其它事件&#xf…

漏洞复现-Yearning front 任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

7_1 tesseract 安装及使用

1、 安装tesseract   OCR&#xff0c;即Optical Character Recognition&#xff0c;光学字符识别&#xff0c;是指通过扫描字符&#xff0c;然后通过其形状将其翻译成电子文本的过程。对于图形验证码来说&#xff0c;它们都是一些不规则的字符&#xff0c;这些字符确实是由字…

助力工业焊缝质量检测,YOLOv7【tiny/l/x】不同系列参数模型开发构建工业焊接场景下钢材管道焊缝质量检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Plus…