此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢!
一、静态链表(Static Linked List):
- 静态链表(Static Linked List):用数组代替指针描述的链表,也称游标实现法。
Each element in a static linked list includes two fields:
1.“data field” for storing data;
2.“cur field”, cursor, for storing the next element’s index, having the same function as the “p->next” above.
静态链表的数组的元素由两个数据域组成:data(数据域)及cur(游标域)。其中,data存放数据元素,cur相当于单链表中的next指针,存放当前元素的后继在数组中的下标。
(为了方便插入数据,我们通常会把数组建立得大一些,可以便于插入时不至于溢出)
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType; //ElemType的类型根据实际需求而定,此处假设为int。
typedef int Status; /*"Status" is defined as a type of a function, with its returned value representing the result of the function.
(Status是函数的类型,它的返回值势函数结果状态代码,0或1.)*/
#define MAXSIZE 1000
typedef struct
{
ElemType data;
int cur; //cursor(游标), means non-pointing when its value is 0.
} Component, StaticLinkList[MAXSIZE];
另外,我们对数组第一个和最后一个元素作为特殊元素处理,不存储数据。我们通常把未被使用的数组元素称为备用链表(Spare List)。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组最后一个元素的cur则存放第一个有数值的元素的下标,其作用相当于单链表中头结点。
二、静态链表部分操作具体实现:
- 初始化静态链表:(将一维数组space中各分量链成一备用链表)
[Initialize a Static linked list.] //将一维数组space中各分量链成一备用链表
Status InitList ( StaticLinkList space )
{
int i;
for( i=0 ; i<MAXSIZE-1 ; i++ ) //"i<MAXSIZE-1"--the last element is special.
{
space[i].cur = i+1;
}
space[MAXSIZE-1] = 0; //Since the list is now empty, the last element's "cur" is 0.
return OK;
}
- 静态链表存储空间的分配:
(须知)
–In dynamic link lists, we can use “malloc()” and “free()” to achieve the application and release of nodes. 在动态链表中,结点的申请和释放可分别借用"malloc()"和"free()"两个函数来实现。
–In static link lists, we operate arrays. So we cannot do the same as above. We need to achieve ourselves. 在静态链表中,操作的是数组,不存在像动态链表的结点申请和释放问题,所以我们需要自己去实现,才能进行插入和删除的操作。
为了辨明数组中哪些分量未被使用,解决的办法是:将所有未被使用过的及已被删除的分量用游标链成一个备用的链表,每当进行插入时,便可以从备用链表上取得第一个结点作为待插入的新结点。
- “Malloc_SLL”&