数据结构之一准备及预热

1.接口

接口可以理解为用户和函数打交道的地方,通过接口用户输入了自己的数据,得到了自己想要的结果

2.在进行算法设计题中的代码书写时,只需写出一个或多个可以解决问题的有着清楚接口描述的函数即可。

3.数据类型
对于基本数据类型,如整型 int ,long ,…,字符型 char , 浮点型 float , double , …等大家都已经了解了。这里主要讲结构型和指针型。
3.1 结构型
结构型 :结构型就是用户自己制作的数据类型 。
结构体就是系统提供给程序员制作新的数据类型的一种机制,即可以用系统已经有的不同的基本数据类型或用户定义的结构型,组合成用户需要的复杂数据类型。
例如:

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

上面的语句制造了一个新的数据类型,即TypeA型。

对比结构体和数据 , 如图1-1
这里写图片描述

3.2 指针型
对于其他类型的变量,变量里所装的是数据元素的内容,而指针型变量内部装的是变量的地址,通过它可以找出这个变量在内存中的位置。
指针型的定义方法对每种数据类型都有特定的写法,但又有相似的方法。例如:

int *a;     //对比一下定义的int型变量的语句;int a; 
char *b;    //对比一下定义的char型变量的语句;char b; 
float *c;   //对比一下定义的float型变量的语句;float c; 
TypeA *d;   //对比一下定义的TypeA型变量的语句;TypeA d; 

上面四句分别定义了指向整型变量的指针a,指向字符型变量的指针b, …

如果a是指针型变量,且它已经指向一个变量b , 则a中存放变量b所在的地址。*a 就是取变量b的内容(x=*a ; 等价于 x=b;), &b 就是取变量b的地址,语句a=&b;就是将变量b的地址存于a中,即大家常说的指针a指向b。

指针型 用的最多的就是和结构型结合起来构造结点(如链表的结点、二叉树的结点)

3.3 结点的构造
3.3.1 链表结点的定义
链表结点有两个域:一个是数据域,用来存放数据;另一个是指针域,用来存放下一个结点的位置;如图1-2
这里写图片描述

链表的结构型定义如下:

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

注:凡是结构型(假设名为a)内部有这样的指针型(假设名为b),即 b 是用来存放和 a 类型相同的结构变量地址的指针型(如图1-2中结点A的指针next , next 所指的结点B与结点A是属于同一结构型的),则在定义 a 的 typedef struct 语句之后都要加上 a 这个结构型的名字

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

typedef struct BTNode
{
    int data;
    struct BTNode *lchild;
    struct BTNode *rchild; 
}BTNode;

在考研数据结构中,只要熟练掌握以上两种结点(链表、二叉树)的定义方法,其他的结点都是由这两种衍生而来的。

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

//1
BTNode BT;

//2
BTNode *BT;
BT=(BTNode*)malloc(sizeof(BTNode));  //此句要熟练掌握 
  • 1中只用一句就制作了一个结点,而2中需要两句,要比1繁琐,但是考研中用的最多的是2 。
  • 2 的执行过程:先定义个结点的指针BT ,然后用malloc函数来申请一个结点的内存空间,最后让指针BT指向这片内存空间,这样就完成了一个结点的制作
  • 另外,因为BT是变量,虽然现在BT指向了刚生成的结点,但是在以后必要的时候BT可以离开这个结点转而指向其他结点。而1句则不行,1中的BT就是某个结点的名字,一旦定义好,它就不能脱离这个结点了。从这可以看到2比1更灵活,因此2用的多,并且2完全可以取代1
  • 对于1和2中的BT取分量的操作也是不同的。对于1如果想取其data 域的值赋给x ,则应该写成x=BT.data ; ,而对于2则应该写成x=BT->data ; 。一般来说,用结构体变量取分量,其操作用“.”;用指向结构体变量的指针来取分量,其操作用“->”。
  • 当然也可以这样写(*BT).data,它与BT->data是等价的。

注:在不知道系统默认的运算符优先级的情况下,最好依照自己所期望的运算顺序加上括号。

这里写图片描述
上面的模板请背会

除此之外,还有一个动态申请数组空间的方法,相对于上面提到的一次申请一个结点,这种方法可以认为是一次申请一组结点,如下

int *p;
p=(int*)malloc(n*sizeof(int)); 

这样就申请了一个由指针 p 所指的(p指向数组中第一个元素的地址)、元素为 int 型的,长度为 n 的动态数组。取元素的时候和一般的数组(静态数组)一样,如取第2个元素,则可写成 p[1] .

3.4 关于typedef和#define
typedef 就是用来给现有数据类型起一个新名字的。
#define 定义常量,例如 #define maxSize 50;

未完…

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页