数据结构基本知识

news2024/9/22 21:24:54
一、什么是数据结构
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);
}

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

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

相关文章

【笔试练习】深信服校园招聘c/c 软件开发H卷

题目链接 一、填空题 如图所示,平面上有两条平行的线段,上面的线段有A0~A3 4个点,下面的线段有B0到B5 6个点,现在需要把所有的点都连接起来,有如下约束: 每个端点,都至少有一条到另一平行线上端…

仿微信聊天系统开发功能架构分析

仿微信聊天系统是一种旨在模仿微信核心聊天功能的应用或软件,它允许用户通过即时通讯进行交流。该系统通常由客户端、服务器端和数据库组成,以支持用户间的实时消息传送。以下是对仿微信聊天系统的一个概述: 一、系统架构 客户端 用户界面&…

【面试05】PID控制算法

一、 PID算法简介 PID(Proportional-Integral-Derivative)控制算法是一种经典的反馈控制方法,广泛应用于自动控制系统,例如温度控制、速度控制、位置控制等。 PID控制算法的核心包含三个部分:比例项(P&…

一键掌控园区运营,数字化管理平台如何实现?

在当今数字化时代,高效的管理是企业成功的关键。对于各类园区而言,如何实现一键掌控园区运营,成为了提升竞争力的重要课题。幸运的是,数字化管理平台的出现如同一把智慧钥匙,为实现园区运营提供了完美的解决方案。 数字…

<Rust>egui学习之小部件(九):如何在窗口中添加下拉列表combobox部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第九篇博…

系统编程-数据库

数据库 目录 数据库 引入 1、先安装数据库 2、数据库设置密码 3、数据库的进入和退出(前提 你的密码更改过了) 数据库的基本操作 1、显示所有的数据库 2、创建数据库 3、删除数据库 4、选择数据库 在数据库中对表进行操作 1、查看当前数据库中的表 2、在数据库中…

Spring框架——springweb(一篇包会)

目录 一、Springweb概述 1.SpringWeb特点 2.SpringWeb组件 3.SpringWeb运行流程 二、搭建Springweb 1.导入框架所需的包 2.配置 DispatcherServlet 3.开启SpringWeb注解 4.处理器类搭建 5.请求处理 (1)接收请求RequestMapping (2&…

大疆上云API基于源码部署

文章目录 大疆上云API基于源码部署1、学习官网2、环境准备注意事项3、注册成为DJI开发者4、下载前后端运行所需要的包/依赖前端依赖下载后端所需要的Maven依赖包 用到的软件可以在这里下载5、MySQL数据库安装安装MySQL启动MySQL服务在IDEA中配置MySQL的连接信息 6、Redis的安装…

Visual Studio Code大大提升工作效率小技巧~~~

Visual Studio Code ( VS Code )是一个知名且评价很高的代码编辑器,具有大量功能和扩展以增强开发体验。使用 VS Code 的主要好处之一是它的灵活性,允许开发人员根据他们的特定需求对其进行自定义。 此外,VS Code 轻巧…

(十五)SpringCloudAlibaba-Sentinel持久化到Nacos

前言 在前面我们已经将Sentinel配置的规则持久化到系统的文件中。本章节我们将Sentinel持久化到Nacos中; 传送门(Sentinel数据持久化到文件)https://blog.csdn.net/weixin_45876411/article/details/140742963 默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但…

JNPF低代码:可视化如何赋能企业的转型之路

在数字化转型的浪潮中,企业面临着前所未有的挑战与机遇。传统的软件开发方式往往耗时长、成本高,且难以快速适应市场变化。低代码开发平台的出现,为企业的数字化转型提供了新的思路和工具。其中,JNPF低代码平台以其独特的可视化特…

LDR6023:革新手机转接器体验,快充与OTG并存的科技杰作

在智能设备日益普及的今天,手机已经成为我们日常生活中不可或缺的一部分。然而,随着功能的不断增加,手机对于电力和数据传输的需求也日益提升。为了应对这一挑战,深圳市乐得瑞科技有限公司凭借其深厚的科技积累和创新精神&#xf…

嵌入式系统------ARM

目录 一.c语言回顾 1.特殊符号 (1)const (2)static (3)extern 2.内存的结构 (1)kernel:内核 (2)栈区 (3)堆区 &#xff08…

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListMap

ConcurrentMap ConcurrentMap 是 Java 并发包中提供的一个接口,它继承了 java.util.Map 接口,专门用于支持高并发环境下的线程安全操作。ConcurrentMap 提供了一系列线程安全的方法,旨在解决在多线程环境下使用普通 Map 类型(如 …

用ChatGPT三分钟写一个完美的PPT,彻底告别繁琐的制作过程

用AI或ChatGPT来制作PPT的方式多得很! 下面就用超级简单的语言,一步步教你怎么搞定,三分钟内保准搞定你的PPT。 所有需要的方法和工具都在这里! 很简单,只要你输入一个标题,AI就能完成PPT的制作。 如果…

文件 fd

目录 1. 建立共识原理2. 回忆 C 文件接口2.1 当前工作路径2.2 w / a 方式写入2.3 默认打开的三个文件流 3. 认识文件系统调用3.1 O_WRONLY|O_CREAT 写时创建3.2 O_TRUNC 截断长度(也即全覆盖式写入)3.3 O_APPEND 追加 4. 浅谈文件访问的本质4.1 简证 1. …

高级算法设计与分析 学习笔记 2 希尔排序 线性时间内的排序——计数排序,基数排序,桶排序

希尔排序(比较排序) 要选定一个步长(比如4),那么0,4,8……它们是一组,1,5,9……他们是一组。分组排完之后再换成2步长,最后改成1,就行…

牛心包瓣类医用生物瓣膜厚度无损检测

关键字:牛心包瓣膜,牛心包瓣叶,生物瓣膜,生物心脏膜,测厚仪,瓣膜生产,瓣膜检测设备, 牛心包瓣叶的厚度和轮廓所需的高精度取决于多个因素,包括瓣膜的制造标准、临床应用需…

百度飞将 paddle ,实现贝叶斯神经网络 bayesue neure network bnn,aistudio公开项目 复现效果不好

论文复现赛:贝叶斯神经网络 - 飞桨AI Studio星河社区 https://github.com/hrdwsong/BayesianCNN-Paddle 论文复现:Weight Uncertainty in Neural Networks 本项目复现时遇到一个比较大的问题,用pytorch顺利跑通源代码后,修改至pad…

【每日一练】python之tkinter的Label标签基础用法

""" 什么是tkinter窗口?tkinter是python中一个标准的库,用于创建图形界面(GUI)应用程序,它提供了一组工具和组件,使开发者能够在Python中创建窗口、按钮、标签、文本框、菜单等各种界面元素…