单链表的整表创建
思路如下:
- 声明一节点p和计数器变量i;
- 初始化一空链表L;
- 让L头结点指针指向NULL, 即创建一个空表
- 循环实现后继节点的赋值和插入
头插法:
- 先让新节点next指向头节点之后
- 然后让表头的next指向新节点
尾插法:
从链表的尾部进行插入
静态链表
用数组描述的链表叫做静态链表, 这种描述方法称为游标(cursor)实现法
#define MAXSIZE 1000
typedef struct
{
ElemType data;
int cur; //游标(cursor)
}Component, StaticLinkList[MAXSIZE];
第一个元素, 最后一个元素不存放值。
第一个元素的游标指向第一个没有存储数据的下标, 最后一个元素指向第一个存储值的元素的下标。其余每个元素的游标指向下一个元素的下标
已使用的元素的最后一个元素的下标是0.
Status InitializeLIst(StaticLinkList space)
{
int i;
for (i = 0; i < MAXSIZE - 1; i++)
space[i].cur = i + 1;
space[MAXSIZE - 1].cur = 0;
return true;
}
未使用的数组元素称为备用链表
静态链表插入操作
为辨明数组中哪些分量未被使用, 可将所有未被使用过的以及已被删除的分量用游标连成一个备用的链表。
首先获得空闲分量的下标
int Malloc_SLL (StaticLinkList space)
{
int i = space[0].cur;
if(space [0].cur)
space[0].cur = space[i].cur; //下一个分量做备用
return i;
}
```c
// 在静态链表L中第i个元素插入值
Status ListInsert(StaticLInkList L, int i, Elemtype e)
{
int j, k, l;
k = MAX_SIZE - 1;
if(i < 1 || i > ListLength(L) + 1)
return ERROR;
j =Malloc_SLL(L);
if(j)
{
L[j].data = e;
for (l = 1; l <= i - 1; i++)
k = L[k].cur;
L[j].cur = L[k].cur;
L[k].cur = j;
return OK;
}
return ERROR;
}
静态链表的删除操作
Status ListDelete(StaticLinkList L, int i)
{
int j, k;
if(i < 1 || i > LIstLength(L))
return ERROR;
k = MAX_SIZE - 1;
for (j = 1; j <= i - 1; j++)
k = L[k].cur;
j = L[k].cur;
L[k].cur = L[j].cur;
Free_SLL(L, j);
return OK;
}
void Free_SLL(StaticLinkList space, int k)
{
space[k].cur = space[0].cur;
space[o].cur = k;
}
静态链表优点: 在插入和删除操作时, 只需要修改游标, 不需要移动元素, 从而改进了在顺序存储结构中的问题。
缺点:
没有解决连续存储分配(数组)带来的表长问题
失去了顺序存储结构随机存储的特性。
静态链表是为了给没有指针的编程语言设计实现的一种实现单链表的方法。
437

被折叠的 条评论
为什么被折叠?



