考研数据结构之顺序表 (待续)

考研数据结构之顺序表 (待续)

//顺序表专题 


#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100 

//结构体定义
typedef struct{
    int data[MAXSIZE];
    int length;
}sqlist;   

//@function 将元素e插入在顺序表中的第i个位置上 
//@param  sqllist(待插入的顺序表)  e(待插入元素)   i(插入位置) 
//@return  返回成功的标记 
int insert(sqlist &L, int e ,int i){
    if(i<1 || i>L.length+1 || i>MAXSIZE){      //三种非法插入位置 
        return 0;
    }
    for(int j = L.length; j >= i ;j--){       //元素后移 
        L.data[j] = L.data[j-1];  
    }
    L.data[i-1] = e;                          //插入数据 
    L.length++;
    return 1; 
} 

//@function 删除顺序表中第i个元素 
//@param  sqllist(待删除的顺序表)  e(待删除元素)   i(待删除的位置) 
//@return  返回成功的标记 
int deletei(sqlist &L ,int i ,int &e){
    if(i<1||i>L.length){
        return 0;
    } 
    L.data[i-1] = e;
    for(int j = i-1; j<L.length; j++){
        L.data[j] = L.data[j+1];
    }
    L.length -- ;
    return 1;         
} 

//@function  根据所给的数据查询顺序表中是否存在  
//@param    略 
//@return 返回对应元素的在数组中的下标(或下标+1   位置) 
int findByData(sqlist &L, int e){
    for(int i = 0 ; i<L.length ; i++){
        if(L.data[i]==e){
            return i;   
        }
    }
    return -1;
} 


//@return   待输出的顺序表 
int display(sqlist &L){
    for(int i = 0 ;i < L.length ;i++){
        printf("%d->%d",i,L.data[i]);
    }
}


//第一题

//从顺序表中删除具有最小值的元素  (假设唯一) 
//并且由函数返回被删除的元素值。
//空出的位置由最后一个元素填补,
//如果顺序表为空则显示错误信息 
int fun1(sqlist &L){
    int min = L.data[0];
    int local =0;  //要删除的位置 
    if(L.length<1){
        return 0;
    }
    for(int i = 0;i<L.length;i++){
        if(L.data[i]<min){
            min = L.data[i];
            local = i;
        }
    }
    L.data[local] = L.data[L.length-1];
    L.length--;
    return 1;
}
//第二题
//设计一个高效的算法,将顺序表的所有元素逆置 要求算法空间复杂度度为0(1)
void fun2(sqlist &L){
    int temp = 0; //temp就是空间复杂度O(1) 
    int i = 0 ;
    int j = L.length-1;
    for(;i>=j;){
        temp = L.data[i];
        L.data[i] = L.data[j];
        L.data[j] = temp;
        j--;
        i++;
    }
} 
//第三题 
//长度为n的线性表L编写时间复杂度为0(n)  空间复杂度为0(1)的算法
//实现删除线性表中所以 值为x 的元素 
void fun3(sqlist &L,int x){
    int k = 0;
    for(int i = 0 ;i<L.length;i++){    //思路:找出所有不等于x的元素 
        if(L.data[i] != x){            //将所有的不等于x的元素反正数组最前面 
            L.data[k] = L.data[i]      //设置数组长度为  非x元素的个数  k 
        }
        k++;
    }
    L.length = k ;
}  


//第四题
//从有序的的顺序表中删除其值在给定值s,t之间 ( 要求s<t ) 的所有元素
//如果不合理或则空表则退出
void fun4(sqlist &L,int s ,int t){
    //先找到两个位置  以及需要删除的个数
    int s1=-1,t1=-1;
    if(s>t||L.length==0){
        return 0; 
    } 
    for(int i = 0;i<L.length;i++){
        if(L.data[i]>=s&&s1!=-1){
            s1 = i;
        }
        if(L.data[i]<=t&&t1!=-1){
            t1 = i
        }
    }
    //设置数组长度 
    L.length = L.length - (t1-s1+1);

    //后面的整体移动 
    for(int j=t1+1;j<L.length;j++){
        L.data[j] = L.data[s1];
        s1++;
    }
    return 1;
} 





int main(int argc, char *argv[])
{
    sqlist L ;
    L.length = 0;
    display(L);

    int result = insert(L,1,1);
    display(L);
    printf("%d",result);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值