顺序表和链表

1.线性表


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

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

2.顺序表


2.1概念及结构

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

在数组上完成数据的增删查改。 顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储元素。

2. 动态顺序表:使用动态开辟的数组存储。

2.2 接口实现

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

2.2.1.代码实现

SeqList.h

#pragma once
#define N 7
#include <stdio.h>
#include < assert.h >
typedef int SLDataType;//typedef struct SeqList
//{
//	SLDataType a[N];
//	int size;	//存储有效数据个数
//	int capacity;	//容量的大小
//}SL;typedef struct SeqList
{SLDataType* a;int size;	//存储有效数据个数int capacity;	//容量的大小
}SL;void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLCheckCapacity(SL* ps);
void SLPrint(SL* ps);//头插头删 尾插尾删
void SLPushBack(SL* ps,SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);void SLPopFront(SL* ps);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "SeqList.h"
#include <string.h>
#include <stdlib.h>void SLInit(SL* ps)		//顺序表初始化
{ps->a = (SLDataType*)malloc(sizeof(SLDataType) * 4); //创建四个int大小的空间if (ps->a == NULL)		//检查错误{perror("malloc failed");exit(-1);}ps->size = 0;ps->capacity = 4;
}void SLCheckCapacity(SL* ps)
{if ((ps->size) == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * (sizeof(SLDataType)));//创建一个临时变量,大小扩充到原来的两倍if (tmp == NULL){perror("malloc failed");exit(-1);}ps->a = tmp;		//原表赋值到新的地址ps->capacity *= 2;	//大小扩充到原来的两倍}
}void SLPushBack(SL* ps, SLDataType x)	//尾部插入数据
{void SLCheckCapacity(ps);ps->a[ps->size] = x;	//原表赋值ps->size++;				//赋值后有效数据+1
}void SLPopBack(SL* ps)		//尾部删除数据
{//温柔的检查//if (ps->size == 0)//{//	;//}//else//暴力检查(直接报错)assert(ps->size > 0);ps->size--;
}void SLPushFront(SL* ps, SLDataType x)
{SLCheckCapacity(ps);int end = ps->size - 1;	//从后往前挪动数据for (int i = end; i >= 0; i--){ps->a[i + 1] = ps->a[i];}//while (end >= 0)//{//	ps->a[end + 1] = ps->a[end];//	--end;//}ps->a[0] = x;ps->size++;}void SLDestroy(SL* ps)		//释放表
{free(ps->a);		//释放空间ps->a = NULL;		//指针置零ps->size=ps->capacity = 0;
}void SLPrint(SL* ps)		//打印表
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);			//打印表}printf("\n");
}void TestSeqList1()
{SL sl;SLInit(&sl);SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPushBack(&sl, 5);SLPrint(&sl);  //增加五个数后打印SLPopBack(&sl);//删除一个后打印SLPrint(&sl);SLPopBack(&sl);SLPopBack(&sl);//删除多个后打印查看报错再打印SLPrint(&sl);SLDestroy(&sl);
}void TestSeqList2()
{SL sl;SLInit(&sl);SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPushBack(&sl, 5);SLPrint(&sl);SLPushFront(&sl, 10);SLPushFront(&sl, 20);SLPushFront(&sl, 30);SLPushFront(&sl, 40);SLPushFront(&sl, 50);SLPrint(&sl);SLDestroy(&sl);
}int main()
{TestSeqList2();return 0;
}

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

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

相关文章

最新最全系列之Selenium:传入webdriver驱动的新方法 Service()函数;以前的executable_path报警告,即将弃用

传入webdriver驱动的新方法 Service()函数&#xff1b;以前的executable_path报警告&#xff0c;即将弃用 以前的方法 举例&#xff1a;webdriver.Chrome(executable_pathdriver_path)&#xff1b;看提示警告&#xff0c;提示该方法即将被弃用&#xff1b;如下图&#xff1a; …

mysql底层是如何存放数据的

总览 首先总的来说&#xff0c;分为四个层级&#xff0c;行页区段。行就是数据库里的一行数据。 但一次从磁盘读进内存的数据量是一页&#xff08;页是读写的单位&#xff0c;默认16KB一页&#xff09;&#xff0c;页分很多种类&#xff0c;例如数据页、溢出页、undo日志页。 …

linux驱动.之 网络udp应用层测试工具demon(一)

绑定vlan&#xff0c;网卡的demon&#xff0c;如果有多个网卡&#xff0c;多个vlan&#xff0c;网卡的ip设置成一致&#xff0c;那就不能只简单绑定ip来创建socket&#xff0c; 需要绑定网卡设备 客户端udp_client.c #include <stdio.h> #include <string.h> #inc…

工业领域的设备“监测”和“检测”有何区别?

在工业领域中&#xff0c;设备的监测和检测是关键的运维活动&#xff0c;它们在保障设备可靠性和生产效率方面发挥着重要作用。尽管这两个术语经常被人们混为一谈&#xff0c;但它们在含义和应用上存在一些关键区别。 "监测"与"检测"的概念 1. 监测&#…

使用wxPython和PyMuPDF合并PDF文档并自动复制到剪贴板

导语&#xff1a;处理大量的PDF文档可能会变得复杂和耗时。但是&#xff0c;使用Python编程和一些强大的库&#xff0c;如wxPython和PyMuPDF&#xff0c;可以使这个任务变得简单而高效。本文将详细解释一个示例代码&#xff0c;展示如何使用这些库来创建一个可以选择文件夹中的…

vue3插槽的使用方法和优缺点

