当前课程知识点:数据结构 > 第1章 绪论 > 1.3 抽象数据类型 > 讲解(下)
我们这里定义了一个doSomething函数
它去修改形参x
在主调函数当中,在main函数当中调用doSomething
会发现,调用完之后,x的值并没有发生修改
这是因为,我们在main的14行定义的x跟doSomething
中的形参x,它们占据的存储单元是不一样
你在这里修改这个x
不会影响main当中的
这个x
现在我们采用四种方式,来做到对形参的修改
能够在主调函数调用结束之后被看到。先采用第一种方式
把上面的代码复制下来
将修改后的值返回去
为了能够看到修改后的效果
我将它改成前置的自增
先将x加1
然后将加1后的值返回去
在main当中的19行
就可以用一个变量来接收
doSomething的返回值
现在我们再来看运行效果
在编译
大家看到,这里的x变成了3,已经被修改了
这是第一种方式
现在再来用第二种方式
我们把第一种修改把它注释了
第二种方式
将x作为全局变量
我们把它从形参的位置拿到全局变量的位置
那这里的形参就不要了
所有的函数都能访问到这里的全局变量
于是在main当中
这个x也不要了
我们直接调用doSomething
实参也不要了
然后我们去打印修改之后的x
大家看到,x也被修改了
(结果是1)这是因为,这里的x没有初始化,它的默认值是0
我们把它赋值成2
大家看到,x已经被修改了
这是第二种方式
现在
再来看第三种方式
我们把这段代码注释掉
把最初的代码复制过来
现在,我们将x声明成
指针类型
x是指向一个int型的指针
在这里
我们必须将x指向的内容自增
同时
还要修改main函数
原来定义的x,它的值是2
然后,这里的实参必须是一个指针
我们可以在实参前面加上取地址符号,与这里的形参指针
对应。现在,我们再来看一下运行效果
大家看到,x已经被修改了
这是将形参修改成指针。最后一种
也就是C++的引用参数
这是最原始的doSomething函数
现在,我们只需要做一个操作
在形参前面加一个&符号
注意,这个&符号是加在形参前面的
这时候才叫引用参数
不像刚才第三种方式
实参前面加&
这是表示取地址
在调用的时候
x不需要加任何的修饰符,就是普通的调用
C++的引用参数
修改这里的形参
回到主调函数当中
是能够看得到被修改的实参的
现在,我们再运行
x也被修改了
与之前的代码相比
我们就加了一个&符号
其他地方没有做任何的修改
却达到了
前三种方式相同的效果
而且
要简单的多
所以,推荐大家在数据结构这门课当中
上机环节,采用C++的引用参数
语法
另外
需要注意的是
源文件扩展名必须叫C++(cpp)
不能是c
否则会用C的编译器
因为引用参数语法是C++的
语法之一
下面来看一个具体的抽象数据类型的实现示例
刚才定义的复数抽象数据类型
现在我们用C语言来描述它
首先,因为复数有实部和虚部
所以
我们定义了一个结构体
需要注意的是
这个结构体是没有类型名的
在struct关键字后面没有任何的东西
它是一个无名的结构体。实部、虚部
它们的类型都是实型
然后,我们用C语言的typedef
注意,C语言的typedef是给已存在的类型起一个别名的
我们给这样一个无名的结构体起一个别名
叫做Complex
注意,这里的Complex是一个类型别名
而不是一个结构体变量名
将来,用这个类型别名就能声明一个
这个结构体类型的变量
比如这里的c
这个操作init,是刚才在抽象数据类型当中定义的初始化复数的操作
它根据后两个参数给出来的实型
a、b两个值
作为复数c的实部和虚部
因为复数c从无到有
要被修改
所以,我们在c前面加了引用参数的语法
以后
大家记住一个原则
如果你想在一个操作内部修改一个形参
那你就在这个形参前面加引用参数的语法
它的函数体很简单
将
参数给出来的a和b,分别作为c的实部和虚部
成员就可以了
-讲解
-作业
-讨论1
-讨论2
-1.1 数据结构是什么
--讲解
--作业
-1.2 概念和术语
--讲解
--作业1
--作业2
-1.3 抽象数据类型
--讲解(上)
--讲解(下)
--作业
-1.4 算法及其设计要求
--讲解
--作业
-1.5 算法分析与度量
--讲解(上)
--讲解(下)
--作业1
--作业2
--讨论
-2.1 概念及ADT
--讲解
--作业
-2.2 线性表的顺序实现——顺序表
--讲解(上)
--讲解(中)
--讲解(下)
--作业1
--作业2
-2.3 线性表的链式实现——链表
--讲解(上)
--讲解(中)
--讲解(下)
--作业1
--作业2
-2.4 线性表的应用——多项式
--讲解
--作业
-讨论
-3.1 栈的定义及ADT
--讲解
--作业
-3.2 栈的顺序实现——顺序栈
--讲解
--作业
-3.3 栈的应用
--讲解
--作业
-3.4 栈与递归
--讲解(上)
--讲解(下)
--作业
-3.5 队列的定义及ADT
--讲解
--作业
-3.6 队列的顺序实现——循环队列
--讲解(上)
--讲解(下)
--作业
-讨论
-4.1 数组的定义
--讲解
--作业
-4.2 数组的顺序实现
--讲解
--作业1
--作业2
-4.3 特殊矩阵的压缩存储
--讲解
--作业
-4.4 稀疏矩阵的压缩存储
--讲解(上)
--讲解(下)
--作业
-讨论
-5.1 概念及术语
--讲解
--作业
-5.2 二叉树及其性质
--讲解
--作业1
--作业2
-5.3 二叉树的存储
--讲解
--作业
-5.4 二叉树的遍历及创建
--讲解(上)
--讲解(下)
--作业
-5.5 线索二叉树
--讲解
--作业
-5.6 树与森林
--讲解
--作业
-5.7 Huffman树
--讲解(上)
--讲解(下)
--作业
-讨论
-6.1 概念和术语
--讲解
--作业
-6.2 存储与实现
--讲解(上)
--讲解(下)
--作业
-6.3 遍历
--讲解(上)
--讲解(下)
--作业
-6.4 最小生成树
--讲解(上)
--讲解(下)
--作业1
--作业2
-6.5 拓扑排序
--讲解
--作业
-6.6 最短路径
--讲解
--作业
-讨论
-7.1 概念和术语
--讲解
--作业
-7.2 静态查找表
--讲解(上)
--讲解(下)
--作业
-7.3 二叉排序树
--讲解(上)
--讲解(下)
--作业
-7.4 平衡二叉树
--讲解
--作业
-7.5 哈希表
--讲解(上)
--讲解(下)
--作业
-讨论
-8.1 概念
--讲解
--作业
-8.2 插入排序
--讲解(上)
--讲解(下)
--作业
-8.3 交换排序
--讲解(上)
--讲解(下)
--作业
-8.4 选择排序
--讲解(上)
--讲解(中)
--讲解(下)
--作业
-8.5 归并排序
--讲解
--作业
-讨论