当前位置: 首页 > news >正文

2.数据结构 顺序表(自留笔记)

文章目录

  • 一.静态顺序表:长度固定
  • 二.动态顺序表
    • ==1.下面证明原地扩容和异地扩容代码如下:==
    • ==2.下面是写一段Print,打印数字看看:==
    • ==3.头插==
    • ==4.尾删==
    • ==5.头删==
    • ==6.越界一定会报错吗==
    • ==7.下标插入==
    • ==8.下标删除==
    • ==9.查找数字==
    • ==10.应用:利用顺序表写一个菜单==

顺序表就是数组,特殊要求:顺序表只能从头开始连续存储,分为静态存储和动态存储

一.静态顺序表:长度固定

在这里插入图片描述
里面是静态数组,size表示存的多少个数据。
弊端:不知道需要多少,N给小了不够用,N给大了浪费。

二.动态顺序表

在这里插入图片描述
尾插法,size++

扩容时用到realloc
在这里插入图片描述

区分realloc原地扩容和异地扩容
原地扩容返回的是和原来一样的地址
异地扩容返回的是和原来不同的地址,并且把原来的空间free掉

http://t.csdnimg.cn/CKsJs

在这里插入图片描述

先用malloc开辟空间。
注意:在使用malloc函数之前我们一定要计算字节数,malloc开辟的是用户所需求的字节数大小的空间。

写个程序通过地址变化判断是原地扩还是异地扩时
在这里插入图片描述

1.下面证明原地扩容和异地扩容代码如下:

❗SeqList.h如下:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)
typedef int SLDataType;//定义顺序表
typedef struct SeqList
{//定义指针SLDataType* a;//记录有效数据个数int size;//记录空间大小int capacity;}SL;//初始化函数
void SLInit(SL* ps1);
void SLDestroy(SL* ps1);
void SLCheckCapacity(SL* ps1);//写一个公共逻辑
//尾插
void SLPushBack(SL* ps1, SLDataType x);

❗SeqList.c如下:

#include"SeqList1.h"
void SLInit(SL* ps1)
{assert(ps1);ps1->a = NULL;ps1->size = 0;ps1->capacity = 0;
}void SLDestroy(SL* ps1)
{assert(ps1);if (ps1->a!=NULL){free(ps1->a);ps1->a = NULL;ps1->size = 0;ps1->capacity = 0;}
}void SLCheckCapacity(SL* ps1)//写一个公共逻辑
{assert(ps1);if (ps1->size == ps1->capacity){int newCapacity = ps1->capacity == 0 ? 4 : ps1->capacity * 2;//如果ps1->capacity == 0为真则newCapacity=4,如果为假,则newCapacity=ps1->capacity*2SLDataType* tmp = (SLDataType*)realloc(ps1->a, sizeof(SLDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");return;}ps1->a = tmp;ps1->capacity = newCapacity;}
}
void SLPushBack(SL* ps1, SLDataType x)
{SLCheckCapacity(ps1);//调用ps1->a[ps1->size] = x;ps1->size++;}

原地扩容(Test.c):
在这里插入图片描述
异地扩容(Test.c):
在这里插入图片描述

2.下面是写一段Print,打印数字看看:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.头插

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
打印数字查看尾插头插区别
在这里插入图片描述
头插效率高吗?
头插的时间复杂度是O(n),如果头插n个数据的话,那么时间复杂度是O(n^2),如果是尾插n个数据,则尾插的时间复杂度是O(n),尾插效率更高。

4.尾删

在这里插入图片描述
不用释放后面的空间
可以看到第三行比第二行尾巴后面少了9
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

因为尾删容易导致删空了的数据表还继续尾删的情况,所以要进行检查。
方法一空了直接return
方法二暴力检查,空了直接报错
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.头删

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.越界一定会报错吗

不一定,在C语言越界读取中不会,而越界写可能会报错,如:
在这里插入图片描述

7.下标插入

这里的pos是下标
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
注意:
在这里插入图片描述

最后一行那里显示了报错的原因出处,我们找到出处,发现是assert的警告
在这里插入图片描述

8.下标删除

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

9.查找数字

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

10.应用:利用顺序表写一个菜单

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/287916.html

相关文章:

  • 将python打包成exe文件
  • 大数据处理,Pandas与SQL高效读写大型数据集
  • 【2024年5月备考新增】《软考高项论文专题 (2)论文背景(合集)》
  • Mysql复习1--理论基础+操作实践--更新中
  • 微信小程序打卡定位实现方案
  • 小迪安全23WEB 攻防-Python 考点CTF 与 CMS-SSTI 模版注入PYC 反编译
  • 计算机毕业设计 基于SpringBoot的律师事务所案件管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 如何使用宝塔面板配置Nginx反向代理WebSocket(wss)
  • vulhub之redis篇
  • Lua简介和应用场景介绍
  • 【手写数据库toadb】10 开发数据库内核开发阶段-数据库模型
  • 02-Redis持久化、主从与哨兵架构详解
  • 无刷电机篇(一)直流无刷电机(BLDC)介绍
  • 【GitHub项目推荐--不错的Flutter项目】【转载】
  • Unity UnityWebRequest 向php后端上传图片文件
  • Vscode 顶部Menu(菜单)栏消失如何恢复
  • Jenkins相关
  • 禅道的安装以及使用
  • 马尔可夫预测(Python)
  • 双向队列的创建队首与队尾的操作deque()
  • 一、MongoDB、express的安装和基本使用
  • 被困住了——如何从层级结构中获取子集
  • leetcode1237. 找出给定方程的正整数解
  • sqlmap使用教程(6)-注入技术拓展
  • 苹果Find My市场需求火爆,伦茨科技ST17H6x芯片助力客户量产
  • 3DMAX初级小白班第一课:菜单栏介绍
  • Windows中Zookeeper与kafka的安装配置
  • QT 官方例程阅读: XML Patterns 相关
  • 基于SpringBoot IP黑白名单的实现
  • Redis客户端之Redisson(二)Redisson分布式锁