插槽的使用方法 在Vue 3中&#xff0c;插槽&#xff08;slots&#xff09;是一种用于传递和分发组件内容的灵活机制。插槽可以用来定义组件内部的占位符&#xff0c;然后在父组件中填充具体内容。下面是Vue 3中使用插槽的基本方法&#xff1a; 默认插槽 <!-- ChildCompon…

C#学习相关系列之Linq常用方法---排序(一)

一、构建数据 public class Student_1{public int ID { get; set; }public string Name { get; set; }public int Chinese { get; set; }public int Math { get; set; }public int English { get; set; }public override string ToString(){return string.Format("ID:{0},…

PythonAppium自动化测试环境搭建

Python环境 在CMD中运行 pip install Appium-Python-Client Microsoft Windows [版本 10.0.19045.3693] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>pip install Appium-Python-Client Collecting Appium-Python-ClientDownloading Appium-Python-…

从零开始 通义千问大模型本地化到阿里云通义千问API调用

从零开始 通义千问大模型本地化到阿里云通义千问API调用 一、通义千问大模型介绍 何为“通义千问”&#xff1f; “通义千问大模型”是阿里云推出的一个超大规模的语言模型&#xff0c;具有强大的归纳和理解能力&#xff0c;可以处理各种自然语言处理任务&#xff0c;包括但…

springboot多环境配置

前言 在实际项目研发中&#xff0c;需要针对不同的运行环境&#xff0c;如开发环境、测试环境、生产环境等&#xff0c;每个运行环境的数据库…等配置都不相同&#xff0c;每次发布测试、更新生产都需要手动修改相关系统配置。这种方式特别麻烦&#xff0c;费时费力&#xff0…

参数传递方式

参数传递方式教材上大都说有两种&#xff0c;一种是值传递&#xff0c;另一种是指针传递。而后者本质上依然是值传递。 底层原理 对于值传递还是指针传递&#xff0c;传递的都是相应的值&#xff0c;只不过指针传递传递的是地址的副本&#xff0c;修改副本对原来数据没有任何…

DGL在异构图上进行消息传递

异构图是包含不同类型的节点和边的图。不同类型的节点和边常常具有不同类型的属性。这些属性旨在刻画每一种节点和边的特征。在使用图神经网络时&#xff0c;根据其复杂性&#xff0c; 可能需要使用不同维度的表示来对不同类型的节点和边进行建模。 异构图上的消息传递可以分为…

ProtoBuf的使用

目录 1.创建.proto文件 1.1文件规范 1.2添加注释 1.3指定proto3语法 1.4package声明符 1.5定义消息(message) 1.6定义消息字段 2.编译contacts.proto文件 3.序列化与反序列化的使用 1.创建.proto文件 1.1文件规范 • 创建.proto文件时&#xff0c;⽂件命名应该使用全…

利用互斥锁解决缓存击穿问题

核心思路&#xff1a;相较于原来从缓存中查询不到数据后直接查询数据库而言&#xff0c;现在的方案是 进行查询之后&#xff0c;如果从缓存没有查询到数据&#xff0c;则进行互斥锁的获取&#xff0c;获取互斥锁后&#xff0c;判断是否获得到了锁&#xff0c;如果没有获得到&am…

DNS如何在Windows NIC配置多个DNS服务器时完成DNS解析查询

使用多个 DNS 服务器 IP 配置 DNS 客户端会增加 DNS 基础结构的容错。所以建议给Windows客户端使用多个 DNS 服务器。 文章目录 什么是DNS&#xff1f;在 NIC 上配置单个 DNS 服务器时&#xff0c;DNS 客户端的解析过程在 NIC 上配置两个 DNS 服务器时&#xff0c;DNS 客户端的…

【Docker】从零开始:3.Docker运行原理

【Docker】从零开始&#xff1a;3.Docker运行原理 Docker 工作原理Docker与系统的关系Docker平台架构图解 Docker 工作原理 Docker与系统的关系 Docker 是一个 Client-Server 结构的系统&#xff0c;Docker 守尹进程运行在王机上&#xff0c; 然后通过 Socket 连接从各尸端坊…

Vue3-shallowRef 和 shallowReactive函数(浅层次的响应式)

Vue3-shallowRef 和 shallowReactive函数&#xff08;浅层次的响应式&#xff09; shallowRef函数 功能&#xff1a;只给基本数据类型添加响应式。如果是对象&#xff0c;则不会支持响应式&#xff0c;层成也不会创建Proxy对象。ref和shallowRef在基本数据类型上是没有区别的…

第1关:图的邻接表存储及求邻接点操作

任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;要求从文件输入顶点和边数据&#xff0c;包括顶点信息、边、权值等&#xff0c;编写程序实现以下功能。 1&#xff09;构造图G的邻接表和顶点集&#xff0c;即图的存储结构为邻接表。 …

手把手入门MO | 如何使用SeaTunnel将数据写入MatrixOne

1 概述 SeaTunnel 是一个分布式、高性能、易扩展的数据集成平台&#xff0c;专注于海量数据&#xff08;包括离线和实时数据&#xff09;同步和转化。MatrixOne 支持使用 SeaTunnel 从其他数据库同步数据&#xff0c;可以稳定高效地处理数百亿条数据。 本文档将介绍如何使用 …

SpringCloud原理-OpenFeign篇(二、OpenFeign包扫描和FeignClient的注册原理)

文章目录 前言正文一、从启动类开始二、EnableFeignClients 的源码分析三、Import FeignClientsRegistrar 的作用四、FeignClientsRegistrar#registerFeignClients(...)五、饥饿注册&懒注册 FeignClientsRegistrar#registerFeignClient(...)六、通过Holder真正注册beanDefi…