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

不定长顺序表

一.不定长顺序表的结构:

typedef struct DSQList{
int* elem;//动态内存的地址
int length;//有效数据的个数
int listsize;//总容量
}DSQList,*DPSQList;

很明显,为了能实现扩容(否则如何实现再次判满呢?),我们必须要在定长顺序表的基础上增加一个总容量;结构示意图如下:

image-20230601214730031.png


二.不定长顺序表的实现(重点)

//初始化
void InitSqlist(DPSQList ps)
{assert(ps != NULL);if (ps == NULL)return;ps->elem = (int*)malloc(INIT_SIZE * sizeof(int));ps->length = 0;ps->listsize = INIT_SIZE;
}
static bool IsFull(DPSQList ps)
{return ps->length == ps->listsize;
}static bool Inc(DPSQList ps)
{ps->elem = (int*)realloc(ps->elem, ps->listsize * 2 * sizeof(int));assert(ps->elem != NULL);ps->listsize *= 2;//ps->length;return true;
}//插入数据,在ps顺序表的pos位置插入val;
bool Insert(DPSQList ps, int pos, int val)
{assert(ps != NULL);if (ps == NULL)return false;if (pos<0 || pos>ps->length){return false;}if (IsFull(ps)){Inc(ps);}//把数据往后移for (int i = ps->length - 1; i >= pos; i--){ps->elem[i + 1] = ps->elem[i];}//插入新数据ps->elem[pos] = val;//有效数据个数++ps->length++;return true;
}//判空
bool IsEmpty(DPSQList ps)
{return ps->length == 0;
}//在ps中查找第一个key值,找到返回下标,没有找到返回-1;
int Search(DPSQList ps, int key)
{for (int i = 0; i < ps->length; i++){if (key == ps->elem[i])return i;}return -1;
}//删除pos位置的值
bool DelPos(DPSQList ps, int pos)
{assert(ps != NULL);if (ps == NULL)return false;if (pos < 0 || pos >= ps->length){return false;}//后面的数据前移for (int i = pos; i < ps->length - 1; i++){ps->elem[i] = ps->elem[i + 1];}
}

三.顺序表总结

顺序表的特点:

1.插入数据的时间复杂度是O(n),如果是尾插时间复杂度是O(1);

2.删除数据的时间复杂度是O(n),如果是尾删时间复杂度是O(1);

3.通过下标访问数据时间复杂度是O(1);

顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素; 存储密度大(高),每个结点只存储数据元素(对比链表);

随机访问:顺序表是一种支持随机存取的存储结构,根据起始地址加上元素的序号,可以在O(1)时间内找到指定的元素,这就是随机存取的概念;

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

相关文章:

  • 5.网络编程-socker(golang版)
  • 网格矢量如何计算莫兰指数
  • 《containerd原理剖析与实战》大模型时代下如何学习云原生
  • 【实用工具】使用飞书机器人监控工程日志
  • NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程
  • 【leetcode面试经典150题】2.移除元素(C++)
  • 实现几何对象按照一定距离向外缓冲
  • 现代深度学习模型和技术
  • go的orm框架-Gorm
  • 嵌入式开发学习---(部分)数据结构(无代码)
  • ChatGPT 之联盟营销
  • 1.k8s简介
  • go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案
  • Vaadin框架是如何处理前后端交互的?列举几个Vaadin中常用的UI组件,并描述它们的作用。如何使用Vaadin的布局管理器来构建复杂的用户界面?
  • 动态属性的响应式问题和行内编辑的问题
  • 微信小程序第六次课(模块化和绑定事件)
  • 【Unity添加远程桌面】使用Unity账号远程控制N台电脑
  • maven的settings.xml、pom.xml配置文件
  • 使用MQTT.fx接入新版ONENet(24.4.8)
  • Selenium 自动化遇见 shadow-root 元素怎么处理?
  • 软件系统质量属性_2.面向架构评估的质量属性
  • 设计模式:抽象工厂
  • 【环境搭建】ubuntu工作站搭建全流程(显卡4090)
  • 蓝桥杯每日一题:有序分数(递归)
  • SpringBoot学习之Kibana下载安装和启动(Mac版)(三十二)
  • Mac下Docker Desktop starting的解决方法
  • Leetcode面试经典150_Q80删除有序数组中的重复项 II
  • android 使用ollvm混淆so
  • Swift:在 Win10 上编程入门
  • Linux多进程通信(4)——消息队列从入门到实战!