zoukankan      html  css  js  c++  java
  • 数据结构

    此博客连接:

    第一章 基本概念

    数据:信息的载体。

    数据元素:数据的基本单位。

    第一章 链表

    学习链接:https://blog.csdn.net/Miss_Monster/article/details/83657467(概念)

    学习链接:https://www.jianshu.com/p/6ebedde370b0(java)

    简介:

    链表的数据元素是一个一个串联在一起的,这一串数据形成的结构就是“链表”。它就像一条自行车“链条”一样。每一个数据元素可以称之为一个节点。

    单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。

    特点:

    链表在内存中的物理存储空间是非连续、非顺序的。其中每个节点包含两部分,一个是存储数据元素的“数据域”,另一个是存储下一个节点地址的“指针域”。

    优点:

    1、因为链表对内存空间的连续性和顺序性没有要求,所以它可以充分利用内存空间,并且这一特点还造就了链表可以不必预先知道数据的大小,更加灵活。

    2、链表插入和删除数据速度快,只需要修改相邻节点的指针域就行。

    缺点:

    1、每个节点除了存储数据外还需要额外的存储下一个节点的地址,因此占用内存空间大。

    2、链表没办法像有索引的数据结构那样随机访问某一个元素,只能每次查找元素时从链表的头节点或尾节点开始遍历,增加了查询数据的消耗。

    链表的种类 
     在实际中,链表有许多形式,不止是上图中简简单单的样子。以下情况组合起来就有八种形式的链表:

    下面介绍一下它们各自的结构,通过图可以理解得更深刻

    不带头单链表

    单向、双向

    带头、不带头
    循环、非循环
    不带头双向链表 


     带头单链表

    循环单链表


    带头双向循环链表

    虽然有很多的链表结构,但其实,我们最常用的就是两种结构:

    链表的插入删除操作

     存储

    顺序存储:

    插入移动  n/2个元素

    删除移动(n-1)/2个元素 

    时间复杂度O(n)

    指针

    指针是一种保存变量地址的变量

    int *p;        // 声明一个 int 类型的指针 p
    char *p        // 声明一个 char 类型的指针 p
    int *arr[10]   // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
    int **p;       // 声明一个指针 p ,该指针指向一个 int 类型的指针
    

    声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化:或是使他指向现有的内存,或者给他动态分配内存,否则我们并不知道指针指向哪儿,这将是一个很严重的问题,稍后会讨论这个问题。初始化操作如下:

    /* 方法1:使指针指向现有的内存 */
    int x = 1;
    int *p = &x;  // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址
    
    /* 方法2:动态分配内存给指针 */
    int *p;
    p = (int *)malloc(sizeof(int) * 10);    // malloc 函数用于动态分配内存
    free(p);    // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h

     结构体

    结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。由于结构将一组相关的变量看做一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中。声明一个结构的方式如下:

    struct message{            // 声明一个结构 message
        char name[10];             // 成员
        int age;
        int score;  
    };
    
    typedef struct message s_message;     // 类型定义符 typedef
    
    s_message mess = {"tongye",23,83};    // 声明一个 struct message 类型的变量 mess,并对其进行初始化 
    --------------------------------------------------------------------------------------------------------------
    /* 另一种更简便的声明方法 */
    typedef struct{
      char name[10];
      int age;
      int score;
    }message;

    结构指针

    结构指针是指向结构的指针,以上面的结构为例,可以这样定义一个结构指针:

    s_message *p;        // 声明一个结构指针 p ,该指针指向一个 s_message 类型的结构
    *p = &mess;      // 对结构指针的初始化与普通指针一样,也是使用取地址符 &

    C语言中使用 -> 操作符来访问结构指针的成员,举个例子:

    #include "stdio.h"
    
    typedef struct{
        char name[10];
        int age;
        int score;  
    }message;
    
    int main(){
        message mess = {"tongye",23,83};
        message *p = &mess;
    
        printf("%s
    ",p->name);      // 输出结果为:tongye
        printf("%d
    ",p->score);         // 输出结果为:83
    
        return 0;
    }
  • 相关阅读:
    Git 远程操作详解
    Golang io标准库
    Golang strings标准库
    Go WebSocket 实现
    Golang Gorm零值数据更新小坑
    [Linux] 分区扩容
    即截即贴,推荐一个提升截图对比效率的工具Snipaste
    POI 替换 word 关键字并保留样式
    前端图片压缩与 zip 压缩
    ubuntu20更换内核
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/13352554.html
Copyright © 2011-2022 走看看