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

数据结构基本知识

一、什么是数据结构
1.1、组织存储数据

        ---------》内存(存储)

1.2、研究目的
  • 如何存储数据(变量,数组....)
  • 程序=数据结构+算法
1.3、常见保存数据的方法
  1. 数组:保存自己的数据
  2. 指针:是间接访问已经存在的空间------------》操作数据,并不能销毁别人的数据
  3. 指针数组:并不保存数据,也是指向那个空间,并不能保存数组
  4. 二维数组:保存数据的
  5. 数据库也其实数据结构,实质上是对复杂数据的一种封装
二、数据与数据之间的关系
2.1、数据的逻辑结构

        数据元素与元素之间的关系

  1. 集合:关系平等
  2. 线性:元素之间一对一的关系(表,数组,链表)
  3. 有当前数据出发,向后最多能找一个后继,先前找最多只能有一个前驱
  4. 树形:元素之间一对多(二叉树),从当前找,后继有多个,前驱只有1个
  5. 图型结构:元素之间多对多的关系(网状结构)
  6. 后继有多个,前驱有多个
2.2、数据的物理结构

1、顺序存储:采用一段连续的内存空间保存元素。
优点:空间连续,访问方便缺点:插入删除需要移动大量的元素需要预分配内存空间容易造成存储空间碎片
2、链式存储:采用一组非连续的内存空间保存元秦
缺点:访问元秦效率低优点:插入和删除数据方便不需要预分配内存
3、索引存储:通过关键字构建索引表,通过索引表来来找到数据的存储位置

索引:维护索引表,关键字和其对应得地址

4、散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对应关系从而实现查找的存储方式

散列:选取关键字,经过计算,算出对应位置,下次只需要,拿着这个名字,经过计算,就找到位置

2.3、数组与链表区别
2.3.1、数组 线性顺序存储结构

1、空间连续

2、访问数据方便(O(1))

3、数据插入、删除复杂,需要移动大量数据(O(n))

4、预分配内存空间

5、容易产生内存碎片

1、按照指定字节对齐

2、注意结构成员分布

2.3.2、链表 线性链式结构

1、空间不连续

2、访问数据不方便(O(n))

3、数据的插入、删除方便,时间复杂度(O(1))

4、不需要预分配空间,只需申请一个新的节点插入进去即可

5、能够利用内存空间中比较小的碎片

注意:说数据属于那种关系的时候,两种都说。

2.4、物理结构

1、线性结构:

顺序表:-----》数组

链式表:-----》链表

2、链表:

单向链表:

有头链表:有一个头结点进行操作,只不过没有数据

无头链表:没有上述的东西

3、封装

--------》高内聚、低耦合

低耦合,关联程度低

高内聚,一个函数干一件事

面向过程的编程思想:第一步干什么,第二步3干什么....

面向对象的编程思想,封装性比较好

用什么来做什么

冰箱----------------------》

属性:特性(变量)

行为:装东西(函数)

大象-----------------------》

三、链表的操作
1、创建头结
Link_t *Create_link()
{Link_t *link = malloc(sizeof(link));if(NULL == link){perror("create error");return NULL;}link->clen = 0;link->phead = NULL;return link;
}
2、头插
int push_link_join(Link_t *plink,DATATYPE data)
{Link_Node_t *pnode = malloc(sizeof(Link_Node_t));if(NULL == pnode){perror("fail node");return -1;}pnode->data = data;pnode->pnext = NULL;pnode->pnext = plink->phead;plink->phead = pnode;plink->clen++;return 0;
}
3、尾插
int tail_insert(Link_t *plink,DATATYPE data)
{Link_Node_t *pnode = malloc(sizeof(Link_Node_t));if(NULL == pnode){perror("fail node");return -1;}pnode->data = data;pnode->pnext = NULL;Link_Node_t *p;p = plink->phead;if(p == NULL){p = pnode;}while(p->pnext){p = p->pnext;}pnode->data = data;pnode->pnext = NULL;p->pnext = pnode;plink->clen++;printf("%d\n",pnode->data);
}
4、遍历
int travel_link(Link_t *plink)
{int i = 0;Link_Node_t *p ;p = plink->phead;while(p != NULL){printf("num = %d,data = %d\n",i,p->data);++i;p = p->pnext;}
}
5、头删
int delete_link_first(Link_t *plink)
{Link_Node_t *pnode;if(plink->phead == NULL){return 0;}else{pnode = plink->phead;plink->phead = pnode->pnext;free(pnode);plink->clen--;}return 0;
}
6、尾删 
int delete_link_tail(Link_t *plink)
{Link_Node_t *pnode;if(plink->phead == NULL){return 0;}else if(plink->clen == 1){delete_link_first(plink);}else{pnode = plink->phead;while(pnode->pnext->pnext != NULL){pnode = pnode->pnext;}free(pnode->pnext);pnode->pnext = NULL;}
}
7、查对应结点
Link_Node_t *select_link(Link_t *link,DATATYPE data)
{Link_Node_t *pnode  = link->phead;while(pnode->data != data){pnode = pnode->pnext;}printf("num = %d\n",pnode->data);return pnode;
}
8、改
Link_Node_t *alter_link(Link_t *link,DATATYPE data,DATATYPE wishdata)
{Link_Node_t *pnode = select_link(link,data);pnode->data  = wishdata;printf("wishdata = %d\n",pnode->data);return pnode;
}
9、销毁
int destory_link(Link_t *link)
{Link_Node_t *pnode = link->phead;if(pnode == NULL){free(link);return 0;}else{while(link->clen != 0){delete_link_first(link);}return 0;}free(link);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 随机森林的知识博客:原理与应用
  • pytorch正向传播没问题,loss.backward()使定义的神经网络中权重参数变为nan
  • ELK学习笔记(一)——使用K8S部署ElasticSearch8.15.0集群
  • 目标检测-YOLOv4
  • 代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)
  • box64 安装
  • 微信小程序实践案例
  • IP/TCP/UDP协议的关键知识点
  • C++ | 单例设计模式(懒汉式单例模式源码|饿汉式单例模式)
  • EMC测试
  • Android 开发避坑经验第三篇:RecyclerView 高效使用与常见问题解决
  • 使用 `readResolve` 防止序列化破坏单例模式
  • 【python】python指南(三):使用正则表达式re提取文本中的http链接
  • 11. GIS三维建模工程师岗位职责、技术要求和常见面试题
  • 军事目标无人机视角检测数据集 3500张 坦克 带标注voc
  • 【技术性】Search知识
  • CAP 一致性协议及应用解析
  • golang中接口赋值与方法集
  • interface和setter,getter
  • Linux中的硬链接与软链接
  • tab.js分享及浏览器兼容性问题汇总
  • 百度小程序遇到的问题
  • 给github项目添加CI badge
  • 基于webpack 的 vue 多页架构
  • 前端之Sass/Scss实战笔记
  • 入口文件开始,分析Vue源码实现
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 因为阿里,他们成了“杭漂”
  • 原生js练习题---第五课
  • 正则表达式
  • gunicorn工作原理
  • postgresql行列转换函数
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​2021半年盘点,不想你错过的重磅新书
  • # Java NIO(一)FileChannel
  • # 计算机视觉入门
  • #pragma data_seg 共享数据区(转)
  • #pragma once与条件编译
  • (09)Hive——CTE 公共表达式
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (c语言)strcpy函数用法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (二)hibernate配置管理
  • (过滤器)Filter和(监听器)listener
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (转)负载均衡,回话保持,cookie
  • (转)人的集合论——移山之道
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET 8 跨平台高性能边缘采集网关
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 表达式计算:Expression Evaluator
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...