顺序表的模拟

news2024/11/17 5:20:49

前言:

数据结构无论是以后就业还是考研,对于计算机方向的同学来说都是必修的一门课,所以,深入理解各种数据结构是一名合格程序员的基本素养。这里我就先带大家了解最简单的数据结构--顺序表吧。

1.什么是顺序表

顺序表是一种线性数据结构,而且其存储数据的空间是连续的,这一点跟数组非常像。

由于其基本结构式是连续的,我们在查找元素时也就可以用下标映射快速定位到元素的位置,是编写常见算法的常用数据结构之一。

2.顺序表的功能

顺序表的主要操作包括访问、插入、删除和修改等。其中,访问是顺序表最基本的操作之一,可以通过下标(索引)来访问顺序表中的元素,时间复杂度为 O(1)。插入和删除操作都涉及到元素的移动,因此它们的时间复杂度为 O(n)。修改操作和访问类似,时间复杂度也为 O(1)。

3.c语言代码模拟实现顺序表

主要思路就是:首先是定义数据类型(我这里是int),然后是定义结构体SeqList(顺序表),这个结构体用一个date指针来指向数据区域(我这里是用malloc动态开辟内存),size表示目前顺序表中的元素,cap表示目前顺序表的容量。

在实现顺序表的增删查改过程中,要注意size的变化,看是否已经达到最大容量,根据实际情况选择扩容(用realloc)。

3.1 SeqList.h头文件

用来声明各种功能函数,定义数据类型等。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
//SeqList.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define INIT_SIZE 4
#define INIT_CAP 10

typedef int SLDateType;

typedef struct SeqList {
	SLDateType* date;
	int size;
	int cap;
}SeqList;

void SeqListInit(SeqList* SL);
//顺序表销毁
void SeqListDestroy(SeqList* SL);
//打印顺序表
void PrintSeqList(SeqList* SL);
//尾插元素
void SeqListPushBack(SeqList* SL, int x);
//头插元素
void SeqListPushFront(SeqList* SL, int x);
//指定位置插入元素
void SeqListInsert(SeqList* SL, int pos, int x);
// 表尾弹出元素
void SeqListPopBack(SeqList* SL);
//表头弹出元素
void SeqListPopFront(SeqList* SL);
//删除指定位置
void SeqListErase(SeqList* SL, int pos);
//查找元素
int SeqListFind(SeqList* SL, int x);

3.2 SeqList.c源文件

实现各种功能函数。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
//SeqList.c


#include"SeqList.h"
//顺序表初始化
void SeqListInit(SeqList* SL) {
	SL->date = (SLDateType*)malloc(sizeof(SLDateType) * INIT_CAP);
	SL->size = 0;
	SL->cap = INIT_CAP;
}

//顺序表销毁
void SeqListDestroy(SeqList* SL) {
	assert(SL);
	free(SL->date);
	SL->size = 0;
	SL->cap = 0;
}

//检查顺序表是否已满,如果满了就扩容
static void CheckSLIsMax(SeqList* SL) {
	assert(SL);
	if (SL->size == SL->cap) {
		SeqList* res = SL;
		res = (SeqList*)realloc(SL->date, sizeof(SLDateType) * ((SL->cap) * 2));
		if (res == NULL) {
			perror("realloc:fail");
		}
		SL->date = res;
		(SL->cap) *= 2;
		return;
	}
	return;
}
//打印顺序表
void PrintSeqList(SeqList* SL) {
	assert(SL);
	for (int i = 0; i < SL->size; i++) {
		printf("%d ", SL->date[i]);
	}
	printf("\n");
	printf("该顺序表目前有%d个数据,容量为%d\n", SL->size, SL->cap);
	printf("\n");
	return;
}

