数据结构之线性表(一)

因为准备考研的原因,想对数据结构进行深入学习,准备写博客来记录学习的知识。如有问题的地方望各位大佬指出。


首先定义:线性表是具有相同特性数据元素的一个有限序列。

线性表的存储结构有顺序存储结构和链式存储结构两种。第一种称为顺序表,第二种称为链表。(对于两种结构的记忆,顺序表跟数组类似,而链表像生活中的火车。)

关于存储结构的比较

1.顺序表要求占用连续的存储空间;

2.而链表支持存储空间的动态分配,同时也支持申请一片连续的存储空间;(刚开始接触产生了链表只能动态分配存储空间的错觉)

3.静态链表用数组来表示,需要一片较大的连续空间。

关于顺序表与链表结构的优缺点:

1.顺序表可以直接访问表中的元素,而链表则需要通过结点的遍历来访问到位置元素。

2.顺序表的添加与删除元素时间复杂度较高,而链表的则较低。

解释:因为顺序表除了添加或者删除最后一个元素,都需要通过移动元素来覆盖删除的元素,添加元素时需要移动元素将插入的位置空出来。链表是通过改变指针来添加和删除元素的,所需要的只是找到要进行操作的位置。

下面记录一下线性表的基本操作部分代码和操作思路。

首先是顺序表

typedef struct array{
    int *data;
    int size,length;
}array;

顺序表的结构体定义如上所示,*data表示表的数据域,size表示表的大小,该大小为init时申明的,length表示表当前长度。

init操作对于指针进行内存申请,size初始化为给定的大小,length初始化为0。

插入操作首先判断插入位置是否合法,非法返回0;如果合法,判断顺序表的长度是否已经到了最大,如果到了,将顺序表扩容,之后将插入位置后面的所有元素往后移动一个位置,在将位置设置为插入的值,插入后长度加一。

删除操作首先也是判断位置是否合法,移动元素覆盖目标位置的元素,要注意的是应从删除位置的右边第一个元素开始移动而非顺序表的最后一个元素。

打印表操作即为遍历完整个表,一个一个输出就可以了。

如果编写整个程序还要在主函数的最后对顺序表进行内存释放。

free(array->data);
free(array);

首先要对顺序表的指针域进行释放,之后再释放顺序表。


本篇记录顺序表的基本操作,下一篇记录链表的基本操作以及一些概念。

猜你喜欢

转载自blog.csdn.net/slamdunkofkd/article/details/80055514