用数组实现静态链表
静态链表结构体
#define MAXSIZE 300
typedef int elem_type;
typedef struct {
elem_type data; //数据域
int cur; //数组游标
} component, static_link_list[MAXSIZE];
静态链表函数
//初始化静态链表
void init_sll(static_link_list space)
{
int i;
space[MAXSIZE - 1].cur = 0;
for(i=0; i < MAXSIZE-2; i++) {
space[i].cur = i+1;
}
space[MAXSIZE - 2].cur = 0;
}
//静态链表数据长度
int length_sll(static_link_list space)
{
int i, pos;
pos = space[MAXSIZE - 1].cur;
i = 0;
while(pos) {
i++;
pos = space[pos].cur;
}
return i;
}
//返回静态链表中空闲位置
int malloc_sll(static_link_list space)
{
int i;
i = space[0].cur;
if(!space[0].cur)
exit(0);
space[0].cur = space[i].cur;
return i;
}
//返回静态链表的最后一个元素
int tail_sll(static_link_list space)
{
int k = space[MAXSIZE - 1].cur;
int tail = 0;
while(k) {
tail = k;
k = space[k].cur;
}
return tail;
}
//向静态链表插入元素
int insert_sll(static_link_list space, int pos, elem_type e)
{
int i,j,k;
int tail;
if(pos < 1 || pos > length_sll(space) + 1)
return LH_ERROR;
j = space[MAXSIZE-1].cur;
i = 1;
while (j && i < pos-1) {
i++;
j = space[j].cur;
}
k = malloc_sll(space);
space[k].data = e;
if (j == 0 && i == 1) { //空表状态插入第一个元素
space[k].cur = 0;
space[MAXSIZE - 1].cur = k;
} else if (j > 0 && pos == 1) { //非空表状态插入元素到链表头
space[k].cur = space[MAXSIZE - 1].cur;
space[MAXSIZE - 1].cur = k;
} else if (pos == length_sll(space) + 1) { //插入到链表表尾
tail = tail_sll(space);
space[tail].cur = k;
space[k].cur = 0;
} else { //其余非空表状态下插入元素
space[k].cur = space[j].cur;
space[j].cur = k;
}
return LH_OK;
}
//遍历非空静态链表
void traverse_list(static_link_list space)
{
int j = 0;
int i = space[MAXSIZE - 1].cur;
while(i) {
j++;
printf("[No.%d][i:%d] --> %d\n", j, i, space[i].data);
i = space[i].cur;
}
}
//删除静态链表中的元素
int delete_sll(static_link_list space, int pos, elem_type * e)
{
int i,j,k;
k = space[MAXSIZE - 1].cur;
i = 1;
if(pos < 1 || pos > length_sll(space) || k == 0)
return LH_ERROR;
while(i < pos - 1) {
k = space[k].cur;
i++;
}
if (e != NULL)
*e = space[k].data;
if (pos == 1) {
space[MAXSIZE-1].cur = space[k].cur;
space[k].cur = space[0].cur;
space[0].cur = k;
} else {
j = space[k].cur;
space[k].cur = space[j].cur;
space[j].cur = space[0].cur;
space[0].cur = j;
}
return LH_OK;
}
//获取静态链表中的元素
int get_elem_sll(static_link_list space, int pos, elem_type * e)
{
int i,k;
k = space[MAXSIZE - 1].cur;
i = 1;
if(pos < 1 || pos > length_sll(space) || k == 0) {
return LH_ERROR;
}
while(i < pos) {
k = space[k].cur;
i++;
}
if (e != NULL)
*e = space[k].data;
return LH_OK;
}
//返回静态链表第一个节点
int head_sll(static_link_list space)
{
int head;
head = space[MAXSIZE-1].cur;
return head;
}
//返回静态链表最后一个元素
int tail_sll(static_link_list space)
{
int k = space[MAXSIZE - 1].cur;
int tail = 0;
while(k) {
tail = k;
k = space[k].cur;
}
return tail;
}