1. 线性表
在很多编程语言中,都会有数组这一数据类型。在存储数量不变的、类型确定的数据时,数组是轻便而高效的,用起来麻利爽手。然而,遗憾是我们在处理稍微复杂一点的问题时总是遇到数据数量不确定的情况(当然,类型是确定的,类型不确定的情况,将在下面广义表一节中讨论),这时候数组用起来就很难受了(在C、C++,Java、C#中,尽管可以动态分配数组,但是分配时,数组大小还是必须得明确的)。这个时候我们会想,要是数组可以变长多好?这样就不用考虑数据数量的多少了。如果你这样想,那么线性表就是你想要的东西。
1思想
线性表是一种存储同类型数据,长度可以动态分配的数据线性存储结构。线性存储是说数据存储时,数据单元在逻辑上是一个跟着一个,呈一条直线状的。C++中对应的实现为类模板vector<>,C#中实现为泛型类ArrayList<>。
2实现原理
线性表一般有两种形式:
一、用数组存储数据单元,当数据数量达到数组大小时,重新建立一个数组,其大小为原数组的两倍,并将原数组中的数据复制到新数组中。C++中的向量vector<>已经字符串类string都是这种实现方式(注意,C#以及Java中的string则不同,它们存储的更像是常量,可以给它们赋新值,但不能修改这个字符串)。这种实现方式主要的优势是实现简单,存取数据容易,但删除数据麻烦,且有浪费存储空间的嫌疑。
用C语言实现时,一般用一个自定义结构类型将数组封装起来,并需要定义一系列对其进行操作的函数。下面给出简略信息:
结构定义:
typedef struct
{
int count;
int maxSize;
int *array;
}illist_a;
(注:这里当然还有其他辅助变量如count用于记录数据的个数,而maxSize则用于记录数组的长度,即最多可存储数据的个数。)
操作函数(一般包含初始化,添加,删除,获取,查找五种):
int illist_a_init(illist_a *list);
int illist_a_init_size(illist_a *list,int size);
int illist_a_add(illist_a *list,int element);
int illist_a_remove(illist_a *list,int index);
int illist_a_get(illist_a*list,int index,int *var);
int illist_a_search(illist_a *list,int value,int order);
(注:这里的命名规则:最前面的i表示数据类型int,llist表示线性表(linearlist),而后面的a表示用数组(array)实现,最后面的如init,add都表示函数的功能。)
二、数组是连续存储的,每次都分配定量空间,所以有可能浪费空间。这里,如果用离散存储方式(当然这里用的是链表)。用链表存储可以轻松进行添加删除操作,空间只有在加入数据时才分配,删除数据时立马释放空间,轻松客服用数组的缺点。当然,链表也有缺点,它的查找数据操作复杂,且数据单元不只存储数据,当数据量不大时,也会导致存储空间利用率低的问题。
用C语言实现时,需要定义一个结构类型,作为数据单元的存储类型,将数据与地址包装起来。如下:
结构定义:
typedefstruct ll_node
{
int data;//store data
struct ll_node *next;//pointer to next element(node)
}llist_node;
此外也还需要定义一个结构类型,用于封装链表(当然还有其他辅助变量),如下:
结构定义:
typedef struct
{
int count;//store the number of element
llist_node *root;//point to the root node of the linked list
}illist_l;
操作函数(一般包含初始化,添加,删除,获取,查找五种):
void illist_l_init(illist_l *list);
void illist_l_delete(illist_l *list);
int illist_l_add(illist_l *list,int element);
int illist_l_remove(illist_l *list,int index);
int illist_l_get(illist_l *list,int index,int *var);
int illist_l_search(illist_l *list,int value,int order);
(注:这里的命名规则:最前面的i表示数据类型int,llist表示线性表(linearlist),而后面的l表示用链表(linked list)实现,最后面的如init,add都表示函数的功能。)
可以到百度云:http://pan.baidu.com/s/1rsMZW 或GitHub:https://github.com/githubligao/Data-Structure.git上下载我的实现代码。
线性表的所有实现存放在LinearList文件夹中。
使用数组实现的在头文件int_LinearList_Array.h中。
链表实现则在int_LinearList_Linked.h中。