1.含有n个元素的顺序表L,设计一个算法将所有元素逆序:
思路:利用折半,遍历列表前半部分元素,对每个data[i],将其与后半部分data[L.Length-i-1]交换
//逆序,折半方法
template <class T>
void SquitList<T>::Reverse(SquitList<T> &L)
{
int i;
T tmp;
for(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;
}
}
2.含有n个元素的顺序表L,设计一个算法删除其中第一个值为x的元素
思路:遍历顺序表,找到值为x的元素L.data[i],将其后面的元素均前移一个位置覆盖L.data[i]
template <class T>
bool SquitList<T>::Delaelem(SquitList<T> &L,T x)
{
int i = 0,j;
while(i<L.Length&&L.data[i]!=x)
i++;//查找x元素
if(i>=L.Length)
return false;
else
{
for(j = i;j < L.Length;j++)
L.data[j] = L.data[j+1];
L.Length--;
return true;
}
}
3.有序表的二路归并。已知两个有序表L1,L2,合并之后的有序表L3
思路:用i遍历L1,j遍历L2,当两个表均为遍历完时,比较L1.data[i]和L2.data[j]的大小,将较小的复制到L3中;当两个表中有一个遍历完毕时,将另一个表中余下的元素均复制到L3中。
//有序表的二路归并
template <class T>
void SquitList<T>::Merge2(SquitList<T> &L1,SquitList<T> &L2,SquitList<T> &L3)
{
int i,j,k;
while(i<L1.Length&&j<L2.Length)
{
if(L1.data[i]<L2.data[j])
{
L3.data[k] = L1.data[i];
i++;k++;
}
else
{
L3.data[k] = L2.data[j];
j++;k++;
}
}
while(i<L1.Length)//L1没有遍历完毕,L2遍历完毕
{
L3.data[k] = L1.data[i];
i++;k++;
}
while(i<L2.Length)//L1没有遍历完毕,L2遍历完毕
{
L3.data[k] = L2.data[j];
j++;k++;
}
L3.Length = k;
}