删除线性列表头尾以外的元素
##给定一个顺序列表,请设计一个算法删除所有值大于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; //返回删除后的顺序表
}
替换的时候可以直接从左往右或者右往左,我当时觉得两边同时往中间可以节省时间,因此选择找中间下标,让两头往中间靠。
以下是我的运行结果