【数据结构】顺序表---C语言版

【数据结构】顺序表

  • 前言:
  • 一、线性表
  • 二、顺序表
    • 1.顺序表的概念及结构:
    • 2.顺序表的分类:
    • 3.顺序表缺陷:
  • 三、顺序表的代码实现:
    • 1.头文件:
    • 2.函数文件:
    • 3.测试文件:
  • 四、顺序表的相关OJ题:
    • (1)原地移除数组中所有的元素val:
      • 1.题目描述:
      • 2.思路表述:
      • 3.代码实现:
    • (2)删除有序数组中的重复项
      • 1.题目描述:
      • 2.思路表述:
      • 3.代码实现:
    • (3)合并两个有序数组
      • 1.题目描述:
      • 2.思路表述:
      • 3.代码实现:

前言:

顺序表是一种常见的数据结构,今天就让我来带领大家一起学习一下吧!
不会再休息,一分一毫了,OK,let’s go!

一、线性表

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

在这里插入图片描述

二、顺序表

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

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

2.顺序表的分类:

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
//顺序表的静态存储
#define N 7
typedef int SLDataType;typedef struct SeqList
{SLDataType array[N];//定长数组size_t size;//有效数据的个数
}SeqList;

在这里插入图片描述
2. 动态顺序表:使用动态开辟的数组存储。

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

在这里插入图片描述

3.顺序表缺陷:

  1. 顺序表缺陷:

(1)动态增容有性能消耗。

(2)当头部插入数据时,需要挪动数据

三、顺序表的代码实现:

1.头文件:

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int SLDataType;typedef struct SeqList
{SLDataType* s;//顺序表的名称(头指针!)int size;//储存的有效个数!int capacity;//整块空间的大小!
}SL;//初始化
void SLInit(SL* ps);
//销毁
void SLDestory(SL* ps);
//打印
void SLPrint(SL* ps);//管理数据:增删查改//尾插
void PushBack(SL* ps, SLDataType x);
//头插
void PushFront(SL* ps, SLDataType x);//尾删
void PopBack(SL* ps);
//头删
void PopFront(SL* ps);//判断是否扩容
void SLCheckCapacity(SL* ps);//在pos位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);

2.函数文件:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include "SeqList.h"//初始化函数
void SLInit(SL* ps)
{assert(ps);//创建空间ps->s = (SLDataType*)malloc(sizeof(SLDataType)*4);if (ps->s == NULL){perror("malloc fail");exit(-1);}ps->size = 0;ps->capacity = 4;
}//销毁函数
void SLDestory(SL* ps)
{free(ps);ps->s = NULL;ps->size = ps->capacity = 0;
}//打印函数
void SLPrint(SL* ps)
{int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->s[i]);}printf("\n");
}//判断是否扩容
void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){//需要扩容SLDataType* tmp = (SLDataType*)realloc(ps->s, sizeof(SLDataType) * ps->capacity * 2);//扩大了原来容量的二倍。//SLDataType* tmp = (SLDataType*)realloc(ps->s, 2 * ps->capacity);标准的错误写法!//如果空间不够用,要对一些元素进行扩容。我们扩容的标准:就是为这些元素申请它 自身大小 整数倍 的空间!所以说为什么要sizeof(数据类型),然后再乘以扩大的容量的倍数if (tmp == NULL){perror("realloc fail");exit(-1);}ps->s = tmp;ps->capacity *= 2;}}//尾插
void PushBack(SL* ps, SLDataType x)
{//检查容量SLCheckCapacity(ps);ps->s[ps->size] = x;ps->size++;
}//尾删
void PopBack(SL* ps)
{assert(ps);ps->size--;}//头插(利用一个end指针从后往前拷贝!)
void PushFront(SL* ps, SLDataType x)
{assert(ps);//检查容量SLCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->s[end+1] = ps->s[end];end--;}ps->s[0] = x;ps->size++;
}//头删
void PopFront(SL* ps)
{assert(ps);int begin = 0;while (begin < ps->size-1){ps->s[begin] = ps->s[begin + 1];begin++;}ps->size--;
}//在pos位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x){assert(ps);assert(pos >= 0 && pos < ps->size);SLCheckCapacity( ps);int end = ps->size - 1;while (end >= pos){ps->s[end+1] = ps->s[end];end--;}ps->s[pos] = x;ps->size++;
}

