//1、判断链表是否为空
bool isEmpty(Node * list, int addr){ //如果addr=0,就是判断备用链表是否为空;任何addr=1,就是判断数据链表是否为空
if (list[addr].cur == 0){
printf("Spare list is empty!\n");
return true; //为空
}
return false; //不为空
}
// 2、求链表长度
int length_list(Node * list){
int cur = list[1].cur;
int length = 0;
for (int i = 0; i < MAXSIZE; ++i) {
if (cur == 0 && i == 1){
return length;
} else if (cur == 0){
return length;
}
length++;
cur = list[cur].cur;
}
}
// 3、判断addr是否在区间中
bool isBetween(Node * list, int addr){
if (addr<0 || addr>length_list(list)){
printf("Addr is not in the list!\n");
return false; //不在区间中
}
return true; //在区间中
}
//4、删除一个节点
void delete_node(Node * list, int addr1, int delete_addr2){
list[addr1].cur = list[delete_addr2].cur;
}
//5、插入一个节点
void insert_node(Node * list, int addr1, int insert_addr2){
list[insert_addr2].cur = list[addr1].cur;
list[addr1].cur = insert_addr2;
}
//6、抽取一个节点
int allocation_node(Node * list){
int addr = list[0].cur;
delete_node(list,0,addr);
return addr;
}
//7、定位到addr的前一个节点
int location_addr(Node * list, int addr){
int cur = 1;
for (int i = 1; i < addr; ++i) {
cur = list[cur].cur;
}
return cur;
}
2、基础函数
(1)初始化链表
(2)插入元素
(3)遍历元素
(4)删除元素
(5)查找元素
// 1、初始化静态链表
void init_list(Node * list){
for (int i = 0; i < sizeof(StaticList)/sizeof(Node); ++i) {
list[i].data = 0;
if (i == MAXSIZE-1){
list[i].cur = 0;
} else if (i == 0){
list[i].cur = i+2;
}else if (i == 1){
list[i].cur = 0;
} else{
list[i].cur = i+1;
}
}
}
//2、插入元素
Status insert_elem(Node * list, int addr, ElemType elem){
// 1、判断
if (isEmpty(list,0))
return Error;
if (addr<0 || addr>length_list(list)+1){
printf("Addr is not int the list!\n");
return Error;
}
//2、插入一个元素
int al_addr = allocation_node(list); //从备用链表获取空间
list[al_addr].data = elem;
int lo_addr = location_addr(list,addr);
insert_node(list,lo_addr,al_addr);
return Ok;
}
//3、遍历元素
Status traverse_list(Node * list){
int cur = list[1].cur;
for (int i = 0; i < MAXSIZE; ++i) {
if (cur == 0)
return Error;
printf("%-4d",list[cur].data);
cur = list[cur].cur;
}
return Ok;
}
//4、删除元素
Status delete_elem(Node * list, int addr){
//1 判断
if (isEmpty(list,1))
return Error;
if (!isBetween(list,addr))
return Error;
//2 删除节点
int lo_addr = location_addr(list,addr); //定位到前一个节点
int after_adr = list[lo_addr].cur;
list[after_adr].data = 0;
delete_node(list,lo_addr,after_adr);
insert_node(list,0,after_adr);
return Ok;
}
//5、查询元素
int return_addr(Node * list, ElemType elem){
//1 判断
if (isEmpty(list,1))
return Error;
//2 定位
int addr = 0;
int cur = 1;
for (int i = 0; i < MAXSIZE; ++i) {
if (cur == 0){
printf("The element is not in the list!\n");
return Error;
}
if (list[cur].data == elem)
return addr;
addr++;
cur = list[cur].cur;
}
}