实验要求:
(1)构造按升序排列的顺序表A(12,25,34,78, 88,100) 和顺序表 B(10,15,25,32,88)(说明: 顺序表A, B的数据元素值按升序有序的方式从键盘输入或从文件读入)。
(2)将数据元素38插入顺序表A中并保持其原来的升序排列,成功返回1,失败返回0。
(3)删除顺序表B中位序为3的数据元素,成功返回1,失败返回0。
(4)从键盘输入一个数X, 并在顺序表A中查找与X相等数据元素,并输出该元素在线性表中的位序。
基础的初始化,销毁,输出等功能的代码省略,博主以前的文章有提到,可以自行查阅。
代码实现:
插入操作:
int InsertList_Sq(SqList& L, int temp)
{
//顺序表扩容
ElemType* newbase = new ElemType[L.listsize + LISTINCREMENT];
for (int i = 0; i < L.length; i++)
newbase[i] = L.elem[i];
delete[]L.elem;
L.elem = newbase;
L.listsize += LISTINCREMENT;
newbase = NULL;
//暴力查找
int j = 0;
for (; j < L.length - 1; j++) //从LB中第一个元素遍历
{
if (temp < L.elem[j])
{
j--; break;
}
if ((temp >= L.elem[j]) && (temp < L.elem[j+1])) //找到比38小和比38大的两个元素
break;
}
//二分查找
//if (temp > *(L.elem + L.length - 1)) j = L.length + 1;
//else {
// int left = 0, right = L.length - 1;
// while (left < right)
// {
// int mid = left + (right - left) / 2;
// if (temp > *(L.elem + mid))
// left = mid + 1;
// else right = mid;
// }j = left;
//}
//ElemType* q = L.elem + j;
ElemType* q = L.elem+j+1; //插入元素的指针表示
ElemType* p = L.elem + L.length - 1;
for (; p >= q; p--)
*(p+1) = *p; //插入位序以后元素依次后移
*(p+1) = temp;
++L.length;
return j+1;
}
//边比较边后移
// int n = *(L.elem + L.length+1)=temp; //将待插入元素放在表尾
// int i = 0;
//
// for (i = L.length; i > 0; i--) //从表尾向前遍历
// {
// if (L.elem[i - 1] < n)
// break;
// *(L.elem + i) = *(L.elem + i - 1);
// }
// *(L.elem + i) = n;
// L.length++;
// return i;
删除操作:
int ListDelete_Sq(SqList& L, int i, ElemType& e)
{
if ((i < 1) || (i > L.length)) return ERROR;
ElemType* p = &(L.elem[i - 1]);
e = *p;
ElemType* q = L.elem + L.length - 1;
for (++p; q >= p; ++p)
*(p - 1) = *p;
--L.length;
return OK;
}
实验结果:
本文共写了两种插入方法,两种查找方法,易于理解,欢迎大佬们提出宝贵建议!