数据结构——动态线性表操作(顺序表)

动态线性表

#define LIST_INIT_SIZE  10   // 线性表存储空间的初始分配量
#define LISTINCREMENT  5    // 线性表存储空间的分配增量
//动态线性表 
typedef struct{
    ListData *data;//存储空间基址,书本上为ElemType *elem
    int length;     //顺序表当前长度 
    int listsize;   //当前分配的存储容量(以sizeof(ListData)为单位) 
}SqList; 

//1.InitList初始化L为空表
int InitList(SqList &L){
    L.data = (ListData*)malloc(LIST_INIT_SIZE*sizeof(ListData));
    if(!L.data)
        exit(0);//存储分配失败
    L.length = 0;//当初长度初始化为0 
    L.listsize = LIST_INIT_SIZE;//指定分配的存储容量 
    return 1; 
}

//2.DestroyList(&L)回收顺序线性表L,空间释放,数值置0
int DestroyList(SqList &L){
    free(L.data);//先释放空间,然后置空
    L.length = 0;
    L.listsize = 0;
    return 1; 
} 

//3.ClearList(&L)清空线性表
int ClearList(SqList &L){
    L.length = 0;
    return 1;
} 

//4.ListEmpty(SeqList L),判断是否为空,若是返回1
int ListEmpty(SqList L){
    return (!L.length);
} 

//5.ListLength(L)求表L的长度
int ListLength(SqList L){
    return(L.length);
} 

//6.GetElem(L,i)获得线性表L中的第i个元素
ListData GetElem(SqList L,int i){
    if(1<=i &&i<=L.length)
        return(*(L.data+i-1));
    else return NULL;
}

//7.1LocataElem(L,x),查找x在表L中的位置
int LocateElem(SqList L,ListData x){
    int i=0;
    while((i<L.length) &&(*(L.data)!=x)) i++;//查找 
    if(i<L.length) return i;//成功,返回位置 
        else return -1;//失败 
} 

//7.2 IsIn(L,x)判断x是否在表中,若是返回1,否则返回0
int IsIn(SqList L,ListData x){
    int i=0,found =0;
    while((i<L.length)&&!found){
        if(*(L.data+i)!=x) i++;
          else found=1; 
    }
    return found;
} 

//8.NextElem(L,x)求x的直接后继, 如果x在表L中且
//有直接后继,函数值返回其直接后继的位置,否则返回-1
int NextElem(SqList L,ListData x){
    int i=0;
    while((i<L.length)&&(*(L.data+i)!=x)) i++;
    if((0<=i)&&(i<L.length-1)) return i+1;
        else return -1;
} 

//9.PriorElem(L,x)求x的直接前驱
int PriorElem(L,x){
    int i=0;
    while((i<L.length)&&(*(L.data+i)!=x)) i++;
    if((i>0) && (i<L.length)) return i-1;
        else return -1;

} 

//10.ListInsert(&L,i,e)在顺序表L中的第i个元素前插入e
//成功返回1,否则返回0
int ListInsert(SqList &L,int i,ListData e){
    ListData *newbase,*q,*p;
    if((i<1)||(i>L.length+1)) return 0;//输入的i不合法
    if(L.length==L.listsize){// 当前存储空间已满, 增加分配空间
        newbase=(ListData*)realloc(L.data),(L.listsize+LISTINCREMENT)
                *sizeof(ListDara));// realloc改变L.data所指内存的大小,原始所指内存中的数据不变。

        if(!newbase) exit(0);//申请新空间失败 
        L.data=newbase;//新基址 
        L.listsize+=LISTINCREMENT;//增加存储容量      
    } 
    q=L.data+i-1//指定插入的位置 
    for(p=L.data+L.length-1;p>=q;--p) *(p+1)=*p;// q之后的元素右移
    *q=e; ++L.length; // 插入e ,表长增1 
    return 1; 
} 

//11.ListDelete(&l,i)在顺序表L中删除第i个元素,成功返回1,否则返回0
int ListDelete(SqList &L,int i){
    ListData *p,*q;
    if(i<1 ||i>L.length) return 0;//i值不合法 
    p=L.data+i-1; //p为被删除元素的位置 
    q=L.data+L.length-1;//表尾元素的位置 
    for(++p,p<=q;++p){//被删除元素之后的元素左移 
        *(p-1)=*P;
    }
    L.length--;//表长-1 
    return 1;
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值