3.测试文件:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include "SeqList.h"void test1()
{SL s1;SLInit(&s1);PushFront(&s1, 1);PushFront(&s1, 2);PushFront(&s1, 3);PushFront(&s1, 4);PushFront(&s1, 5);SLPrint(&s1);PopFront(&s1);PopFront(&s1);PopFront(&s1);SLPrint(&s1);}void test2()
{SL s2;SLInit(&s2);PushBack(&s2,1);PushBack(&s2,2);PushBack(&s2,3);PushBack(&s2,4);PushBack(&s2,5);SLPrint(&s2);PopBack(&s2);PopBack(&s2);PopBack(&s2);SLPrint(&s2);
}void test3()
{SL s2;SLInit(&s2);PushBack(&s2, 1);PushBack(&s2, 2);PushBack(&s2, 3);PushBack(&s2, 4);PushBack(&s2, 5);SLPrint(&s2);SLInsert(&s2, 3, 6);//在下标为3的数据之前插入一个6SLPrint(&s2);
}int main()
{//test1();//测试头插,头删//test2();//测试尾插 尾删test3();//测试在pos位置之前插入数据!return 0;}

在这里插入图片描述

四、顺序表的相关OJ题:

(1)原地移除数组中所有的元素val:

1.题目描述:

1.原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接:OJ链接
在这里插入图片描述

2.思路表述:

在这里插入图片描述

3.代码实现:

int removeElement(int* nums, int numsSize, int val) 
{int src=0;int dst=0;while(src<numsSize){if(nums[src]!=val){nums[dst++]=nums[src++];}else{src++;}}return dst;//返回的是:新数组的长度,因为最后一步出循环的时候,dst已经++了,所以说直接返回dst就行了
}

(2)删除有序数组中的重复项

1.题目描述:

在这里插入图片描述

2.思路表述:

还使用双下标法:
在这里插入图片描述

3.代码实现:

int removeDuplicates(int* nums, int numsSize) 
{int dst=1;int src=0;while(dst<numsSize){if(nums[dst]!=nums[src]){//nums[++src]=nums[dst++];//这里的src一定要是前置++,先++,然后再赋值。src++;nums[src]=nums[dst];dst++;}else{dst++;}}return src+1;
}

(3)合并两个有序数组

1.题目描述:

在这里插入图片描述

2.思路表述:

使用3下标法
在这里插入图片描述

3.代码实现:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{int end1=m-1;int end2=n-1;int end=m+n-1;while(end1>=0&&end2>=0){if(nums1[end1]>nums2[end2]){nums1[end--]=nums1[end1--];}else{nums1[end--]=nums2[end2--];}}//因为用nums1的初始长度是m+n,所以不会担心数组大小不够用。//下面这个循环是针对:比如说nums1中的所有数字都插到自己数组后面了,但是因为两个数组都是有序的,所以我只需要把nums2中的全部数字依次放到nums1前面就行了。while(end2>=0){nums1[end--]=nums2[end2--];}
}

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

在这里插入图片描述

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

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

相关文章

怎么给数据库某个字段建立一个前缀索引

说明&#xff1a;SQL调优中重要的一个环节是建立索引&#xff0c;其中有一条是字段值过长字段应该建立前缀索引&#xff0c;即根据字段值的前几位建立索引&#xff0c;像数据库中的密码字段、UUID字段。 因为其随机性&#xff0c;其实根据前几位就可以锁定某一条记录了。前缀索…

(附源码)SSM+成都大学体育场馆预约系统 计算机毕设37087

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

Vatee万腾的数字探险之旅:vatee科技创新的新纪元

在数字时代的潮流中&#xff0c;Vatee万腾以其独特的数字探险之旅引领着科技创新的新纪元。这不仅是一次技术的进步&#xff0c;更是一场数字领域的探险&#xff0c;让我们一同探索Vatee在科技创新中的前沿地带。 Vatee万腾的数字探险起源于对未知的渴望和对创新的不懈追求。在…

【PUSDN】WebStorm中报错Switch language version to React JSX

简述 WebStorm中报错Switch language version to React JSX 可能本页面的写法是其他语法。所以可以不用管。 测试项目&#xff1a;ant design vue pro 前情提示 系统&#xff1a; 一说 同步更新最新版、完整版请移步PUSDN Powered By PUSDN - 平行宇宙软件开发者网www.pusdn…

《opencv实用探索·三》opencv Mat与数组互转

1、利用Mat来存储数据&#xff0c;避免使用数组等操作 //创建一个两行一列的矩阵cv::Mat mean (cv::Mat_<float>(2, 1) << 0.77, 0.33);std::cout() << mean << std::endl;float a mean.at<float>(0, 0); //0.77float b mean.at<float&…

使用vscode中编写c语言——无法打开 源 文件 “stdlib.h“C/C++(1696)问题

出现这个问题原因如下&#xff1a; 1、没有下载编辑器或者是没有配置好该编辑器的环境变量。 可以通过如下方法检查是否安装并配置好编辑器&#xff1a;打开终端&#xff1a;按winR cmd&#xff0c;然后输入gcc-v&#xff0c;查看是否有mingw64编辑器&#xff0c;如下图是已经…

TUP通信——与多个客户端同时通信

一&#xff0c;概括&#xff1a;可以通过多线程思想每加一个客户端由线程池中的主线程交给一个子线程管理 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;线程池 &#xff08;2&#xff09;&#xff0c;服务端 &#xff08;3&#xff09;&#xff0c;客户端

【Qt】QStackedWidget、QRadioButton、QPushButton及布局实现程序首页自动展示功能

效果 在程序启动后&#xff0c;有时不会进入到工作页面&#xff0c;会进入到产品展示页面。 动画如下&#xff1a; 首页展示 页面操作 当不点击时&#xff0c;一秒自动刷新一次&#xff1b;当点击时&#xff0c;会自动跳转到对应页面&#xff1b;点击上一页、下一页、及跳转页…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; K-means聚类实现步骤 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣&#xff0c;作为入门的素材非常合适。…

理解Android无埋点技术

首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而是脱离代码&#xff0c;只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码&#xff0c;而是尽可能的少写代码。开发者将SDK集…

零基础学编程轻松学编程,分享一款中文编程工具,编程构件简介

零基础学编程轻松学编程&#xff0c;分享一款中文编程工具&#xff0c;编程构件简介 中文编程开发语言工具编辑区界面截图如上图。 给大家分享一款中文编程工具 零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#…

数据库应用:Ubuntu 20.04 安装MongoDB

目录 一、理论 1.MongoDB 二、实验 1.Ubuntu 20.04 安装MongoDB 三、问题 1.Ubuntu Linux的apt 包管理器更新安装软件报错 2.Ubuntu20.04安装vim报错 3.Ubuntu20.04如何更换阿里源 4.Ubuntu22.04如何更换阿里源 一、理论 1.MongoDB &#xff08;1&#xff09;概念 …

6、Qt使用Log4Qt日志

一、知识点 1、Log4Qt有三部分 logger&#xff1a;负责捕获日志信息 layout&#xff1a;负责使用不同的样式输出日志 appender&#xff1a;负责输出信息到不同的目的地&#xff0c;比如数据库、文件、控制台等等 2、 日志级别如下&#xff0c;从上往下依次递增 ALL&#xff1a;…

css之svg 制作圆及旋转

1.代码 <template><div class"loading-box"><div class"circle-container"><svg width"75" height"75" class"move-left-to-right"><circle cx"37.5" cy"37.5" r"26&…

高端影像仪:打破微小产品测量局限

在现代工业生产中&#xff0c;影像仪以CCD数位影像为基石&#xff0c;将计算机屏幕测量技术与空间几何运算的能力融为一体&#xff0c;可以用于测量微小产品的各种尺寸和形状&#xff0c;为生产过程中的质量控制提供重要的参考依据。 影像仪产品内置高精度光学电动双倍镜头&am…

什么是动态住宅IP?它有什么用途?

随着网络的迅速发展&#xff0c;许多人对代理IP已经有了比较深刻的认识&#xff0c;并且广泛地运用到了各自的业务中&#xff0c;尤其在跨境的相关业务中表现尤其卓越。对于代理IP的类别&#xff0c;也需要根据自己的业务类型具体选择最合适的&#xff0c;那么今天IPFoxy就给大…

网页设计--第5次课后作业

1、快速学习JavaScript的基本知识第1-10章 JavaScript入门 - 绿叶学习网 2、使用所学的知识完成以下练习。需求如下3个&#xff1a; 1&#xff09;点亮灯泡 2&#xff09;将所有的div标签的标签体内容后面加上&#xff1a; very good 3&#xff09;使所有的复选框呈现被选…

【javaWeb】HTTP协议

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议 HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. 上图是通过Fiddler对访问百度搜索页时抓取的一个http协议的包。 观察抓包结果,可以看到,当前 http…

myAGV 2023 Pi 全新升级!

Introduction 在高速发展的自动化和机器人技术领域&#xff0c;我们的公司一直致力于提供高效、灵活且可靠的轻量级机械臂解决方案。然而&#xff0c;我们也深知&#xff0c;传统的机械臂需要固定在一个地方&#xff0c;这在一定程度上限制了其在空间上的应用范围。为了突破这一…

【论文阅读】ActiveNeRF:通过不确定性估计候选新视图

【论文阅读】ActiveNeRF: Learning where to See with Uncertainty Estimation Abstract1 Introduction3 Background4 NeRF with Uncertainty Estimation5 ActiveNeRF5.1 Prior and Posterior Distribution5.2 Acquisition Function5.3 Optimization and Inference 6 Experimen…