美文网首页
线性表的静态链表

线性表的静态链表

作者: hhhhhhhhhh1655 | 来源:发表于2018-03-28 14:40 被阅读3次

    静态链表定义

    #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");
    
    }
    
    
    
    

    相关文章

      网友评论

          本文标题:线性表的静态链表

          本文链接:https://www.haomeiwen.com/subject/ljnycftx.html