线性表
线性表是一个典型的线性结构,而数组和链表都属于线性表(可能这里的属于这个词不够准确),对线性表的操作也有很多,下面主要介绍数组和链表,而这两个是特殊的线性表,也是我们经常用到的。
下面我来说一下这几个的区别:
- 线性表是一种抽象数据类型,其中元素之间是一对一的线性关系。每个元素之间的储存地址不一定是连续的,只要有一对一的对应关系就可以了。
- 数组是一种具体的数据结构,是元素与下标的一种映射,他们的储存位置是连续的。
- 链表也是一种具体的数据结构,和数组有共同点,也有不同点。链表能够实现数据的灵活储存,在元素增减的时候别数组要方便得多。
数组
数组是下标和数据元素组成的集合,数组分为不同维度的数组,常见的有一维,二维。下面我主要介绍数组的线性储存方式和特殊矩阵的压缩储存方法。
数组的线性储存方式
一维数组线性方式,大家肯定很轻松的知道其储存方式,但是对于多维来说呢,例如二维数组,存储方式可以是以行优先或者列优先。假设一个数组a[2][3]={1,2,3,4,5,6},以行优先就是这个:{{1,2,3},{4,5,6}},而以列优先就是{{1,2}{3,4}{5,6}}。一般的数组都是默认以行优先的。
链表
单链表
单链表包括两个部分:
- 数据域:用来存放数据元素的值。
- 指针域:用来存放下一个数据的位置。
这样由数据域和指针域就构成了一条链子的形状。
链表的类型定义:
typedef struct LNode
{ int date;
struct LNode *next;
}LNode,*Linklist;
//这里的LNode是结点,而Linklist是指针,指向的就是LNode。
然后就有关于链表的插入,删除,查找等操作了,这些在这里就不进行详细的讲解。
静态单链表
静态单链表就相当于是结构体里面是两个变量,他们之间有对应关系,而且静态单链表的元素个数是最初定义好的。
下面给出静态单链表的类型定义:
typedef struct
{
int date;
int index;
}SLNode;
typedef struct
{
SLNode store[n];//这里的n就是静态单链表的数量
int free_h;//free_h是指数组中到哪个位置没有元素,就是这个链表的尾部标记
}SqLinkList;
这就是静态单链表的类型定义,这个应该很好理解。
双向链表
双向链表与单向链表的区别就是,这个元素中不只有指向下一个元素的指针还有指向上一个元素的指针。
下面给出类型定义:
typedef struct DNode
{ int date;
struct DNode *next,*prior;//next指针指向下一个,而prior指针指向上一个。
}DNode,*Dinklist;
其实双向链表和单向链表之间的区别并不大,只要理解了单向链表就能轻松的掌握双向链表。