//尾插元素
void SeqListPushBack(SeqList* SL, int x) {
	assert(SL);
	CheckSLIsMax(SL);
	SL->date[SL->size] = x;
	SL->size++;
}
//头插元素
void SeqListPushFront(SeqList* SL,int x) {
	assert(SL);
	CheckSLIsMax(SL);
	for (int i = SL->size; i >=1; i--) {
		SL->date[i] = SL->date[i - 1];
	}
	SL->date[0] = x;
	SL->size++;
	return;
}
//插入元素到指定位置
void SeqListInsert(SeqList* SL, int pos, int x) {
	assert(SL);
	if (pos >= 0 && pos < SL->size) {
		CheckSLIsMax(SL);
		for (int i = SL->size; i >= pos+1; i--) {
			SL->date[i] = SL->date[i - 1];
		}
		SL->date[pos] = x;
		SL->size++;
	}
	else {
		perror("插入位置有误");
	}
}
// 表尾弹出元素
void SeqListPopBack(SeqList* SL) {
	assert(SL);
	if (SL->size > 0) {
		//SL->date[SL->size - 1];
		SL->size--;
	}
	else {
		perror("SeqListPopBack: failen");
	}
	return;
}
//表头弹出元素
void SeqListPopFront(SeqList* SL) {
	assert(SL);
	if (SL->size > 0) {
		for (int i = 0; i < SL->size-1; i++) {
			SL->date[i] = SL->date[i + 1];
		}
		SL->size--;
	}
	else {
		perror("SeqListPopFront: faile");
	}
	return;
}
//删除指定位置
void SeqListErase(SeqList* SL, int pos) {
	assert(SL);
	if (pos >= 0 && pos < SL->size) {
         for (int i = pos; i < SL->size-1; i++) {
			  SL->date[i] = SL->date[i + 1];
		  }
		SL->size--;
	}
	else {
		perror("SeqListErase:fail");
	}
}
//查找元素
int SeqListFind(SeqList* SL, int x) {
	assert(SL);
	for (int i = 0; i < SL->size; i++) {
		if (SL->date[i] == x) {
			return i;
		}
	}
	return -1;
}


3.3test.c

用来存放main()函数,测试各种数据,我这里就简单给出一组测试数据(懒)

代码:

SeqList SL;
void test1() {
	SeqListInit(&SL);
	SeqListPushBack(&SL, 1);
	SeqListPushBack(&SL, 2);
	SeqListPushBack(&SL, 3);
	SeqListPushBack(&SL, 4);
	SeqListPushBack(&SL, 5);
	SeqListPushBack(&SL, 6);
	PrintSeqList(&SL);
	SeqListPushFront(&SL, 4);
	PrintSeqList(&SL);
 
}

int main() {
	test1();
	return 0;
}

4.总结

学数据结构一般都是从顺序表开始的,顺序表虽然简单,但是是我们经常使用的一种数据结构,了解并学会顺序表功能的具体实现对以后学习高级数据结构打下基础。总之,对于简单的知识我们要不能轻视,反而要更加重视对于基础的巩固,万丈高楼平地起嘛!

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

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

相关文章

菜单管理中icon图标回显

<el-table-column prop"icon" label"图标" show-overflow-tooltip algin"center"><template v-slot"{ row }"><el-icon :class"row.icon"></el-icon></template></el-table-column>

Xilinx 7 系列 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性

如果通过LVDS进行接口&#xff0c;可以按照以程图中的步骤操作&#xff0c;以确保满足正确使用LVDS的所有要求。 40191 - 7 系列 - 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性 与LVDS兼容驱动器和接收器连接时&#xff0c;7系列LVDS和LVDS_25输入和输出应该不存在兼容性问…

基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 仿钉钉的开源项目网上也不少&#xff0c;而且很多功能已经也比较完善了&#xff0c;但大部分都不是MIT协议…

Ubuntu系统HUSTOJ 用 vim 修改php.ini 重启PHP服务

cd / sudo find -name php.ini 输出&#xff1a; ./etc/php/7.4/cli/php.ini ./etc/php/7.4/fpm/php.ini sudo vim /etc/php/7.4/cli/php.ini sudo vim /etc/php/7.4/fpm/php.ini 知识准备&#xff1a; vim的搜索与替换 在正常模式下键入 / &#xff0c;即可进入搜索模式…

计数排序(秒懂版)

