一. 线性表之顺序表的基本操作

     线性表的顺序存储又称顺序表。她是用一组连续的存储单元,依次存储线性表中的数据元素,从而使得在逻辑上相邻的元素在物理位置上也相邻。

顺序表的基本操作。




//顺序表的存储类型描述
#define MAXSIZE 50
typedef int ElemType;
typedef struct{


    ElemType data[MAXSIZE];
    int length;
    int maxSize;


}SqList;

//初始化顺序表
void init(SqList &L){
    L.length = 0;
    L.maxSize = MAXSIZE;
}

//因为要多次输出以查看结果,为增加程序的可读性用一个函数来表示输出
void print(SqList &L){
    int i=0;
    for(i=0;i<L.length;i++){
        printf("%d ",L.data[i]);
    }
    printf("\n");
}


bool ListInsert(SqList &L,int i,ElemType e){//在线性表的i位置上插入元素e


    if(i<1||i>L.length+1) return false;//因为插入的位置是可以为第一位置和最后一个位置之间的任何位置,如果不在这一范围内则非法

    if(L.length+1 > L.maxSize) return false;//表的长度也不能大于最大长度

    for(int j=L.length;j>=i;j--)

        L.data[j] = L.data[j-1];//插入元素所在位置后的所有元素后移一位


    L.data[i-1] = e;//在i位置上插入e,这里为i-1是因为L.data[]是一个数组,下标从1开始。


    L.length += 1;
    return true;

}

注:需要指出的是,线性表中的元素的位序(相当于数组的下标)从1开始



bool listDelete(SqList &L,int i ,ElemType &e){//删除线性表 中第i个元素
    if(i<1||i>L.length)
        return false;
    e=L.data[i-1];
    for(int j=i;j<L.length;j++){
        L.data[j-1]=L.data[j];
    }
    L.length--;
    return true;
}


int ListLocated(SqList &L,ElemType e){
    int i=0;
    for(i=0;i<L.length;i++){
        if(L.data[i]==e){
            printf("%d",i+1);
            return i+1;


        }
    }
    return 0;
}


//查找整个顺序表,查找最小的元素并记住其位置,搜素结束后用最后一个元素填补原最小值的位置
bool Del_min(SqList &L,ElemType &value){
    int i=0;
    int pos=0;
    if(L.length==0)
        return false;
    value=L.data[0];//假设第一个元素是最小值
    for(i=0;i<L.length;i++){


        if(L.data[i]<value)
        value=L.data[i];
        pos=i;
    }
    L.data[pos]=L.data[L.length-1];
    L.length--;
    return false;


}


//逆置顺序表
void Reverse(SqList &L){
    int i=0;
    int temp=0;//辅助变量
    //遍历表的前半部分
    for(i=0;i<(L.length)/2;i++){
        temp=L.data[i];
        L.data[i]=L.data[L.length-i-1];
        L.data[L.length-i-1]=temp;
    }


}


//删除表中所有值为e得值
void Del_value_x1(SqList &L,ElemType e){
    int i=0;
    int k=0;
    for(i=0;i<L.length;i++){
        if(L.data[i]!=e){
            L.data[k]=L.data[i];
            k++;
        }


    }
    L.length=k;
}

//删除表中所有值为e的值
void Del_value_x2(SqList &L,ElemType e){
    int i=0;
    int k=0;
    for(i=0;i<L.length;i++){
        if(L.data[i]==e){
                k++;
        }else{
        L.data[i-k]=L.data[i];


        }
    }
    L.length-=k;
    //printf("%d",k);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值