今天,同学熊问了我一些基本数据结构的问题,我想这些基础的东西还是应该好好理解的。其实数据结构应该是计算机技术的基石,各种算法都是在数据管理的基础上运行的。
于是,我打算利用业余时间,将我学过的这部分内容整理出来,并且加上一些自己的创新性的内容,做成一份简明扼要的数据结构教程,然后尽可能的深入探讨一些关于这些内容的创新方法和优雅的实现。
回想当年,高中时期的计算机竞赛生涯,一遍遍的啃那些不懂的知识点,也正是因为如此,我虽不算出色,但也拥有了扎实的基本功,在此,我也要感谢我的恩师,我们唐山一中的郭莲凤老师。
恩,那么我将梳理整个数据结构和相关重要算法的脉络,希望由浅入深,逐渐带大家了解各种有趣的问题和精妙的解法,领略数据之美。
本文代码经过基本测试验证,但还是请避免不经测试的使用到生产环境,本人才疏学浅,如果存在疏漏,还望广大网友批评指正。
数据结构简介
数据结构的基础是数据在计算机中的存储结构,最基础的是数组、链表这两种结构。
由链表的思想构建出来的,就是树结构,树结构能非常方便的实现各种快速查询、动态数据管理等难题。
平衡二叉树,应该是最常用的树状结构,用来做TreeMap,用来实现集合Set,可以实现自动排序和判重。
类似树的结构就是图,邻接表就是链表思想的产物,但图还可以按照矩阵的方式存储。
图就有联通分量、图搜索、最短路径、网络流等经典问题。
链表简介
今天我们先介绍链表,因为数组显而易见,连续存放,计算机较为容易实现。
链表的一大好处就是不用确定空间长度,不够的时候,再申请新的节点,而且插入十分方便。
决定数据结构的这样的性质的原因是计算机内存是抽象的连续空间,假若计算机的内存本身就不是这样组织的,也许就没有链表或线性表这种常用的结构了。
回到正题,链表实现的实际上就是计算机空间的一种动态管理,指针跳转的思路也是计算机中管理数据的精髓,我们下面就看一下计算机中指针到底是个什么样子。
指针是一个内存地址的记录,一般用16进制数字表示,32位或64位机器,就是指其用来寻址的总线的位数,我们记录一下数据在计算机内具体存放在哪里,然后就可以在任意时刻找到这个数据。
链表的实现
为了让链表遍历和插入的时候更加方便,我们给链表多增加一个头节点,因为我们希望便利的描述在任意位置插入一个数据,如果链表第一个节点存储第一个数据,定义插入操作是在节点的后面插入,那么我们将不好定义向第一个节点头部插入数据的操作。
那么我们来写一个list.h文件,用C代码编写链表的实现:
#ifndef LIST_H
#define LIST_H
#endif // LIST_H
C语言中,这种定义方式是为了防止头文件的重复引用,由于默认是C语言,我们就不添加 extern "C"标识了。
#ifndef LIST_H
#define LIST_H
typedef int ListElementType;
typedef struct _list
{
ListElementType data;
struct _list* next;
} list;
#endif // LIST_H
这里是链表的经典定义方式,想必学过C数据结构的同志们也十分熟悉,这里介绍一下为何要用ListElementType单独定义类型,C代码不支持模板,代码的定义应该尽可能的灵活,C中的类型定义对提高代码的复用和可移植性上具有重要意义。将类型重定义,往往能让同样的代码运行在不同的环境下。
经典的size_t变量,就是为了让C代码在32位平台上和64位平台上,返回的分别是32位整数和64位整数,他往往被用来描述内存长度,其规模当然要和平台相适应。
typedef struct _list
{
} list;
这种定义方式也是C独特的,因为C中的struct类型在使用时必须这样struct typename idname, 这样定义一下,就方便了使用。
下面我们添加一

——链表&spm=1001.2101.3001.5002&articleId=45048779&d=1&t=3&u=bda6a30622214c9488cc27da233e1d2c)
484

被折叠的 条评论
为什么被折叠?



