#include<stdio.h>
#include<stdlbib.h>
#define MaxSize 20
typedef strict{
int data[MaxSize];
int length;
}SqList;
//第一题,删除最小的元素,并返回,空出位置由最后一个元素补上
bool DeleteMin(SqList &L,ElemType &value){
if(L.length ==0) //表空,中止操作返回
return false;
int temp=L.data[0];
for(int i=1;i<L.length;i++){ //找到最小元素的位置i,并使该元素值富于value
if(L.data[i]<L.data[t]){
t=i;
value=L.data[i];
}
}
L.data[t] = L.data[L.length-1];//空出位置由最后一个元素值填补
return true;
}
//第二题,顺序表L逆置,空间复杂度为O(1)
void Reverse(SqList &L){
ElemType p;//辅助变量
for(int i=0;i<L.length/2;i++){
p = L.data[i];
L.data[i] = L.data[L.length-i-1];
L.data[L.length-i-1] = p;
}
}
//第三题,删除线性表中所有值为x的元素,时间复杂度为O(n),空间复杂度为O(1)
void delete_x_1(SqList &L,ElemType x){
//记录不等于x的元素个数k,并将不等于x的元素前移k位
int k = 0;
for(int i = 0;i<L.length;i++){
if(L.data[i]!=x){
L.data[k] = L.data[i];
k++;//不等于x的元素增1
}
}
L.length = k;
}
void delete_x_2(SqList &L,ElemType x){
//记录等于x的元素个数k,并把不等于x的元素向前移动k位
int k=0,i=0;//k记录等于x的元素个数
while(i<L.length){
if(L.data[i] == x) k++;
else{
L.data[i-k] = L.data[i];//当前元素前移k位
}
i++;
}
L.length -=k;//顺序表表长递减
}
//第四题,删除值为给定s与t之间的所有元素
bool Delete_s_t1(SqList &L, ElemType s,ElemTypr t){
//这个效率比较低,无论线性表是否有序都能将整个范围内的删除
if(L.length == 0 || s>=t)
return false;
int k = 0;//用k记录不在s到范围内的元素
for(int i = 0;i<L.length;i++){
if(L.data[i]<=s || L.data[i]>=t){
L.data[k] = L.data[i];//将不在范围的元素前移k位
k++;
}
}
L.length = k;//顺序表长为k
return ture;
}
bool Delete_s_t2(SqList &L,ElemType s,ElemType t){
if(L.length ==0 || s>=t)
return false;
int i,j
for(i=0;i<L.length&&L.data[i]<s;i++){ //寻找大于等于s的第一个元素位置
if(i>=L.length)//元素全都小于s
return false;
}
for(j=i;j<L.length && L.data[j]<=t;j++){//找到大于t的第一个元素
for(;j<L.length;i++,j++){//将大于t的第一个元素及其后边所有元素前移,填补被删除元素位置
L.data[i] = L.data[j];
}
}
L.length = i;
return ture;
}
//删除值在s到t之间(包含s、t)所有与元素
bool Delet_s_t1(SqList &L,ElemType s,ElemType t){
if(L.length==0 || s>=t)//线性表为空或者s、t不合法
return false;
int k=0;//k用于记录值不在s、t范围内的元素
for(int i=0;i<L.length;i++){
if(L.data[i]<s || L.data[i]>t){
L.data[k] = L.data[i];//将不在该范围的元素前移k位
k++;
}
}
L.length = k;
return ture;
}
bool Delete_s_t2(Sqlist &L,ElemType s,ElemType t){
if(L.length == 0 || s>=t)
return false;
int k=0,i;//k来记录在s、t范围内的元素
for(i=0;i<L.length;i++){
if(L.data[i]>=s&&L.data[i]<=t){
k++;
}
else{
L.data[i-k] = L.data[i]//将不在该范围内的元素前移k个位置
}
}
L.length -=k;
return ture;
}
//第六题,有序表删除其重复元素
bool Delete_same(SqList &L){
if(L.length == 0)
return false;
int i,j;//i记录第一个不相同的元素
for(i=0,j=1;j<l.length;j++){
if(L.data[i]!=L.data[j]){
i++;
L.data[i]=L.data[j];//找到下一个与上一个元素值不同的元素前移
}
}
L.length = i-1;
return true;
}
王道_线性表_顺序表习题
最新推荐文章于 2022-03-27 11:59:14 发布