2021-09-19

删除线性列表头尾以外的元素

##给定一个顺序列表,请设计一个算法删除所有值大于min而且小于max的元素
输入样例:
10
1 9 2 5 7 3 4 6 8 0
输出样例:
0 9

#include <stdio.h>
#include <malloc.h>
struct ming{
	int data[1000];
	int last;
};
struct ming* M;
struct ming* kongbiao(int a[],int n);
struct ming* shanchu( int i,int n);
int main()
{
	int a[1000];
	int n;
	int i = 0, center = 0;
	scanf_s("%d", &n);
	center = n / 2;
	M = (struct ming*)malloc(sizeof(struct ming));
	M = kongbiao(a, n);
	M=shanchu(i,n);
	for (int g = center-1;g < M->last;g++)  //得到返回后的顺序表并输出头尾两个元素  (此处建议画图找这两个元素的位置)
		printf("%d ", M->data[g]);
	return 0;
}
struct ming* kongbiao(int a[], int n)   //建立新表并赋值
{
	struct ming* M;
	int i = 0;
	M = (struct ming*)malloc(sizeof(struct ming));
	for (i = 0;i < n;i++)
	{
		scanf_s("%d", &a[i]);
		M->data[i] = a[i];
	}
	M->last = n;
	return M;
}
struct ming * shanchu( int i,int n)  //删除元素函数
{
	int max = 0, min = 0,temp=0,center;
	center = n / 2;   //找到中间下标
	for (i = 0;i < M->last-1;i++)  //给顺序表里的元素从小到大排序
	{
		for (int j = i + 1;j < M->last;j++)
		{
			if (M->data[j] < M->data[i])
			{ 
				temp = M->data[j];
				M->data[j] = M->data[i];
				M->data[i] = temp;
			}
		}
	}
	for (int k = M->last-1;k > center;k--)  //下标大于中间下标的元素从右往左替换
	{
		M->data[k - 1] = M->data[k];
		M->last--;   //注意顺序表的最后一个元素last要逐次往前
	}
	for (int d = 0;d < center-1;d++)   //下标小于中间下标的元素从左往右替换 (此处注意大于中间的下标遍历条件是>center,根据画图可知小于中间的下标遍历条件应该是<center-1,否则头尾会重叠)
	{
		M->data[d + 1] = M->data[d];
	}
	return M;  //返回删除后的顺序表
}

替换的时候可以直接从左往右或者右往左,我当时觉得两边同时往中间可以节省时间,因此选择找中间下标,让两头往中间靠。

以下是我的运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值