注:我们先由简到难总结一下常用的数据结构,如简单数组、链表、散列表、队列、栈、树、图等等,最后再来研讨算法。
一、线性表
线性表是很基本的一种数据结构,就如字面意思一样,它把若干数据线性组合在一起:每个元素都最多只有前相邻和后相邻元素,也就是元素之间首尾相接。典型的线性表结构有数组、链表、栈、队列等。它有一些特征(摘自百度百科):
1.集合中必存在唯一的一个“第一元素”。
2.集合中必存在唯一的一个 “最后元素” 。
3.除最后一个元素之外,均有唯一的后继(后件)。
4.除第一个元素之外,均有唯一的前驱(前件)。
注意:循环链表也是一种线性表结构,只是第一个元素和最后一个元素首尾相连。
二、数组
数组是一种元素序列,本身就是一种线性表结构,它用一块连续的内存空间把相同类型的一些元素无序的组合起来(关于相同类型的说法并不是绝对的,比如VFP中并没有要求数组中必须存储相同类型的元素,我们只是站在数据结构的角度这样说)。关于数组,相信大家都很熟悉,用的也比较多,特性之类的也比较了解,我们只需要强调一点,就是数组怎么实现“随机访问”时间复杂度为O(1)的?
这里面有关键的两点,一是它的内存空间是连续的,二是存储相同的数据类型。具体是什么意思呢?我们在malloc(动态分配)一块内存的时候,会指定所需空间的大小,比如:
int *p = (int*) malloc(sizeof(int) * 10);
我们要创建一个数组,那么一开始就确定了类型:type,同时我们指定数量:n,那么需要的内存空间大小就能直接算出来:sizeof(type) * n。malloc函数分配该大小的内存空间,如果成功会返回指向被分配内存空间的指针,该指针指向此内存区域的起始地址。当然我们需要把void *类型转换为我们确定的类型,比如int *。