线性表的静态链表

静态链表定义

#define Error -1
#define OK   1
#define MaxSize 100
typedef int Status;

typedef int ElementType;
typedef struct {
    int cur;
    ElementType data;
}Compnent,StaticLinkList[MaxSize];

静态链表的增删


//数组的第一个元素,即下标为0的那个元素的cur就存放备用链表的第一个结点的下标
//数组的最后一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下
Status initStaticLinkList(StaticLinkList list){
    for (int i = 0; i < MaxSize-1; i++) {
        list[i].cur = i+1;
    }
    
    list[MaxSize-1].cur = 0;
    
    return OK;
}

//空闲的下标
int malloc_SLL(StaticLinkList list){
    
    int cur = list[0].cur;
    if (cur) {
        list[0].cur = list[cur].cur;
        
    }
    
    return cur;
}
//获得长度
int ListLength(StaticLinkList list){
    int k = list[MaxSize-1].cur;
    int j = 0;
    
    while (k) {
        k = list[k].cur;
        j++;
    }

    return j;
}


//插入
Status staticListInsert(StaticLinkList L, int i, ElementType e){
    if (i <1 || i > ListLength(L)+1 || i > MaxSize-2) {
        return errno;
    }
    //tag是要i的前一个元素的下标值
    int tag = MaxSize-1;
    int cur = malloc_SLL(L);

    if (cur) {
        for (int j = 1; j < i ; j++) {
            tag = L[tag].cur;
        }
        L[cur].data = e;
        L[cur].cur = L[tag].cur;
        L[tag].cur = cur;
    }
 
    return OK;
}

//删除
Status staticListDelete(StaticLinkList L, int i){
   
    if (i < 1 || i > ListLength(L)) {
        return errno;
    }
    int tag = MaxSize-1;
    
    //找到要删除的节点的前一个节点的下标
    for (int j = 1; j < i ; j++) {
        tag = L[tag].cur;
    }
    
    // 将删除的节点的前 一个节点的下标指向后一个节点的下标
    int k = L[tag].cur;
    L[tag].cur = L[k].cur;
        //将被删除的节点添加到备用链表
    StaticListFree_SLL(L, k);

    return OK;
}

// 将下标为K的空闲节点回收到备用链表

void StaticListFree_SLL(StaticLinkList L, int k){
    
    L[k].cur = L[0].cur;
    L[0].cur = k;
}


//打印链表
void staticListLog(StaticLinkList L){
    
    int length = ListLength(L);
    
    
   int tag = L[MaxSize-1].cur;
    for ( int i = 0; i < length; i++) {
        
        printf("%d---", L[tag].data);
        
        tag = L[tag].cur;
    }
    
    printf("------\n");

}



你可能感兴趣的:(线性表的静态链表)