【数据结构与算法初阶】顺序表(上)

news2025/1/19 2:39:32

什么语言实现不重要,理解了思路就行,本篇使用C语言实现

一.顺序表含义(重要)

首先,顺序表属于线性表中的一中,线性表可以用多种方式实现,顺序表只是其中的一种

---------

线性表是啥呢,通俗的说,比如数组,里面的数据一个接一个的存放,空间挨着,前一个数据都对应下一个数据,这就是线性结构,数据跟一条线一样,都在这条直线上

---------

而线性表不止可以用数组实现,数组里面数据是连续存放的,空间挨着,

除了数组,还有一种空间不挨着的,就是每个数据在内存中存放的地址都没挨着

---------

你在这儿,我可能在这儿,他可能在这儿,

虽然地址不同,但是可以通过建造结构体的方式,在存放数据时,再建一个指针存放下一个数据的地址,这样就可以通过这个数据找到他下一个数据

----------

也就是在物理地址上,虽不是连续的,但是从逻辑上,他们就是一个数组,一个线性表

----------

看完上述,顺序表就是线性表中的一种,空间是挨着的那一种 

  

二.顺序表分类及优缺点

顺序表分为静态顺序表和动态顺序表两种

静态顺序表:用数组,长度固定,无法自己扩大缩小,数据放满就满了

动态顺序表:数组换成指针,放一个数据就用malloc函数再扩大一个空间,可以自适应调节

顺序表优点:空间连续,利用率高,可以随机访问某个指定元素,速度快,代码简单

顺序表缺点:插入或者删除某个地方,比较慢,需要挪动整个表,内存有时候给太多,浪费

三. 静态顺序表的实现

1.

头文件 进行函数功能声明,结构体的创建

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>
struct Seqlist
{
	int data[20];
	int count;
};
typedef struct Seqlist Seqlist; 
void SeqlistInit(Seqlist* p);//初始化
void SeqlistAdd(Seqlist* p, int n); //尾添加 
void SeqlistDel(Seqlist* p); //尾删除
void SeqlistInsert(Seqlist* p, int pos, int n);//指定元素前添加
void SeqlistInsertback(Seqlist* p, int pos, int n);//指定元素后添加
void SeqlistErase(Seqlist* p, int n);//指定元素删除
int SeqlistFind(Seqlist* p, int n); //寻找元素是否存在
bool SeqlistFull(Seqlist* p);//查询是否存满
void SeqlistPrint(Seqlist* p);//打印数据

2.

第1个源文件 进行各个函数功能的定义及实现

#include "Seqlist.h"
void SeqlistInit(Seqlist* p)
{
	memset(p->data, 0, sizeof(int) * 20);
	p->count = 0;
}
void SeqlistAdd(Seqlist* p, int n)
{
	if (SeqlistFull(p))
	{
		printf("数据已满,无法添加\n");
	}
	else
	{
		p->data[p->count] = n;
		p->count++;
	}
}
void SeqlistDel(Seqlist* p)
{
	if (p->count == 0)
	{
		printf("无数据,无法继续删除");
	}
	else
	{
		p->count--;
	}
}
void SeqlistInsert(Seqlist* p, int pos,int n)
{
	if (SeqlistFull(p))
	{
		printf("数据已满,无法添加");
	}
	else
	{
		int newflag= SeqlistFind(p, pos);
		if (newflag == -1)
		{
			printf("指定元素未找到");
		}
		else
		{
			int i = p->count;
			while (i > newflag)
			{
				p ->data[i] = p->data[i - 1];
				i--;
			}
			p->data[newflag] = n;
			p->count++;
		}
	}
}
void SeqlistInsertback(Seqlist* p, int pos, int n)
{
	if (SeqlistFull(p))
	{
		printf("数据已满,无法添加");
	}
	else
	{
		int newflag = SeqlistFind(p, pos);
		if (newflag == -1)
		{
			printf("指定元素未找到");
		}
		else
		{
			int i = p->count;
			while (i > newflag+1)
			{
				p->data[i] = p->data[i - 1];
				i--;
			}
			p->data[newflag+1] = n;
			p->count++;
		}
	}
}
void SeqlistErase(Seqlist* p, int n)
{
	if (SeqlistFind(p, n) == -1)
	{
		printf("指定删除元素未找到");
	}
	else
	{
		int i = SeqlistFind(p,n);
		while (i<p->count-1)
		{
			p->data[i] = p->data[i + 1];
			i++;
		}
		p->count--;
	}
}
int SeqlistFind(Seqlist* p, int n)
{
	for (int i = 0; i < p->count; i++)
	{
		if (p->data[i] == n)
		{
			return i;
		}
	}
	return -1;
}
bool SeqlistFull(Seqlist* p)
{
	if (p->count == 20) return true;
	return false;
}
void SeqlistPrint(Seqlist* p)
{
	for (int i = 0; i < p->count; i++)
	{
		printf("%d\n", p->data[i]);
	}
}

