2.2.3 P19
1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并推出运行。
Bool DeleminElem(Sqlist &L.Elemtype *e){ //先判断合法性 if(L.length==0) return false; //声明用来存放最小数据的变量 e=L.data[0]; int k=0; //找到最小值 for(int i=0;i<L.length;i++){ if(L.data[i]<e) e=L.data[i]; k=i; } //填补 L.data[k]=L.data[length-1]; L.length--; return true; }
2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
Bool ExchangeElem(Sqlist &L){ int c;
//典型的交换算法 for(int i = 0;i<L.length/2;i++){ c=L.data[i]; L.data[i]=L.data[length-1-i]; L.[length-1-i]=c; } return true; }
3.对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素
bool Deletex(Sqlist &L,Element x){ int k=0;//用来统计有多少个值为x的元素 //统计x的个数赋给k;将顺序表里的元素向前移动k个位置 for(int i = 0;i<L.length;i++){ if(L.data[i]==x){ k++; }else{ L.data[i-k]=L.data[i]; } } //改变顺序表的长度 L.length=L.length-k; retrun true; }
4.从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行
Bool DeleteSt(Sqlist &L,Element s,Element t){ //声明i、j来标记s、t的位置 int i,j; //验证合理性 if(s>=t||L.length==0) return false; //找到第一个大于s的位置 for(i=0;i<length&&L.data[i]<s;i++); //如果所有的值都小于s,那就返回false if(i>=L.length) return false; //寻找值大于t的第一个元素 for(j=i;j<length&&L.data[i]<t;j++); //进行删除填补 for( ;j<L.length;j++){ L.data[i]=L.data[j]; i++; } //改变长度 L.length=i; return true; }
5 .从顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行
bool DeleteSt(Sqlist &L,Element s,Element t){ if(s>=t||L.length==0) return false;//判断合理性 int k=0;//记录符合条件的值的个数 //开始执行找->记录->移位 for(int 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; }
6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
bool DelRepeat(Sqlist &L){ if(L.length==0) return false;//判断合理性 //开始进行比对和移位的操作 for(int i=0,j=i;j<L.length;j++){ if(L.data[i] != L.data[j]) L.data[++i] = L.data[j]; } L.length=i+1;//当你改变顺序表的长度时,数据元素从后往前依次被删除 return true; }