数据结构(初阶2.顺序表)

news2024/12/26 11:46:39

文章目录

一、线性表

二、顺序表

 2.1 概念和结构

 2.2 分类

    2.2.1 静态顺序表

    2.2.2 动态顺序表

 2.3动态顺序表的实现

  1.SeqList.h

  2.SeqList.c

    打印顺序表

    初始化

    销毁

    增容

    尾插

    头插

    在指定位置之前插入数据

    尾删

    头删

    在指定位置删除数据

  3.test.c


一、线性表

线性表( linear list )是n个具有相同特性的数据元素的有限序列。
线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。
  • 逻辑结构(认为想象出来的数据的组织形式):都是线性的
  • 物理结构(数据在内存上的存储形式):不一定是线性的

二、顺序表

2.1 概念和结构

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤               数组存储。
那么数组和顺序表的区别是什么?
下面可以进行一个很形象的类比:
  • 顺序表是对数组进行封装:结构体
  • 定义已经知道数组的大小:    int arr【3】= {1,2,3};
  • 定义未知道数组的大小:        int*arr;

2.2 分类

2.2.1 静态顺序表

上图中可以发现我们重新定义了 typedef int SLDataType,为什么?

比如当我们在测试代码中有 100000行代码,1000+会定义整型变量 int,当要把这 1000+ 的代码部分改成 char 类型时,如果逐个将这些代码找出一句句修改会非常麻烦而且工作量巨大;              而当 typedef int SLDataType之后 ,我们只需将其改成 typedef char SLDataType ,遍能一键替换为 char 或者想要修改的位置。

2.2.2 动态顺序表

2.3动态顺序表的实现

(注意:1.当我们每实现一个方法之后须测试一下,切记写完所有方法才测试,避免出现差错;

             2.在调用过程中分清传值和传址的区别;

                传值:形参是实参的值的拷贝,实参和形参指向的是两块不同的地址,但保存的数据是                             一样的

                传址:形参指向的是实参指向的地址) 

1.SeqList.h

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

//定义动态顺序表结构
typedef int SLDatatype;

typedef struct SeqList {
	SLDatatype* arr;
	int capacity; //空间大小
	int size;     //有效数据个数
}SL;

//typedef struct SeqList SL;

//初始化
void SLInit(SL* ps);
//销毁
void SLDestroy(SL* ps);

//打印顺序表
void SLPrint(SL* ps);

//插入数据
void SLPushBack(SL* ps, SLDatatype x);
void SLPushFront(SL* ps, SLDatatype x);

//删除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);

//在指定位置之前插入数据
void SLInsert(SL* ps, SLDatatype x, int pos);
//删除指定位置的数据
void SLErase(SL* ps, int pos);

 

2.SeqList.c 

  • 打印顺序表
void SLPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}
  • 初始化  
void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}
  • 销毁
void SLDestory(SL* ps)
{
	if (ps->arr != NULL)
	{
		free(ps->arr);

	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}
  •  增容

当size == capacity 时,说明顺序表满了,空间不足,先增容,再插入;

增容一般是成倍数的增加(增容的操作本身就有一定的程序性能的消耗,若频繁的增容会导致程序效率底下),所以 ”一次增容一个就没有空间浪费“ 这种说法是错误的。 

增容分两种情况: 1.连续空间足够,直接扩容 

                              2.连续空间不够,1)重新找一块地址,分配足够的内存 

                                                          2)拷贝数据到新的地址 

                                                          3)销毁就地址 

 

void SLCheckCapacity(SL* ps)
{
	//判断空间是否充足
	if (ps->size = ps->capacity)
	{
		//增容//0*2 = 0
		//若capacity为0,给个默认值,否则×2倍
		int newCapacity = ps->arr == 0 ? 4 : 2 * ps->capacity;
		SLDatatype* tmp = (SLDatatype*)realloc(ps->arr, newCapacity * sizeof(SLDatatype));
		if (tmp = NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
}
  • 尾插 

空间充足:将数据插入 size 指向的位置,size++;

void SLPushBack(SL* ps, SLDatatype x)
{
	assert(ps);//等价于assert(ps != NULL)


	SLCheckCapacity(ps);
	ps->arr[ps->size] = x;
	ps->size++;
}
  • 头插
void SLPushFront(SL* ps, SLDatatype x)
{
	assert(ps);

	//判断空间是否足够
	SLCheckCapacity(ps);

	//整体数据往后移一位,从后往前移
	for (int i = ps->size;i >0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}

	//将数据插入下标为0的位置
	ps->arr[0] = x;
}
  • 在指定位置之前插入数据
void SLInsert(SL* ps, SLDatatype x, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	//       头插          尾插 

	//pos及以后的数据整体向后移动一位,从后往前移,与头插的方法类似
	for (int i =ps->size ; i>pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}

	//将数据插入下标为pos的位置
	ps->arr[pos] = x;
	ps->size++; //不要忘记这一步
}
  • 尾删
void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);//顺序表为空,不可删除

	ps->size--;
}
  • 头删
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);//顺序表为空,不可删除

	//数据整体向前移动一位,从前往后移
	for (int i = 0; i < ps->size - 1;i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;

}
  • 在指定位置删除数据
