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语言的数组,有两个明细的缺陷:

  1. 如果访问数组的时候下标(索引值)越界,会发生错误。

  2. 数组的大小是固定的。

因此我们要设计一个用起来更好的,比如拥有如下特性:

  1. 可以检查是否越界

  2. 可变大小

数组的数据在内存中皆是连续存放的,因此我们需要一个用于存放连续数据的区域。

作业2


参考

  1. http://en.wikipedia.org/wiki/Algorithms_%2B_Data_Structures_%3D_Programs

  2. 《Linux C编程一站式学习》 宋劲杉

转载于:https://my.oschina.net/sooshian/blog/221101

写给你的数据结构教程(第一天)相关推荐

  1. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 目录 图书简况 学习指导 第一章 绪论 第二章 数据和表达式 第三章 使用类和对象 第四章 条件和循环 第五章 编写类 第六章 图形用 ...

  2. 2019-2020-1 1823《程序设计与数据结构》第一周作业总结

    作业地址 第一周作业:https://edu.cnblogs.com/campus/besti/2019-2020-1-1823-PDDS/homework/3466 提交情况如图: 共7人没提交,还 ...

  3. 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案

    <<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...

  4. 20162302 《程序设计与数据结构》第一周学习总结

    20162302 2017-2018-1 <程序设计与数据结构>第一周学习总结 教材学习内容总结 很多情况下时间和空间不可兼得.在不同的情况下,要么用时间换空间,要么用空间换时间. 引出算 ...

  5. 20162303《程序设计与数据结构》第一周学习总结

    学号 2016-2017-2 <程序设计与数据结构>第1周学习总结 教材学习内容总结 本周学习了基本的JAVA知识,虽然比较基础,但是在实际过程中还是出现了许许多多的问题,代码一遍遍的敲错 ...

  6. 会说话的狗狗本电脑版_一看就会用!Fotor 电脑版 图片后期处理详解系列教程 第一节...

    Fotor 电脑版 图片后期处理详解系列教程 第一节 这节课我们先来了解一下 Fotor 电脑版的界面功能,为了能用 Fotor 电脑版修图处理打基础. 如图示,启动 Fotor 以后出面界面,有编辑 ...

  7. 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——8 - Fable Of The Lazy Teenager(懒散少年的寓言)

    Unit 8 - Fable Of The Lazy Teenager(懒散少年的寓言) Benjamin Stein weaves a tale to bring home to young Ame ...

  8. 《无聊教程●第一课●教你编一个牛逼的VBScript邮件发送器》

    也许 地球上的你正在看他们的教程 但你不知道 在另一个银河 正上演的一场激烈的战争 那就是 ...... 桃花侠 大战 菊花怪 坑爹啊!! 嘛,没错以上内容皆与课程无关.... { 我发现我写基础.单 ...

  9. 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——5 - A Valentine Story(爱情故事)

    Unit 5 - A Valentine Story(爱情故事) A letter or telephone call comes from someone you have not met, and ...

最新文章

  1. 头条面试归来,有些话想和Java程序员说!
  2. 与SENet互补提升,华为诺亚提出自注意力新机制:Weight Excitation|ECCV2020
  3. ASP.NET 页面事件执行顺序 收藏
  4. NIO 之 Buffer 图解
  5. python findall函数_python正则表达式之中的findall函数是什么?
  6. [蓝桥杯2018决赛]最大乘积-dfs
  7. Calender日历类
  8. OpenCL 第6课:矩阵转置
  9. 27. 二叉树的镜像
  10. upc 9325 序列本质
  11. 个人简历怎么写怎么做(还有怎么培养无私奉献的精神--模板)
  12. 拿来就能跑,1200多套微信小程序源码-史上最全的不同行业的源码集合
  13. 用gambit学博弈论--完全信息动态博弈-参与者信息集、博弈树上虚线的解释(三)
  14. POC_Jenkins
  15. Linux 内核签名(签名内核模块)、linux 驱动签名
  16. 《从0到1上线微信小游戏》第七节 微信排行榜和好友分享功能
  17. 今日头条有麻烦了!App 被下架
  18. 联想小新22H2版跳过联网方法最新方法
  19. 子载波间隔与符号长度
  20. 奇瑞鲍思语将十万级无界Pro推出市场

热门文章

  1. 父组件传递值给子组件(一)
  2. Redis介绍以及安装(Linux与windows)
  3. 插件架构的原理及实现探讨
  4. .xib .plist .pch
  5. 进程函数一步步理解Linux进程(2)--进程编程进程函数
  6. java HashMap的keyset方法
  7. 用C语言写PHP扩展 linux
  8. Velocity语法参考
  9. TensorFlow是什么?怎么用?终于有人讲明白了
  10. html设置表格和div的距离,CSS/HTML Div调整大小和表格定位