写给你的数据结构教程(第一天)
2019独角兽企业重金招聘Python工程师标准>>>
引言
我想通过这个教程,使得读者不需要写太多代码,便能理解数据结构的概念和重要性。
很多算法是运行在特殊的数据结构之上的,可以说数据结构和算法是相辅相成的,有句出自某书的非常经典的话是这样说的:
Algorithms Plus Data Structures Equals Programs
即算法加数据结构等于程序。注意这里是程序,不是软件。软件还有工程性在其中。
但是我依然希望能够不讲太多的算法,因为“算法”太多,通过学习大量算法来学习数据结构的方式有些舍本逐末。
我会尽量从构造和设计的角度来阐述数据结构。
构造即我们手上有什么,怎么利用这些去制造我们需要的结构。
设计即我们的目的是什么,为了达成这个目的我们需要什么结构。
在内存里存储数据
在C语言中,我们要处理的数据,都存储在内存中,即便是硬盘中某个文件里存放的小说,要对其内容进行处理,我们依然需要将其加载到内存中,再接着进行后续的处理。
当我们在C语言里定义一个变量,诸如:
int o;
在这句代码之后,我们便可以操作这个变量。
我们可以往里面存放一个整数,那这个整数有多大呢?使用
printf("%d",sizeof(int));
这句代码,可以输出int型变量在其运行设备上的大小。如果你在你的笔记本电脑上编译运行,这个大小应该是4,即4bytes,换算成二进制位(bit)即4*8=32bits。
我们可以利用sizeof测出所有基本类型的大小。这样就有很多不同的盒子去放数据了。
内存里的数据看起来怎么样
上面我们创建了一个int型变量o。在内存里看起来是这样的:
当然现在什么都没有,因为在定义的时候并未初始化,我们也没放任何东西进去。现在存点东西进去:
o = 11;
这下变成这样了:
最后我们显示出这个数据存储单元在内存中的位置(变量地址):
printf("%d",&o);
现在我们什么都有了:
移动数据
先看看这样一个程序:
#include <stdio.h>
void showcopies(int copies)
{printf("copies %d\n",&copies);
}
int main(void)
{int o;o = 11;printf("original %d\n",&o);showcopies(o);return 0;
}
在这个程序里我们定义了一个函数,并且利用参数传递,将变量o“移动”到了showcopies这个函数中,并且“改名”叫做copies。
主函数main里输出了o这个变量的地址,showcopies里输出了移动后的o的地址。
最后的结果是什么样呢?可以试着运行看看。
我去泡杯咖啡喝……
如果你在程序里加入了输出变量o和变量copies的值的语句,你会更加肯定,被“移动”的只有变量o的值而已。
也就是说,当我们进行参数传递的时候,其实是在新的一块内存区域里开辟一个同样大小的空间,然后把作为参数传递的变量的内存空间里的数据复制到新的空间中。
一组数据
数组(Array)这个名字其实有些呆,因为光看中文名给人的感觉就是一组数,诸如(1,2,3)这样的,但事实上还可以是('a','b','c')。我倾向于把Array理解为一列数据或者一组数据。
#include <stdio.h>
int main(void)
{int m[3];int i;for(i=0;i<3;i++) printf("%d\n",&m[i]);return 0;
}
运行上面的程序,就可以看到(图画的我累,所以这里不画了=。=)这样的结果:
2686736
2686740
2686744
这三个地址便是数组m里三个依次相邻元素的地址。因为每个int变量占据4bytes,所以这三个int变量的地址是依次相差4(bytes)。数据里的数据,在内存里是连续存放的。
这样的好处在于访问会特别快,我们只需要知道第一个变量的地址,就能通过向后移动一定的位置来读取另一个变量。
正如我们在程序里使用的访问方式一样,[]括号里加入索引号,便能访问,在实际的程序运行中,这种直接访问的速度也非常快。
移动一组数据或自定义数据类型
当我们尝试在函数调用的时候传递数组(Array)或者自定义的数据类型(结构体)时,会出现一种例外。
因为这两类数据在内存里占用的空间可能会很大,所以全部复制到一个新空间里实在不是很划算的一件事。甚至多数时候我们不需要一个新的备份,只需要在原来的数据上修改就行。
所以对于这两类数据,C语言里使用指针(Pointer)来操作。
int m[3];
int *first_element_address;
first_element_address = &m[0];
printf("%d\n",*(first_element_address+1)==m[1]);
当调用函数时,会生成传递参数的指针变量,再将这个指针变量传递过去。
至于验证方法,可以利用移动数据一段中的程序来检验。作业1。
/* Cheatsheet for using pointer in C */
/* 生成指针 */
pointer = &variable;
/* 用指针读取指向变量的值,再与指向变量的值进行相等判断 */
*pointer == variable;
/* 当pointer指向一块连续数据区域时,例如数组 */
*(pointer+index) == array[index];
来,我们来实现一个可变数组
先看看C语言的数组,有两个明细的缺陷:
如果访问数组的时候下标(索引值)越界,会发生错误。
数组的大小是固定的。
因此我们要设计一个用起来更好的,比如拥有如下特性:
可以检查是否越界
可变大小
数组的数据在内存中皆是连续存放的,因此我们需要一个用于存放连续数据的区域。
作业2
参考
http://en.wikipedia.org/wiki/Algorithms_%2B_Data_Structures_%3D_Programs
《Linux C编程一站式学习》 宋劲杉
转载于:https://my.oschina.net/sooshian/blog/221101
写给你的数据结构教程(第一天)相关推荐
- 《Java程序设计与数据结构教程(第二版)》学习指导
<Java程序设计与数据结构教程(第二版)>学习指导 目录 图书简况 学习指导 第一章 绪论 第二章 数据和表达式 第三章 使用类和对象 第四章 条件和循环 第五章 编写类 第六章 图形用 ...
- 2019-2020-1 1823《程序设计与数据结构》第一周作业总结
作业地址 第一周作业:https://edu.cnblogs.com/campus/besti/2019-2020-1-1823-PDDS/homework/3466 提交情况如图: 共7人没提交,还 ...
- 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案
<<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...
- 20162302 《程序设计与数据结构》第一周学习总结
20162302 2017-2018-1 <程序设计与数据结构>第一周学习总结 教材学习内容总结 很多情况下时间和空间不可兼得.在不同的情况下,要么用时间换空间,要么用空间换时间. 引出算 ...
- 20162303《程序设计与数据结构》第一周学习总结
学号 2016-2017-2 <程序设计与数据结构>第1周学习总结 教材学习内容总结 本周学习了基本的JAVA知识,虽然比较基础,但是在实际过程中还是出现了许许多多的问题,代码一遍遍的敲错 ...
- 会说话的狗狗本电脑版_一看就会用!Fotor 电脑版 图片后期处理详解系列教程 第一节...
Fotor 电脑版 图片后期处理详解系列教程 第一节 这节课我们先来了解一下 Fotor 电脑版的界面功能,为了能用 Fotor 电脑版修图处理打基础. 如图示,启动 Fotor 以后出面界面,有编辑 ...
- 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——8 - Fable Of The Lazy Teenager(懒散少年的寓言)
Unit 8 - Fable Of The Lazy Teenager(懒散少年的寓言) Benjamin Stein weaves a tale to bring home to young Ame ...
- 《无聊教程●第一课●教你编一个牛逼的VBScript邮件发送器》
也许 地球上的你正在看他们的教程 但你不知道 在另一个银河 正上演的一场激烈的战争 那就是 ...... 桃花侠 大战 菊花怪 坑爹啊!! 嘛,没错以上内容皆与课程无关.... { 我发现我写基础.单 ...
- 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——5 - A Valentine Story(爱情故事)
Unit 5 - A Valentine Story(爱情故事) A letter or telephone call comes from someone you have not met, and ...
最新文章
- 头条面试归来,有些话想和Java程序员说!
- 与SENet互补提升,华为诺亚提出自注意力新机制:Weight Excitation|ECCV2020
- ASP.NET 页面事件执行顺序 收藏
- NIO 之 Buffer 图解
- python findall函数_python正则表达式之中的findall函数是什么?
- [蓝桥杯2018决赛]最大乘积-dfs
- Calender日历类
- OpenCL 第6课:矩阵转置
- 27. 二叉树的镜像
- upc 9325 序列本质
- 个人简历怎么写怎么做(还有怎么培养无私奉献的精神--模板)
- 拿来就能跑,1200多套微信小程序源码-史上最全的不同行业的源码集合
- 用gambit学博弈论--完全信息动态博弈-参与者信息集、博弈树上虚线的解释(三)
- POC_Jenkins
- Linux 内核签名(签名内核模块)、linux 驱动签名
- 《从0到1上线微信小游戏》第七节 微信排行榜和好友分享功能
- 今日头条有麻烦了!App 被下架
- 联想小新22H2版跳过联网方法最新方法
- 子载波间隔与符号长度
- 奇瑞鲍思语将十万级无界Pro推出市场