标签:type 部分 信息 修改 结构 als 索引 关系 while
bool Del_Min(sqList &L,ElemType & value){
//删除顺序表L中最小元素结点,并通过引用型参数返回其值
//若删除成功,则返回true,否则,返回false
if(L.length==0)
return false;
value =L.data[0];
int idx=0;
for(int i=1;i<L.length;i++){
if(L.data[i]<value){
value = L.data[i];// value记录当前最小元素
idx = i;
}
}
L.data[i] = L.data[L.length-1];//空出的位置由最后的元素填补
L.length--;
return true;
}
*Q:设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1).
*A:
算法思想: 扫描顺序表的前半部分元素,将其与后半部分对应元素交换。
代码:
void Reverse(sqList &L){
Elemtype tmp;//辅助变量
for(int i=0;i<L.length/2;i++){
tmp = L.data[i];
L.data[i] = L.data[L.length-i-1];
L.data[L.length-i-1] = tmp;
}
}
*Q:对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
A:
*解法一:用k记录顺序表L中不等于x的元素的个数,边扫描L边统计k,并将不等于x的元素向前移动k个位置,最后修改L的长度。
void delete_x(sqList &L,Elemtype x){
//本算法实现删除顺序表L中所有值为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 = k;
}
*解法二:用k记录顺序表L中等于x的元素个数,边扫描L边统计k,并将不等于x的元素前移k个位置,最后修改顺序表L的长度。
void delete_x(sqList &L,Elemtype x){
int k = 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 = L.length - k;//顺序表长度递减
}
解法3:设头尾指针分别从顺序表头尾遍历,如果头指针遍历到元素值等于x,那么将尾指针对应元素值放到头指针位置,直到头尾指针相遇。
这种做法可能会导致原顺序表中的位置关系发生变化。
void delete_x(sqList &L,Elemtype x){
int i=0;//定义头指针从头遍历顺序表
int j = L.length-1;//定义尾指针从后遍历顺序表
while(i<j){
if(L.data[i]==x){
while(L.data[j] == x && i < j)
j--;//j从后向前找到第一个不等于x的元素
if(i>=j) break;//如果头尾指针相遇则停止!
L.data[i] = L.data[j];
j--;
}
else
i++;//头指针向后遍历
}
L.length = i+1;
}
标签:type 部分 信息 修改 结构 als 索引 关系 while
原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/14309390.html