数据结构知识点(链表、递归、树图)

1. 数据结构与算法

一个可执行的程序分为数据的存储,数据的操作,能被计算机识别的程序语言。

数据的存储主要指个体关系的存储,个体与个体关系的存储即数据结构,数据结构不一样,数据的操作也就不一样(泛型除外)。

数据的操作也就是算法,算法分为狭义算法和广义算法,狭义算法是与数据的存储方式密切相关;广义算法与数据的存储方式无关。

2. 线性存储与非线性存储

数据的存储也就是数据结构分为线性存储和非线性存储。线性存储分为数组和链表等,非线性存储分为树和图。

线性结构相关算法已经非常成熟,在各个语言中都有相关定义,但是非线性结构算法还不是很成熟,都在研究。

3. 线性存储
    3.1 数组
        如果通过一个函数对数组进行处理,至少需要知道首地址,数组长度。
    3.2 链表
        3.2.1 链表的定义
            3.2.1.1 链表的每个结点分为数据域和指针域,数据域可以为多种和复杂类型。
            3.2.1.2 链表的头结点,头结点即首结点前面那个结点,与首结点类型一样,但是只有指针域。
            3.2.1.3 链表尾结点,链表最后一个结点,有数据域和指针域(非循环链表尾结点指针域指向NULL)
            3.2.1.4 链表的头指针与尾指针,指向头结点的指针为头指针,指向尾结点的指针为尾指针。
            3.2.1.5 如果通过一个函数对链表进行处理,只需要知道头指针即可。
        3.2.2 链表的分类
            3.2.2.1 单链表,结点的指针域只能指向下一个结点。
            3.2.2.2 双链表,每一个结点有两个指针域,分别指向前后两个结点。
            3.2.2.3 循环链表,能通过任何一个结点找到其他所有的结点,尾指针指向头结点。
            3.2.2.4 非循环链表,非循环链表尾结点指针域指向NULL。
        3.2.3 定义一个链表中每一个结点的数据类型
            struct Node
            {
                int data;                     //数据域,它可以很复杂
                struct Node * pNext; //指针域,指向一个和它本身类型一样的结构体,存放下一个结点的地址
            }

   3.2.5 链表的应用

            堆栈和队列。它们都分为静态和动态,静态就是用数组实现,动态就是用动态链表实现。

3.3 递归
        3.3.1 递归的定义

          一个函数自己直接或间接调用自己。下面过程解释了一个函数为什么可以调用它自己。

         当在一个函数运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事:

        (1) 将所有的实际参数,返回地址等传给被调函数保存。返回地址一般指下一条语句的地址(被调函数下一条语句)。

        (2) 为被调函数的局部变量(包括形参)分配存储空间。

        (3) 将控制转移到被调函数的入口。

        从被调函数返回主调函数之前,系统也要完成三件事:

       (1) 保存被调函数的返回结果。

       (2) 释放被调函数所占的存储空间,动态分配的空间需要手动释放,系统不会自动释放。

       (3) 依照被调函数保存的返回地址将控制转移到主调函数,一般是把返回地址赋给PC指针。

3.3.2 递归的应用

         (1) 求阶乘

                     阶乘: !n = n*(n-1)*(n-2)*...5*4*3*2*1 = n * !(n-1),可以用一个for循环实现,也可以用递归实现。

                     (1)For循环实现:  for(i=0;i<n;i++) {if (n==1) return;mux=mux*i;}

                       (2)   递归实现:       f(n) {  return n*f(n-1)... } 

         (2) 汉罗塔、菲波拉契序列、走迷宫、其他很多数学问题等,这些没有或无法明确执行次数的问题,都是用递归来解决。

3.3.3 递归的三个条件

       (1)递归必须得有一个明确的终止条件。

         (2)  该函数所处理的数据规模必须在递减,比如n的阶乘只需要把n-1的阶乘求得即好办。

         (3) 这个转化必须是可解的,数学问题可解。

3.3.4 递归与循环的比较

         (1) 所有循环理论上都可以用递归实现,但是能用递归实现的不一定能用循环实现。

         (2) 递归易于理解,但是速度慢,并且耗空间。容易理解因为有些只能用递归实现且好理解,用循环基本上实现不了。

         (3) 循环不易理解,但是速度快,空间耗费少。

4. 非线性存储
   4.1 树
   4.2 图 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值