void SLDelete(SL* ps, int pos)
{
	assert(ps);
	assert(ps->size);//顺序表为空,不可删除
	assert(pos >= 0 && pos <= ps->size);
	//       头删          尾删 

	//pos及以后的数据整体向前移动一位,从前往后移,与SLInsert的方法类似
	for (int i = pos; i < ps->size; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

 3.test.c

#include "SeqList.h"

void SLtest01()
{
	SL s;
	SLInit(&s);

	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 10);
	SLPushBack(&s, 11);
	SLPushBack(&s, 12);
	printf("尾插后的数据:");
	SLPrint(&s);

	printf("头插后的数据:");
	SLPushFront(&s, 4);
	SLPrint(&s);

	printf("在下标为2的位置插入9后的数据:");
	SLInsert(&s, 9, 2);
	SLPrint(&s);

	printf("尾删后的数据:");
	SLPopBack(&s);
	SLPrint(&s);

	printf("头插后的数据:");
	SLPopFront(&s);
	SLPrint(&s);

	printf("删除下标为3的数据:");
	SLDelete(&s, 3);
	SLPrint(&s);

	SLDestroy(&s);
}

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

未完待续~~

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

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

相关文章

Ubuntu 24.04 LTS (Linux) 安装二维码生成工具 QRencode 二维码生成和识别

1 Ubuntu 安装 sudo apt update sudo apt-get install qrencode 2 查看版本 qrencode -V 3 生成二维码 qrencode -o test.png http://www.baidu.com 可以下载test.png图片,用手机浏览器扫描下看(⊙﹏⊙)

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;是一种新兴的以太网技术&#xff0c;它通过一对双绞线实现数据传输&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技术&#xff0c;为终端设备提供电力供…

SSE 和 WebSocket 的区别与选择指南

在构建现代网络应用时&#xff0c;实时通信技术扮演着至关重要的角色。本文将深入讨论 Server-Sent Events (SSE) 和 WebSocket ——两种主要的实时通信技术&#xff0c;对比它们的实现方式、优势和具体用途&#xff0c;以帮助开发人员根据自身项目需求选择合适的技术。 何为 …

绝区捌--将GPT幻觉的发生率从20%以上降低到2%以下

总结&#xff1a;我们没有使用微调&#xff0c;而是结合使用提示链和预处理/后处理来将幻觉发生率降低一个数量级&#xff0c;但这确实需要对 OpenAI 进行 3-4 倍的调用。还有很大的改进空间&#xff01; 使用 GPT 等大型语言模型面临的最大挑战之一是它们倾向于捏造信息。 这…

328. 奇偶链表

https://leetcode.cn/problems/odd-even-linked-list/https://leetcode.cn/problems/odd-even-linked-list/ 解题思路&#xff1a; 把第一个和第二个节点分别作为奇数、偶数的头节点&#xff0c;当遇到奇节点&#xff0c;删除&#xff0c;并插入到奇数头节点后&#xff0c;这样…

【深度学习基础】环境搭建 Linux报错bash: conda: command not found...

目录 一、 问题描述二、 解决方法1. 在.bashrc文件中添加环境变量2. 卸载重装anconda 三、总结 一、 问题描述 在linux环境下安装anaconda时候报错&#xff1a;bash: conda: command not found… 二、 解决方法 1. 在.bashrc文件中添加环境变量 参考链接&#xff1a;【解决】…

HTML语言常见标签

语法 HEAD部分的HTML标签 1 标题标签 <title>标题内容</title> 2 段落标签 <meta charset"utf-8"/> BODY部分的HTML标签 1标题标签&#xff08;独占一行&#xff09;<h1>标题内容</h1> 2段落标签&#xff08;独占一行&#xff09;…

AI论文作图——如何表示模型参数冻结状态

一、LOGO &#x1f525; win10win11 ❄️ win10win11 二、注意事项&#xff1a; 根据电脑系统&#xff0c;选择对应的版本。 参考&#xff1a; 【AI论文作图】如何表示模型参数冻结状态&#xff1f;

51单片机-第二节-数码管

一、数码管介绍&#xff1a; 1.什么是数码管&#xff1f; 多个LED组合成8字显示器。 2.一位数码管的引脚&#xff08;只有一个8&#xff09;&#xff1a; 数码管的引脚为1-10&#xff0c;其中公共极为3,8&#xff0c;其余八位分别对应一个二极管&#xff0c;如下图&#xff…

第一个基于FISCOBCOS的前后端项目(发行转账)

本文旨在介绍一个简单的基于fiscobcos的前后端网站应用。Springbootjs前后端不分离。 所使用到的合约也是一个最基本的。首先您需要知道的是完整项目分为三部分&#xff0c;1是区块链平台webase搭建&#xff08;此项目使用节点前置webase-front即可&#xff09;&#xff0c;2是…

论文阅读2-《Dynamic Multimodal Fusion》

摘要 &#xff08;DynMM&#xff09;&#xff0c;一种新的方法&#xff0c;自适应融合多模态数据和 d在推理过程中生成依赖于数据的前向路径。为此&#xff0c;我们提出了一种门控功能来提供基于多模态特征和一个的模态级或融合级决策提高计算效率的源感知损失函数。 细节 模…

Java技术栈总结:JVM虚拟机篇

一、Java的四种引用类型 1、强引用 最常见的引用&#xff0c;类似Object obj new Object()、String str “hello”。如果一个对象具有强引用&#xff0c;垃圾回收器绝对不会回收它。即使抛出“OutOfMemoryError”错误&#xff0c;程序终止&#xff0c;也不会随意回收具有强引…

【鸿蒙学习笔记】使用动画

官方文档&#xff1a;使用动画 目录标题 属性动画&#xff1a;通用属性发生改变时而产生的属性渐变效果animationanimateTo自定义属性动画 AnimatableExtend 转场动画&#xff1a;是页面或组件的切换动画 , 显示/隐藏 切换时的动画出现/消失转场&#xff1a;实现一个组件出现或…

数据可视化之智慧农业的窗口与引擎

在科技日新月异的今天,农业作为国民经济的基础产业,正逐步向智能化、数字化转型。农业为主题的数据可视化大屏看板,作为这一转型过程中的重要工具,不仅为农业管理者提供了全面、实时的农田信息,还促进了农业资源的优化配置和农业生产效率的提升。本文将深入探讨农业数据可…

Linux_网络编程_TCP

服务器客户端模型&#xff1a; client / server brow / ser b / s http p2p socket——tcp 1、模式 C/S 模式 》服务器/客户端模型 server :socket()-->bind()--->listen()-->accept()-->recv()-->close()client :socket()-->conn…

Mock 测试技术

一、Mock 类框架的使用场景 在实际软件开发中&#xff0c;要进行测试的方法存在外部依赖&#xff08;如 db&#xff0c;redis&#xff0c;第三方接口调用等&#xff09;&#xff0c;这些外部依赖可能存在各种问题&#xff0c;例如不稳定、缺乏数据、难以模拟等等&#xff0c;所…

Python29 Tensorflow的基本知识和使用

1. TensorFlow TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google Brain 团队开发。它用于数据流图的计算&#xff0c;尤其擅长深度学习任务。在 TensorFlow 中&#xff0c;数据流图&#xff08;Data Flow Graph&#xff09;是其核心概念之一&#xff0c;它定义了计算…

(图文详解)小程序AppID申请以及在Hbuilderx中运行

今天小编给大家带来了如何去申请APPID&#xff0c;如果你是小程序的开发者&#xff0c;就必须要这个id。 申请步骤 到小程序注册页面&#xff0c;注册一个小程序账号 微信公众平台 填完信息后提交注册 会在邮箱收到 链接激活账号 确认。邮箱打开链接后&#xff0c;会输入实…

宜春旅游集散中心展厅OLED透明屏方案设计

一、项目概述 为提升宜春旅游集散中心展厅的现代化展示水平&#xff0c;增强游客的参观体验&#xff0c;我们计划在展厅的核心区域引入OLED透明屏技术。该方案旨在通过高科技的视觉呈现方式&#xff0c;将展品信息以虚拟与现实相结合的方式展现&#xff0c;打造出一个既具科技感…

Junior.Crypt.2024 CTF Web方向 题解WirteUp 全

Buy a cat 题目描述&#xff1a;Buy a cat 开题 第一思路是抓包改包 Very Secure App 题目描述&#xff1a;All secrets become clear 开题 乱输一个密码就登陆成功了&#xff08;不是弱口令&#xff09; 但是回显Your role is: user 但是有jwt&#xff01;&#xff01;&a…