(1)题目:已知一个顺序表L,其中的元素递增有序排列,设计算法,插入元素x(x 为int型)后保持该顺序表仍然递增有序排列。假设插入操作总能成功,即插入插入后表长不会大于maxSize
分析:分为两步
1)找出让顺序表有序的插入位置
2)将第一步上找出的位置上以及其后的元素往后移动一个位置,将 x 放在腾出的位置上。
代码:
typedef struct
{
int data[maxSize];
int length;
} SqList;
//1)定位元素
int locateElem( SqList L, int x )
{
int i; //因为 i 在for循环外还要使用,因此在for前声明
for ( i = 1; i <= L.length; i ++ )
{
if ( x < L.data[i] )
{
return i; // 顺序表中元素从小到大,看 x 是否小于当前元素,如果小于则放回当前位置 i
}
}
return i; // 若是不存在比 x 大的元素,则将 x 插入到 表尾元素之后。
}
//2)移位,插入元素
void insertElem(SqList &L, int x)
{
int pos = locateElem( L, x ); //插入位置pos
int i;
for ( i = L.length; i >= pos; -- i )
{
L.data[i + 1] = L.data[i]; //从右往走,逐个向后移动
}
L.data[pos] = x; //在 位置pos 放置 元素x
++ (L.length); //表长自增 1
}
总结:
1)第一步来自顺序表的 按元素值的查找算法
2)第二部来自顺序表的 插入数据元素的算法
(2)题目:
删除顺序表L中下标为p ( 1 <= p <= length )的元素,成功放回1,否则返回0,并将删除的元素的值赋值给 e
代码:
int deleteElem(SqList &L, int p, int &e)
{
if ( p < 1 || p > L.length )
{
return 0;
}
e = L.data[p]; //赋值 e
int i;
for ( i = p; i < L.length; ++ i )
{
L.data[i] = L.data[i + 1]; // 从左到右,依从想前移动
}
-- (L.length); //表长 自减 1
return 1;
}