public class CountingSort {int[] sort() {int N 10000;int M 100;//假设A中最大值为100int A[] new int[N];//1~k,原数组int B[] new int[N];//1~k,Stores incompletely sorted numbersint C[] new int[M 1];//0~n,辅助排序数组for (int i 0; i < M; i) {C[i] 0;}…

案例分析真题-信息安全

案例分析真题-信息安全 2009年真题 【问题1】 【问题2】 【问题3】 2010年真题 【问题1】 【问题2】 【问题3】 2011 年真题 【问题1】 【问题2】 【问题3】 骚戴理解&#xff1a;这个破题目完全考的知识储备&#xff0c;不知道的连手都动不了&#xff0c;没法分析 2013年真题…

Linux基础指令[下]

文章目录 0.英语单词3.Linux的重要指令[下]1. 输入/输出重定向1.1echo和输出重定向1.2cat和输入重定向1.3Linux文件理念 2.长文本逐行查看2.1more的介绍2.2建议使用less2.3more/less的选项 3.head&&tail显示头尾对head&&tail的认识练习head和tail 4.时间指令4.…

vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)

一、效果图 二、参数配置 1、代码示例 <t-antd-selectv-model"selectVlaue":optionSource"stepList"change"selectChange" />2、配置参数&#xff08;Attributes&#xff09;继承 a-select Attributes 参数说明类型默认值v-model绑定值…

【陈老板赠书活动 - 16期】- 【快捷学习Spring】

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f468;‍&am…

1 — NLP 的文本预处理技术

一、说明 在本文中&#xff0c;我们将讨论以下主题&#xff1a;1为什么文本预处理很重要&#xff1f;2 文本预处理技术。这个文对预处理做一个完整化、程序化处理&#xff0c;这对NLP处理项目中有很大参考性。 二、为什么文本预处理很重要&#xff1f; 数据质量显着影响机器学习…

学习笔记|正态分布|图形法|偏度和峰度|非参数检验法|《小白爱上SPSS》课程:SPSS第三讲 | 正态分布怎么检验?看这篇文章就够了

目录 学习目的软件版本原始文档为什么要假设它服从正态分布呢?t检验一、图形法1、频数分布直方图解读 2、正态Q-Q图操作解读 3、正态P-P图SPSS实战操作解读 二、偏度和峰度解读&#xff1a; 三、非参数检验法注意事项 四、规范表达五、小结划重点 学习目的 SPSS第三讲 | 正态…

线性代数 第三章 向量

一、运算 加法、数乘、内积 施密特正交化 二、线性表出 概念&#xff1a;如果&#xff0c;则称可由线性表出&#xff08;k不要求不全为0&#xff09; 判定&#xff1a; 非齐次线性方程组有解无关&#xff0c;相关 如果两个向量组可以互相线性表出&#xff0c;则称这两个…

基于STC系列单片机实现外部中断0控制按键调节定时器0产生PWM(脉宽调制)的功能

#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint sbit PwmOut P1^0;//位定义脉宽调制输出为单片机P1.0脚 uchar PwmTimeCount;//声明脉宽调制时间计数变量 uchar PwmDutyCycle;//声明脉宽调制占空比变量 void Ti…

滴滴学生认证拉新上线了 地推网推百搭项目

滴滴学生认证可以通过“聚量推客”申请&#xff0c;是一手官签服务商 量级足够大 优势&#xff1a;实时数据T1结算 百分百数据 滴滴学生认证可搭配小红书签到拉新、美团私域校园版拉新、美团圈圈拉新一起做&#xff0c;这样能赚取更多佣金

分治法求解多项式乘法

目录 多项式乘法问题暴力求解背景展开1. 系数表示值计算复杂度2. 点值法表示多项式3. 点值表示值计算复杂度4. 系数法和点值法比较5. 系数法和点值法的转换 快速傅里叶变换 FFT1. 多项式乘法的分治2. 取值的直觉3. 离散傅里叶 DFT 和单位根FFT 多项式乘法问题 多项式乘法是将两…

PandaX : Go语言企业级 IoT 物联网平台快速开发框架

PandaX 是一个基于前后端分离架构开发的开源企业级物联网平台低代码开发基座&#xff0c;后端系统采用 Go 语言和前端基于 VUE3 开发&#xff0c;支持设备接入、设备管控&#xff0c;规则链引擎&#xff0c;云组态&#xff0c;可视化大屏&#xff0c;报表设计器&#xff0c;表单…

STM32智能小车—跟随小车和摇头避障小车

一、STM32跟随小车 1. 红外壁障模块分析 原理和循迹是一样的&#xff0c;循迹红外观朝下&#xff0c;跟随朝前 2. 跟随小车的原理 左边跟随模块能返回红外&#xff0c;输出低电平&#xff0c;右边不能返回&#xff0c;输出高电平&#xff0c;说明物体在左边&#xff0c;需要…

Python基础入门例程26-NP26 牛牛的反转列表(列表)

最近的博文&#xff1a; Python基础入门例程25-NP25 有序的列表&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程24-NP24 淘汰排名最后的学生&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程23-NP23 删除好友&#xff08;列表&#xff09;-CSDN博客 目录 …

随机链表的复制(C++解法)

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…

Go Map底层实现简述

Go的map是一种高效的数据结构&#xff0c;用于存储键值对。其底层实现是一个哈希表&#xff08;hash table&#xff09;&#xff0c;下面是有关map底层实现的详细介绍&#xff1a; 哈希表&#xff1a; map的底层实现是一个哈希表&#xff0c;也称为散列表。哈希表是一个数组&a…