数据结构—线性表的顺序表示应用题-2
题目六
从有序顺序表中删除所有其值重复的元素,使表中的所有元素的值均不同。
算法思想:
用双指针算法,初始时将第一个元素视为非重复的有序表,之后依次判断后面的元素是否与前面非重复的有序表的最后一个元素相同,若相同的话,则继续向后判断,若不同的话,则插入到前面的非重复有序表的最后,直到判断到表尾结束。
代码:
bool Delete_Same(SeqList &L)
{
if (L.length == 0)
return false;
int i,j; //i存储第一个不相同的元素,j为工作指针
for (i=0,j<1;j<L.L.length;j++)
if (L.data[i] != L.data[j]) //查找下一个与上个元素值相同的元素
L.data[++i] = L.data[j]; //找到后,将元素后移
L.length = i + 1;
return true;
}
题目七
将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
算法思想:
按顺序不断取两个顺序表表头元素较小的结点存入新的顺序表中,直到有一个表中没有元素,则将另一个表剩余的元素加到新的顺序表后面。
代码:
bool Merge(SeqList A,SeqList B,SeqList &C)
{
if (A.length + B.length > C.maxSize) //大于顺序表的长度
return false;
int i = 0, j = 0, k = 0;
while (i<A.length && j<A.length) //循环比较,较小的存入C表中
{
if (A.data[i] < B.data[j])
C.data[k++] = A.data[i++];
else
C.data[k++] = B.data[j++];
}
while (i<A.length) //A表还有剩余元素
C.data[k++] = A.data[i++];
while (j<B.length) //B表还有剩余元素
C.data[k++] = B.data[j++];
C.length = k;
return true;
}
题目八
已知在一维数组 A[m+n] 中依次存放两个线性表 a 和 b。试写一个函数,将数组中的两个顺序表的位置互换,即将 b 中元素放在 a 中元素的前面。
算法思想:
先将数组中的所有数逆置,再把前 n 个数逆置,最后将数组后 m 个数逆置就可以了。
代码:
void Reverse(int A[], int left, int right, int length)
{
if (r>=l || right>=length)
return;
int mid = (left + right) / 2;
for (int i=0;i<=mid-l;i++)
swap(A[left+1],A[right-1]);
}
void Exchange(int A, int m, int n, int length)
{
Reverse(A,0,m+n-1,length);
Reverse(A,0,n-1,length);
Reverse(A,n,m+n-1,length);
}
题目九
线性表 a 中的元素递增有序切按顺序存储在计算机内。要求设计一个算法,完成用最少时间在表中查找数值为 x 的元素,若找到则将其与后继元素位置相互换,若找不到则将其插入表中并使表中元素仍递增有序。
算法思想:
顺序存储的线性表递增有序,可以顺序查找,也可以二分查找,因为题目要用最少的时间,所以用二分查找。
代码:
void find_x(int A[], int &length, int x)
{
int l = 0, r = length - 1;
while (l<r)
{
int mid = (l + r) >> 1;
if (A[mid] >= x)
r = mid;
else
l = mid + 1;
}
// 如果找到该元素
if (A[l]==x && l!=n-1)
{
swap(A[l],A[l+1]);
}
else // 如果未找到该元素
{
A[length] = x;
for (int i=length; i>0;i--)
{
if (A[i]<A[i-1])
swap(A[i], A[i - 1]);
else
break;
}
length++;
}
}