3.

第2个源文件 main主函数 进行测试各类功能调用,以及结构体变量的创建

#include "Seqlist.h"
int main()
{
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	SeqlistAdd(&seqlist,5);
	SeqlistAdd(&seqlist,4);
	SeqlistAdd(&seqlist,3);
	SeqlistAdd(&seqlist,2);
	SeqlistAdd(&seqlist,1);
	//SeqlistDel(&seqlist);
	//SeqlistInsert(&seqlist, 1, 3);
	//SeqlistInsertback(&seqlist, 1, 3);
	//SeqlistErase(&seqlist, 5);
	//printf("%d",SeqlistFind(&seqlist, 4));
	SeqlistPrint(&seqlist);
	return 0;
}

四.静态顺序表总结

静态顺序表的功能大致如上,相比动态,空间是固定好的,不能自适应

静态顺序表使用频率较低,算是入门级别

此篇先更新静态顺序表的实现,后面接着更新动态顺序表

五.学习方法

关于数据结构的学习,我认为理解第一,实现第二

理解并熟练掌握一个线性表后,其他线性表都自然迎刃而解了

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

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

相关文章

lego-loam imageProjection.cpp源码注释(一)

一、主函数 int main(int argc, char** argv){ros::init(argc, argv, "lego_loam");ImageProjection IP;ROS_INFO("\033[1;32m---->\033[0m Image Projection Started.");ros::spin();return 0; }主函数很简单&#xff0c;常规ros初始化ros::init&…

程序员35岁丢了工作,应该怎么活?

35岁对很多程序员来说是个敏感的年龄段。在这个阶段&#xff0c;许多程序员已经有了丰富的工作经验和较高的薪水&#xff0c;但同时也面临着职场上不可忽视的年龄压力。尤其在一些技术密集型的公司&#xff0c;35岁之后的程序员可能被认为“年纪大了”&#xff0c;不再是招聘市…

【C语言】动态内存管理及相关笔试题

文章目录 一、为什么有动态内存分配二、malloc和free1.malloc函数的使用2.free函数的使用 三、calloc和realloc1.calloc函数的使用2.realloc函数的使用 四、常见动态内存分配的错误五、动态内存经典笔试题题1题2题3 六、总结C/C中程序内存区域划分 一、为什么有动态内存分配 我…

Struct Streaming

spark进行实时数据流计算时有两个工具 Spark Streaming:编写rdd代码处理数据流,可以解决非结构化的流式数据 Structured Streaming:编写df代码处理数据流,可以解决结构化和半结构化的流式数据 实时计算 实时计算&#xff0c;通常也称为“实时流计算”、“流式计算” 流数据处…

面腾讯后台开发,二面挂掉了,,,

随着各厂秋招的开启&#xff0c;收到面试邀请的同学也越来越多。在当年和我一起找实习的同学里面&#xff0c;有实力较强的同学收到了腾讯后台开发的校招面试邀请。但面试不止是实力的竞争&#xff0c;也有很重要的运气的因素。 虽然我的同学在腾讯后台开发的二面中挂掉了&…

Mybatis中的映射文件编写原则

先来回顾一下&#xff0c;在Java项目中如何使用Mybatis执行SQL语句&#xff1a; 添加依赖&#xff1a;在项目中添加 MyBatis 和数据库驱动的依赖。配置 MyBatis&#xff1a;创建 MyBatis 的配置文件&#xff0c;配置数据源和 Mapper 映射。创建 POJO 类&#xff1a;定义与数据…

拒绝飞单,微信监控轻松搞定!

微信作为广泛使用的社交工具&#xff0c;其安全性和监控问题受到了广泛关注。对于企业来说&#xff0c;确保客户资源的安全和防止员工“飞单”是重要的管理挑战。以下是一些有效的方法和工具&#xff0c;可以帮助企业提高微信的安全性&#xff0c;防止飞单&#xff0c;从而保护…

