本文共 2101 字,大约阅读时间需要 7 分钟。
1、从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,若顺序表为空则显示出错信息并退出运行
分析: 我们先选择使用数组来表示顺序存储。 结点的数据结构如下: template<typename ElemType> struct SqNode { ElemType data[MaxSize]; int length; }; 实现逻辑: 按序找出最小的元素,然后后面的每一个元素向前挪一位 完整代码如下:#includeusing namespace std;#define MaxSize 50template struct SqNode{ ElemType data[MaxSize]; int length;};//从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,若顺序表为空则显示出错信息并退出运行template bool DeleteMinElemNode(SqNode &L,ElemType &DelData){ if(L.length <= 0) { cout<<"顺序表为空"< L.data[i]) { DelData = L.data[i]; pos = i; } } //后面的元素依次向前移动一位 for(int i = pos; i< L.length-1;++i) { L.data[i] = L.data[i+1]; } L.length--; return true;}int main(){ SqNode sqnode; sqnode.length = 0; for(int i = 0; i
运行结果:
2、设计一个高效算法。将顺序表L的所有元素逆置。要求算法的空间复杂度为O(1)。 设计思路:
比如顺序表里元素为a1、a2、a3、a4、a5。我们可以直接从顺序表中间一份为2,进行首尾两两互换,a1与a5换,a2与a4换。这样不再需要额外的空间开销()。 实现过程:int reverse(SqNode &L){ for (int i = 0; i < L.length/2; ++i) { L.data[i] = L.data[L.length - i - 1] + L.data[i]; L.data[L.length - i - 1] = L.data[i] - L.data[L.length - i - 1]; L.data[i] = L.data[i] - L.data[L.length - i - 1]; }}
3、对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除顺序表上所有值为x的数据元素。
设计思路: 顺次遍历顺序表,将值不等于x的数据元素的个数用k表示,然后第k位放第k个不等于x的元素。 实现过程:int DeleteX(SqNode &L,const ElemType x){ int k = 0; for (int i = 0; i < L.length; ++i) { if (L.data[i] != x) { L.data[k] = L.data[i]; ++k; } L.length = k; } return 0;}
4、从有序顺序表中删除其值在给定值s与t之间的所有元素(s<t),如果s和t不合理或顺序表为空,则显示出错信息并退出运行。
设计思路: 找出第一个大于等于s的元素下标和最后一个小于等于t的元素的下标,然后计算出距离,后面元素依次向前移动n位 算法实现int DeleteStoT(SqNode &L, const ElemType s, const ElemType t){ int sk = 0,tk = 0; if (s >= t || L.length <= 0) { std::cout << "error" << endl; return -1; } for (int i = 1; i < L.length; ++i) { if (L.data[i-1] < s && L.data[i] >= s) { sk = i; } else if (L.data[i-1] <= t && L.data[i] > t) { st = i-1; } if (!st) L.data[i - (st - sk)] = L.data[i]; } return 0;}
人,总是要有一点精神的,不是吗
转载地址:http://nkngz.baihongyu.com/