问答题 利用顺序表的操作,实现以下的函数:
问答题 从顺序表中删除具有最小值的元素并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
【正确答案】
【答案解析】实现删除具有最小值元素的函数
bool deleteMin(SeqList&L,DataType&value){
if(L.n==0)return false; //表空,中止操作返回
value=L.data[0];int i,pos=0;//假定1号元素的值最小
for(i=2;i<=L.n;i++) //循环,寻找具有最小值的元素
if(L.data[i-1]<value) //让value记忆当前具有最小值的元素
{value=L.data[i-1];pos=i-1;}
for(int j=pos+1;j<L.n;j++)L.data[j-1]=L.data[j];
L.n--;
return true;
}
问答题 从顺序表中删除第i个元素并由函数返回被删元素的值。如果i不合理或顺序表为空则显示出错信息并退出运行。
【正确答案】
【答案解析】实现删除第i个元素的函数(设第i个元素在data[i-1],i=1,2,3,…,n)
bool deleteNo_i(SeqList &L,int i,DataType&value){
if(L.n==0||i<1||i>=L.n)return false; //表空或i不合理,终止操作
value=L.data[i-1];
for(int j=i;j<L.n;j++)L.data[j-1]=L.data[j];
L.n--;
return true;
}
问答题 向顺序表中第i个位置插入一个新的元素x。如果i不合理则显示出错信息并退出运行。
【正确答案】
【答案解析】实现向第i个位置插入一个新的元素x的函数(设第i个元素在data[i-1],i=1,2,3,…,n)
bool InsNo_i(SeqList&L,int i,DataType value){
if(L.n==L.maxSize||i<1||i>L.n+1);//表满或参数i不合理,中止操作
return false;
for(i=L.n;j>=i;j--)L.data[j]=L.data[j-1];
L.data[i-1]=value;L.n++:
return true;
}
问答题 从顺序表中删除具有给定值x的所有元素。
【正确答案】
【答案解析】从顺序表中删除具有给定值x的所有元素
void deleteValue(SeqList&L,DataType value){
int i,j;
for(i=L.n;i>=1;i--) //循环,寻找具有值x的元素并删除它
if(L.data[i-1]==value){//删除具有值x的元素
for(j=i;j<L.n;j++)L.data[j-1]=L.data[j];
L.n--;
}
}
问答题 从顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素,如果s或t不合理或顺序表为空则显示出错信息并退出运行。
【正确答案】
【答案解析】实现删除其值在给定值s与t之间(要求s小于t)的所有元素的函数
bool deleteNo_sto_t(SeqList &L,DataType s,DataType t){
if(L.n==0)return false;
if(s>t){DataType temp=s;s=t;t=temp;} //保持s≤t
int i,j;
for(i=L.n-1;i>=1;i--) //循环,寻找在给定范围内的元素并删除它
if(L.data[i-1]>=s&&L.data[i-1]<=t){//删除
for(j=i;j<L.n;j++)
L.data[j-1]=L.data[j];
L.n--;
}
return true;
}
问答题 从有序顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素,如果s或t不合理或顺序表为空则显示出错信息并退出运行。
【正确答案】
【答案解析】实现从有序顺序表中删除其值在给定值s与t之间的所有元素的函数
bool deleteNo_sto_t1(SeqList&L,DataType s,DataType t){
if(L.n==0)return false;
if(s>t){DataType temp=s;s=t;t=temp;} //保持s≤t
int i,j,k,u;
for(i=1;i<=L.n&&L.data[i-1]<s;i++); //寻找值≥s的第一个元素
if(i>L.n)return false; //没有值≥s的元素
for(j=i;j<=L.n&&L.data[j-1]<=t;j++); //寻找值>t的第一个元素
for(k=j,u=i;k<=L.n;k++,u++) //前移,填补被删元素位置
L.data[u-1]=L.data[K-1];
L.n=L.n-j+i:
return true;
}
问答题 将两个有序顺序表合并成一个新的有序顺序表并由函数返回结果顺序表。
【正确答案】
【答案解析】实现将两个有序顺序表合并成一个新的有序顺序表的函数
bool Merge(SeqList&A,SeqList&B,SeqList&C){
//合并有序顺序表A与B成为一个新的有序顺序表C。
if(A.n+B.n>C.maxSize)return false;
int i=1,j=1,k=1;
while(i<=A.n&&j<=b.n) //循环,两两比较,小者存入结果表
if(A.data[i-1]<=B.data[j-1])
{C.data[k-1]=A.data[i-1];i++;}
else
{C.data[k-1]=B.data[j-1];j++;k++}
while(i<=A.n){C.data[k-1]=A.data[I-1];i++;k++}
while(j<=B.n){C.data[k-1]=B.data[j-1];j++;k++}
C.n=k;
return true;
}
问答题 从有序顺序表中删除所有值重复的元素,使表中所有元素的值均不相同。
【正确答案】
【答案解析】实现从有序顺序表中删除所有值重复的元素的函数
bool deleteSame(SeqList&L){
if(L.n==0)return false;
int i=1,j;
while(i<=L.n){ //循环检测
while(L.data[i-1]!=L.data[i])i++; //寻找重复的元素i与元素i+1
j=i+2; //发现重复
while(L.data[i-1]==L.data[j-1])j++;
for(k=i+1,u=j;u<=L.n;k++,u++)
L.data[k-1]=L.data[u-1];
i++:
}
return true;
} [解析] 通过顺序表的定义及基本特性来完成。