1、将顺序表L中所有元素逆置
注意:交换L.length/2次即可
//将顺序表中的所有元素逆置
//算法思想,依次执行:第一个值和最后一个值互换,第二个值和倒数第二个值互换......
#include"head.h"
void Reverse(SeqList &L) {
int n;//用作交换的第三方
for (int i = 0; i < L.length / 2; i++) {//循环到中间即可交换结束
n = L.data[i];
L.data[i] = L.data[L.length - i - 1];//注意位序与下标的关系
L.data[L.length - i - 1] = n;
}
}
int main() {
SeqList L;
InitList(L);
int i;
for (int i = 0; i < 10; i++) {//插入10个元素,自定义插入
ListInsert(L, i + 1, i + 1);
}
printf("原顺序表内容为:\n");
for (int i = 0; i < L.length; i++) {
printf("data[%d]=%d\n", i, L.data[i]);
}
Reverse(L);
printf("顺序表逆序内容为:\n");
for (int i = 0; i < L.length; i++) {
printf("data[%d]=%d\n", i, L.data[i]);
}
}
2、对长度为n的顺序表L,删除其中所有值为x的数据元素,要求时间复杂度为O(n)。
注意:时间复杂度为O(n),首先排除排序操作,其时间复杂度为O(nlogn)
//删除表中值为X的元素,时间复杂度O(n),空间复杂度O(1)
//算法思想,定义一个值来记录表中不为X的元素个数,保存下来
#include"head.h"
void del_x_L(SeqList &L,int x) {
int k = 0;
for (int i = 0; i < L.length; i++) {
if(L.data[i]!=x){
L.data[k]=L.data[i];
k++;
}//若data[i]=x的话,则不执行if语句,i+1,k不变,碰到下一个不相等的数,往前挪动i-k个位置
//k<i,这样就舍去了表中x的值。,始终k<=i;表中不存在值为x的数时相等,
}
L.length = k;
}
int main() {
SeqList L;
InitList(L);
for (int i = 0; i < InitSize; i++) {//手动输入最初数组长度个数的数
scanf_s("%d", &L.data[i]);
L.length++; //每输入一个数顺序表的当前长度加1
}
printf("顺序表内容为:\n");
for (int i = 0; i < L.length; i++) {
printf("data[%d]=%d\n", i, L.data[i]);
}
del_x_L(L, 2);
printf("删除元素后顺序表内容为:\n");
for (int i = 0; i < L.length; i++) {
printf("data[%d]=%d\n", i, L.data[i]);
}
}