[蓝蓝计算机考研算法训练二期]-day23

97 阅读1分钟

32、删除顺序表中最小的元素,由最后一个元素补充

思路

顺序表的输入使用的是数组的输入方式,输入-1结束输入,同时在输入时记录最小数值的下标,等输入结束时便将数组的最后一个数放入该下标的位置即可实现删除。

具体实现

#include<stdio.h>

int main() {
	int n[100], i = 0, flag=0;
	
	scanf("%d", &n[0]);
	while(n[i] != -1) {
		i++;
		scanf("%d", &n[i]);
		if(n[i] < n[flag] && n[i] != -1)
			flag = i;
	}
	
	n[flag] = n[i-1];
	for(int j=0;j<i-1;j++) {
		printf("%d\t", n[j]);
	}
	
	return 0;
} 

image.png

33、逆转顺序表中的元素

思路

本算法采用了与上一题类似的思路,先输入数据至数组中,输入-1结束输入,然后遍历数组,当角标小于数组长度的一半时,前面的数与后面对称位置的数交换位置,同时输出,当大于数组长度一半时,只输出,不叫交换。

具体实现

#include<stdio.h>

int main() {
	int n[100], i = 0, len, temp;
	
	scanf("%d", &n[0]);
	while(n[i] != -1) {
		i++;
		scanf("%d", &n[i]);
	}
	len =i;
	for(i = 0; i < len; i++) {
		if(i < len/2) {
			temp = n[i];
			n[i] = n[len-1-i];
			n[len-1-i] = temp;
		}
		printf("%d", n[i]);
	}
	
	return 0;
}

image.png

34、删除顺序表中为x的元素

思路

输入方式与前两的算法相同,不同的是,这里额外申请了一个数组,用来存放不包含x的内容以便输出。

具体实现

#include<stdio.h>

int main() {
	int n1[100], n2[100], i = 0, j = 0, x, len;
	
	scanf("%d", &n1[0]);
	while(n1[i] != -1) {
		i++;
		scanf("%d", &n1[i]);
	}
	scanf("%d", &x);
	len =i;
	for(i = 0; i < len; i++) {
		if(n1[i] != x){
			n2[j] = n1[i];
			j++;
		}
	}
	for(i = 0; i < j; i++) {
		printf("%d", n2[i]);
	}
	
	return 0;
} 

image.png

小结

今天的算法都不算太难,最主要的是对数组的存放以及取用的理解。