(天勤)数据结构高分笔记 经典摘录(一)

1.二叉树节点的定义

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

例如:

typedef  struct BTNode

{

int data;

struct BTNode *lchild;

struct BTNode *rchild;

}BTNode;

在考研的数据结构中,只需要熟悉掌握以上两种结点(链表、二叉树)的定义方法,其他的结点都是由这两种衍生而来的(其实二叉树结点的定义也是由链表结点的定义衍生而来的,二叉树结点只不过比链表结点多了一个指针而已),无需特别记忆。

说明:对于结构型,用来实现构造结点的语法有很多不同的表述,没必要全部掌握,上面讲到的那些语法用来构造结点已经足够用了,建议大家熟练掌握以上两种构造结点的结构体定义的写法,其他的写法可不予理睬。有些语法对考试来说既复杂有没有意义,例如,上面二叉树结点的定义有些参考书中写成:

typedef  struct BTNode

{

int data;

struct BTNode *lchild;

struct BTNode *rchild;

}BTNode,*btnode;

可以看到在最后又多了个*btnode,其实在定义一个结点指针p的时候,BTNode*p;等价于btnode p;。对于定义结点指针,BTNode *p;这种写法是顺理成章的,因为它继承了之前int *a;、char *b;、char *c;和TypeA *d;这些指针定义的一般规律,使我们记忆起来非常方便,不必再加个btnode p;来增加记忆负担。因此在考研中我们不采用这种方法,对于上面的结构体定义,删去*btnode,统一一个BTNode就可以解决所有的问题。

2.函数传参

int a;

void f(int x)

{

++x;

}

上面声明的函数需要一个整形变量作为参数,并且在自己的函数体中将参数做自增1的运算。执行完以下程序段之后的值是多少呢?

a=0; //A

f(a);//B

有些同学可能会认为a等于1.这个答案是错误的,可以这样理解,对于函数f(),在调用它的时候,括号里面的变量a和句A中的变量不是同一个变量。在执行B的时候,变量a只是把自己的值赋给了一个在f()的声明过程中已经定义好的整型变量,可以把这个变量想象为上述声明过程中的x,即B的中性过程拆开看来是这样两句:x=a;和++x;因此a的值在执行完A、B两句之后不变。

如果要想让a依照f()函数体中的操作来改变,应该怎么写呢?这时就要用到函数的引用型(这种语法是C++中的,C中没有,C中是靠传入变量地址的方法来实现的,写起来比较麻烦且容易出错,因此这里采用C++的写法),其函数声明方法如下:

void f(int &x)

{

++x;

}

这样就相当于a取代了x的位置,函数f()就是在对a本身进行操作,执行完A、B两句后,a的值由0变成1.

上面讲到的是指针对普通变量的“引用型”,如果传入的变量是指针型变量,并且在函数体内要对传入的指针进行改变,则需写成如下形式:

void f(int *&x)//指针型变量在函数体重需要改变的写法

{

++x;

}

执行完上述函数后,指针x的值自加1.

说明:这种写法很多同学不熟悉,但是它在树与图的算法中应用广泛,在之后的章节中考生要注意观察其与一般引用型变量的书写差别。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值