线性表的顺序表示习题

从顺序表中删除具有最小值的元素(假设唯一),并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示错误信息并退出

bool
Del_Min(SqList &L,int &value){ //删除顺序表L中最小元素的结点,并通过引用型参数value返回其值 //删除成功返回true if(L.length==0) return false; value=L.data[0]; int pos=o;//下标 for(int i=1;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 true; }
设计一个高效的算法,将顺序表的所有元素逆置,要求复杂度O(1)
void Reverse(Sqlist %L){
    int temp;
    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; 
    }
} 
长度为n的顺序表L,编写一个时间复杂度O(n),空间复杂度O(1),删除线性表中所有值为x的数据元素
void del_x_l(Sqlist &L,int x){
    int k=0;  //记录不等于x的元素个数
    for(int i=0;i<L.length;i++)
        if(L.data[i]!=x){
            L.data[k]=L.data[i];//留下 
            k++;
        }
    L.length=l;
    
    
} 
从有序顺序表中删除其值为定值s与t之间(包含st,要求是s<t)的所有元素,如果s t不合理或顺序表为空则显示错误信息并返回
bool Del_s_t(Sqlist &L,int s,int t){
    int i,j;
    if(s>=t||L.length==0) return false;
    for(i=0,i<L.length&&L.data[i]<s;i++) //寻找值>=s的第一个元素 
      if(i>=L.length) return false;
    for(j=i;j<L.length&&L.data[j]<=t;j++) //寻找值>t的第一个元素
    for(;j<L.length;i++,j++)
      L.data[i]=L.data[j];
    L.length=i+1;
    return true; 
    
} 

从顺序表中删除其值为定值s与t之间(包含st,要求是s<t)的所有元素即值为st的也要删除,如果s t不合理或顺序表为空则显示错误信息并返回
/**算法思想:从前向后扫描顺序表,用k记录元素值在s-t之间的元素的个数(初始k=0)
 对于当前扫描的元素,若其值不在st之间,则前移k个位置,否则执行k++**/
 bool del_s_t1(Sqlist &L,int s,int t){
     int k,i=0;
     if(L.length==0||s>=t) return false;
     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];
   }
   L.length-=k;
   return true;
 } 
 
  
 
 
从有序数组中删除所有其值重复的元素,使表中所有元素的值均不同
bool delete_same(Sqlist &L){
    if(L.length==0) return false;
    int i,j;  //i存储第一个不相同的元素,j为工作指针 
    for(i=0,j=1;j<L.length;j++)
      if(L.data[i]!=L.data[j])  //查找下一个与上个元素值不同的元素
        L.data[++i]=L.data[j];  //前移
    L.length=i+1;
    return true; 
} 
将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表
bool Merge(Sqlist A,Sqlist B,Sqlist &c){
    if(A.length+B.length>C.maxsize) return false;
    int i=o,j=o,k=0;
    while(i<A.length&&j<B.length){
        if(A.data[i]<=B.data[j])
           C.data[k++]=A.data[i++];
        else
          C.data[k++]=B.data[j++];
    }
    while(i<A.length)
     C.data[k++]=A.data[i++];
    while(j<B.length)
     C.data[k++]=B.data[j++];
    C.length=K+1;
    return true;
} 

猜你喜欢

转载自www.cnblogs.com/ikigai18/p/12748847.html