LLM - 配置 ModelScope SWIFT 测试 Qwen2-VL 模型推理(Infer) 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142827217 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SWIFT …

QT文件操作【记事本】

mainwindow.h核心函数 QFileDialog::getOpenFileName()QFileDialog::getSaveFileName() #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QFileDialog> #include<QMessageBox> #include<QDebug> #include<QFile> #…

Apache Kafka的生态

Kafka 生态系统 微信公众号&#xff1a;阿俊的学习记录空间 小红书&#xff1a;ArnoZhang wordpress&#xff1a;arnozhang1994 博客园&#xff1a;arnozhang CSDN&#xff1a;ArnoZhang1994 以下是与 Kafka 集成的工具列表&#xff0c;涵盖了不同领域的工具和扩展。这些…

Jmeter如何进行多服务器远程测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…

鱼跃医疗荣获深交所信息披露工作“A”级评价

2024年10月11日&#xff0c;深圳证券交易所&#xff08;以下简称“深交所”&#xff09;发布了《关于深市上市公司2023-2024年度信息披露评价结果的通报》&#xff0c;鱼跃医疗&#xff08;002223.SZ&#xff09;凭借在信息披露质量、投资者关系管理等各方面的优异表现&#xf…

总结拓展十四:批次管理(1)

1、批次的概念 批次是指生产或采购过程中&#xff0c;为了区分不同供应商之间相同产品间的微小区别而进行的管理方式。它通常用于确保产品质量的一致性和可追溯性。批次的概念可以应用于多个领域&#xff0c;包括生产、采购、物流、销售等。 2、批次管理的概念 批次管理是指对…

SIC MOS的保护方式

SIC MOS与IGBT短路保护有所不同的原因&#xff1a; 由于SIC MOS芯片尺寸较小(散热能力较差&#xff0c;在短路情况下&#xff0c;浪涌电流会产生大量的热量)&#xff0c;SIC MOS的浪涌能力低于IGBT。SiC MOSFET 和 IGBT 的输出特性不同&#xff0c;在正常导 通状态期间&#x…

【vue3】弹幕效果实现

本次弹幕基于vue3-danmaku组件实现。 弹幕效果 1.安装插件 npm install vue3-danmaku --save 2.基础使用方法 <template><vue-danmaku v-model:danmus"danmus" loop style"height:100px; width:300px;"></vue-danmaku> </templat…

发布自己的python包

文章目录 概要模块和包发布自己的package创建目录结构发布 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; openAI 的 GPT 大模型的发展历程。 模块和包 在Python中&#xff0c;程序的划分可以分为三个层次&#xff1a;脚本、模块和包 script&#xff1a;独…

【人工智能】探索最强AI工具:实际应用与影响

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI工具已经深入到人们日常生活和工作的方方面面。这些工具不仅提高了生产力&#xff0c;还改变了我们解决问题和处理信息的方式。在中文互联网和国际市场中&#xff0c;众多AI工具已成为人们工作、学习、创作…

软考结构化开发 -- (耦合,内聚,设计原则,系统文档,数据字典)

文章目录 一、耦合二、内聚三、设计原则四、系统文档五、数据字典 一、耦合 模块化&#xff1a;将一个待开发的软件分解成若干个小的简单部分–模块模块独立 无直接耦合&#xff1a;指两个模块之间没有直接的关系&#xff0c;它们分别从属于不同模块的控制与调用&#xff0c;…

spring boot itext7 修改生成文档的作者、制作者、标题,并且读取相关的信息。

1、官方的example文件&#xff1a;iText GitHub itext-java-7.2.5\kernel\src\test\java\com\itextpdf\kernel\pdf\PdfStampingTest.java 2、修改代码&#xff1a; Testpublic void stamping1() throws IOException {String filename1 destinationFolder "stamping1_…

特惠电影票API接口的优势功能以及对接因素?

特惠电影票对接接口通常是指允许第三方开发者或平台通过编程方式接入电影票预订服务的API。这些接口可以提供查询电影场次、座位信息、票价、订票、支付等功能。以下是一些关键点和考虑因素&#xff0c;以及一些提供特惠电影票API接口的平台&#xff1a; 关键功能 电影场次信息…