线性表 初始化 插入 删除 的操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/blacop/article/details/56335149
 #include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(ElemType)

#define OK 1
#define TRUE 1
#define ERROR -1
#define FALSE -1
#define OVERFLOW -2

typedef int ElemType
typedef int Status
const LIST_INIT_SIZE=100;//表初始分配空间
const LIST_INCREMENT=10;//空间分配增量
typedef struct { //封装一个线性表 为SqList
    ElemType *elem;//存储空间,存放头地址,也可表示数组的名字 或地址  或第一个元素
    int length;//线性表当前长度    
    int listSize;//当前存储容量
    int LIST_INCREMENT;//可增加存储容量
} SqList; 

Int ListEmpty(SqList L){ //判断线性表L是否为空
    if L.length=0 return TURE;
    else return FALSE;
}

int ListLength_Sq(SqList L){ //求线性表的长度
    return L.length;
}


Status InitList_Sq(SqList &L){ //初始化空的线性表,&L 引用参数表示会修改值
    //构造空表
    L.elem =(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配内存,返回void*指针,类型强转一下
    if(!L.elem) exit(OVERFLOW);//OVERFLOW是返回到OS的
    L.length=0;
    L.listSize=LIST_INIT_SIZE;
    return TRUE;
}//InitList_Sq

Status ListInser_Sq(SqList &L,int i,ElemType e){ //插入线性表,i是下标+1表示序号,E是插入值
    if( i<1 || i>L.length) return FALSE;//i的合法值为1<=i<=ListLength_Sq(L)
    if(L.length>=L.listSize){ //当前存储空间已满,(realloc就是)增加内存分配,函数realloc()
        // void* realloc(void* ptr, unsigned newsize);  给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度.
        newbase =(ElemType *)realloc(L.elem,L.(LIST_INIT_SIZE+LIST_INCREMENT)*sizeof(ElemType)); 
        if(!newbase) exit(OVERFLOW);//存储分配失败
        L.elem = newbase;//新的地址
        L.listSize += LIST_INCREMENT;//增加存储容量       
    }
    q = &(L.elem[i-1]);//q为插入位置
    for(p=&(L.elem[L.length-1]); p>=q; --p) { //插入位置及其之后的元素右移
        *(p+1) = *p;
    }
    *q = e;//插入e 的值
    ++L.length;//表长度+1
    return TRUE;
}//ListInser_Sq

Status ListInser_Sq_Se(SqList &L,int i,ElemType e){ //插入线性表 简化写法 使用指针 不要新开辟内存
    if( i<1 || i>L.length ) return FALSE;//i的合法值为1<=i<=ListLength_Sq(L)
    if(L.length>=L.listSize) exit(OVERFLOW);//超出存储空间,报错退出
    q = &(L.elem[i-1]);//q为插入位置
    for(p=&(L.elem[L.length-1]); p>=q; --p) { //插入位置及其之后的元素右移,p=&(L.elem[L.length-1]表示最末尾的指针,
        *(p+1) = *p;
    }
    *q = e;//插入e 的值
    ++L.length;//表长度+1
    return TRUE;
}

Status ListDelete_Sq(SqList &L,int I,ElemType &e){ //删除线性表中的第i个元素
    //删除L中第i个元素,后面的元素前移
    if((i<1)||(i>L.length)) return FALSE;
    p=&L.elem[i-1];//p表示删除的地址
    e=*p;//返回e的值
    q=L.elem+L.length-1;//q存放的是线性表内最后位置的指针
    for(++p;p<=q;++p) { //后面的元素前移,先++p是因为p的位置是删除的位置,所以从删除位置的右边+1算起
        *(p-1)=p;//删除的位置 后面的元素前移
    }
    --L.length;
    return TRUE;
}

Int CompareArray(SqList A,SqList B){ //比较数组大小的方法
    j=0;//计数器
    while(j<A.length && j<B.length)
    {
        if(A.elem[j]<B.elem[j]) return -1;
        else if(A.elem[j]>B.elem[j]) return 1;
        else j++;
    }
    if(A.length==B.length) return 0;
    else if(A.length<B.length) return -1;
    else return 1;
}//CompareArray
展开阅读全文

没有更多推荐了,返回首页