数据结构笔记3:顺序表的逆序操作、删除特定值操作

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
	}
	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]);
	}
}

头文件代码参考“数据结构笔记2”

你可能感兴趣的:(数据结构笔记——线性表,算法,数据结构)