3

一、c/c++ 杂谈

特殊类型

1.结构型
用户自己制作的数据类型

typedef struct{
    int a;
    char b;
    float c;
} TypeA;

2.指针型
如果a是个指针型变量,且指向变量b,则a中存放了变量b所在的地址。*a就是取变量b的内容(x=*a;等价于x=b;),&b就是取变量b的地址,语句a=&b;就是将变量b的地址存于a中,即指针a指向b。

typeof 和 #define

  • typeof:给现有的数据类型起新名字
  • #define: 宏定义,用一个指定的标识符代表一个字符串,一般大写以区别变量名

结点构造

指针与结构体结合

1.链表结点

包含数据域(存数据)、指针域(存放下一结点的地址)

clipboard.png

链表的结构型定义如下:

typedef struct Node {
    int data; 
    //这里默认的是int型,如需其他类型可直接修改。 
    structNode*next;
    //指向Node型变量的指针
} Node;

注意:凡是结构型(假设名为a)内部有这样的指针型(假设名为b),即b是用来存放和a类型相同的结构体变量地址的指针型(如图1.2中,结点A的指针next,next所指的结点B与结点A是属于同一结构型的),则在定义a的typedef struct语句之后都要加上a这个结构型的名字。与之前定义的结构型TypeA进行比较,会发现这里的结构型Node在定义方法上的不同。

2.二叉树节点的定义

在链表结点结构型的基础上,再加上一个指向自己同一类型变量的指针域即为二叉树结点结构型:

typedef struct BTNode {
    intdata;
    structBTNode *lchild;
    structBTNode *rchild;
} BTNode;

制作新结点的方法,以二叉树结点的制作为例,有以下两种写法:
方法一:

BTNode BT;

方法二(常用):

BTNode *BT; 
BT = (BTNode*)malloc(sizeof(BTNode));

clipboard.png

方法二句中的BT是个指针型变量,用它来存储刚制作好的结点的地址。因BT是变量,虽然现在BT指向了刚生成的结点,但是在以后必要的时候BT可以离开这个结点转而指向其他结点。而方法一句则不行,方法一中的BT就是某个结点的名字,一旦定义好,它就不能脱离这个结点。从这里就看到方法二比方法一更灵活,因此方法二用的多,并且方法二完全可以取代方法一(方法二中BT的值不改变的话就相当于方法一)。

拓展:取BT指针的值:(*BT).data;BT->data

二、时间复杂度 和 空间复杂度

时间复杂度

将算法中基本操作的执行次数作为算法的时间复杂度。时间复杂度不是执行完一段程序的总时间,而是其中基本操作的总次数。

计算一个算法时间复杂度的步骤如下:
1.确定算法中的基本操作,以及问题的规模。
2.根据基本操作执行情况计算出规模n的函数f(n),并确定时间复杂度为T(n)=O(f(n)中增长最快的项/此项的系数)。

常用的各种时间复杂度大小的比较关系如下:

$$O(1) ≤ O({log_{2}}^{n}) ≤ O(n) ≤ O(n{log_{2}}^{n}) ≤ O(n^{2}) ≤ O(n^{3}) ≤ …… ≤ O(n^{k}) ≤ O(2^{n})$$

空间复杂度

算法的空间复杂度指算法在运行时所需存储空间的度量,主要考虑在算法运行过程中临时占用的存储空间的大小(和时间复杂度一样,以数量级的形式给出)。

三、数据结构的一些概念

数据元素

数据元素是数据的基本单位,在计算机程序中通常将其作为一个整体进行考虑和处理。

数据项

数据项是数据结构中讨论的最小单位,是数据记录中最基本的,不可分的数据单位。

数据结构

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括3方面的内容:逻辑结构,存储结构和对数据的运算

数据的逻辑结构

数据的逻辑结构是对数据之间关系的描述,它与数据的存储结构无关,同一种逻辑结构可以有多种存储结构。归纳起来数据的逻辑结构主要有两大类。

1.线性结构 简单地说,线性结构是一个数据元素的有序(次序)集合。它有四个基本特征:

  • 集合中必存在唯一的一个“第一个元素”。
  • 集合中必存在唯一的一个“最后的元素”。
  • 除最后元素之外,其它数据元素均有唯一的“后继”。
  • 除第一元素之外,其它数据元素均有唯一的“前驱”。

数据据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。如(a1,a2,a3,.....,an),a1为第一个元素,an为最后一个元素,此集合即为一个线性结构的集合。

2.非线性结构 与线性结构不同,非线性结构中的结点存在着一对多的关系,它又可以细分为树形结构和图形结构。

数据的物理结构

数据的物理结构又称为存储结构,是数据的逻辑结构在计算机中的表示(又称映像)。它包括数据元素的表示和关系的表示。当数据元素是由若干数据项构成的时候,数据项的表示称为数据域;比如一个链表结点,结点包含值域和指针域,这里结点可以看做一个数据元素,其中的值域和指针域都是这个数据元素的数据域。

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像。对应的两种不同的存储结构分别是顺序存储结构和链式存储结构。顺序映像是借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系;非顺序映像是借助指针表示数据元素之间的逻辑关系。

实际上,在数据结构中有以下4种常用的存储方法。

1.顺序存储方法 顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,通常顺序存储结构式借助于计算机程序设计语言(例如C/C++)的数组来描述的。

2.链式存储方法 该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,通常借助于计算机程序设计语言(例如C/C++)的指针类型来描述它。

3.索引存储方法 该方法在存储结点信息时除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引项的一般形式一般是<关键字,地址>。关键字标识唯一一个结点:地址作为指向结点的指针。

4.散列(或哈希)存储方法 该方法的基本思想是根据结点的关键字通过哈希函数直接计算出该结点的存储地址。这种存储方法本质上是顺序存储方法的扩展。

本文地址 kidsama的小博客


kidsamong
2.8k 声望138 粉丝

进击的程序猿