zoukankan      html  css  js  c++  java
  • 线性结构基础总结

    线性结构基础总结


    一:线性结构的存储

    1)连续存储(数组)

      什么叫做数组:元素类型相同、大小相等

    2)离散存储(链表)

      树和图的基础


    二:链表

    1. 什么叫链表

      n个结点离散分配,彼此通过指针相连。每个结点只有一个前驱结点,各个结点只有一个后驱结点(首结点没有前驱结点,尾结点没有后驱结点)

    2. 专业术语

      首节点:第一个有效节点

      尾节点:最后一个有效节点

      头节点:在首节点前面,不存放数据,它指向首节点,目的是简化算法,并不存放有效数据

        头指针:指向头结点的指针变量

      尾节点:指向尾结点的指针变量

    2)链表的分类

      单链表:

      双链表:每个节点有两个指针域(可以同时指向前后结点)

      循环链表:能通过任何结点找到其他所有的结点

      非循环链表:

    3)链表的算法

      遍历、查找、清空、销毁、求长度、排序、删除。   

      删除结点

        错: p->pNext=p->pNext->pNext; 会导致内存泄露  

        对: r=p->pNext;   p->pNext=p->pNext->pNext;    free(r); free() ,注意r本身没有free() 

      添加结点: p ,q 分别为一个节点的地址 比如:struct Stu * p ;

        第一种方法:r=p->pNext ;    p->pNext=q;   q->pNext=r;    

        第二种方法:q->pNext = p->pNext;    p->pNext=q;  


    三:线性结构的常见应用栈和队列

    1)栈的概念

      定义:一种可以实现“先进后出”的存储结构,栈类似于箱子

      分类: 动态栈(链表),静态栈

      算法: 出栈,压栈

    2)队列的概念

      定义:先进先出可以实现“先进先出” 的存储结构

      分类:

        链式队列  --- 链表实现

        静态队列  ---- 数组实现(静态队列必须通常是循环队列)

    3)循环队列的理解

    1.静态队列为什么必须是循环队列

      front永远指向第一个元素 rear永远指向最后一个元素的下一个元素,为了便于存储结构的操作(自己体会)

      用传统的数组队列:无论入队还是出队f ront或者rear都是增的(故用循环队列,免去空间浪费)

      没有越界:地址(r)可以指向数组的最后一个有效元素的下一个元素,但是不可以使用它

      循环队列(解决方法):尾部加一,可以指向首部

    2.循环队列需要几个参数来确定(两个参数)

    3.循环队列的各个参数的意义

    (1)队列的初始化

      Front rear 都是零位置

    (2)队列非空

      Front代表的是队列的第一个元素

      Rear代表的是最后一个元素的下一个元素

    (3)队列空

      Front和 rear的 值是相等的,但不一定是零位置 

    (4)循环队列入队的为算法讲解:

      1)元素值放在rear的位置

      2)错误的写法:rear = rear+1

        正确的写法:rear = rear+1%(数组的长度)

    (5)循环队列的出队的为算法的讲解

      Front = front+1%(array.Length)

    (6)如何判断队列是否为空

      如果frontrear的值相等 ,那么队列为空

    (7)如何判断队列是否为满:Frontrear的大小关系没有规律

      数组里面都存放了元素,那么frontrear指向同一元素,不能判断是满还是空

        解决办法:

        多定义一个参数,保存元素的个数

            数组少放一个元素,不存在frontrear相等的情况,n-1就是满(用第二种方法判断:当front  和(rear+1%array.Length 相等的时候)

    4.队列的算法: 入队和出队

    5.队列的应用: 所有和时间有关的操作(操作系统)


    四: 递归

    1)什么是递归:一个函数直接或者间接的调用自己

    2)A如何调用B函数,当函数调用另一个函数之前,系统要完成三件事:

              1——函数A将所有实参,返回地址(下个语句的地址)等信息传递给被调函数保存

              2——被调函数为被调函数分配存储区域

              3——将控制转移到被调函数的入口(开始执行被调函数)

    3)在被调函数B返回调用函数A之前,系统要完成三件事:

              1——保存被调函数B的计算结果 (返回值产生拷贝,保存在临时的地方)

              2——释放被调函数B的数据区(静态局部变量,不包括动态创建的)

              3——依照被调函数B返回值的返回地址,控制传回调用函数A

    4)嵌套调用

      调用后调用先返回,函数退出正在运行的函数,注意函数调用与栈之间的关系。

    5)递归满足的三个条件

      必须有一个明确的终止条件

      函数处理的数据规模必须递减

      这个转化必须是可解的
    6)递归和循环(理论上循环都可以转化为递归)
      递归:浪费空间 ,比较慢,易于理解
      循环:不易理解 ,速度快,存储空间小

    五:举例

    1 ,1+2+3+4.....100

    2. 汉诺塔

    3. 走迷宫

    4. 求阶乘

  • 相关阅读:
    ubuntu
    什么是守护进程?
    Redis 简介
    什么是原子性,什么是原子性操作?
    什么是BSD协议?
    查看内存
    数据库备份与还原
    PostgreSQL 判断字符串包含的几种方法
    SQL 基础
    手风琴-过渡效果,显示隐藏列表案例
  • 原文地址:https://www.cnblogs.com/lujiao_cs/p/2172940.html
Copyright © 2011-2022 走看看