删除多个元素(C语言实现)

描述

从长度为n的整数序列中删除指定位序的m个元素,按照原顺序输出剩余的元素。其中,1≤m≤n≤1000,原整数序列为a;要删除的元素位序按照严格单调递增的方式存储在序列b中,其中元素b[i]表示要从a中删除的元素的位序,输入数据保证0≤b[i]≤n-1, b[i]<b[i+1]。

例如:n=10,m=5,a={46, 7, 27, 50, 71, 79, 21, 56, 18, 77},b={0, 2, 3, 4, 5},

则删除后得到序列为{7, 21, 56, 18, 77 }

格式

输入格式
三行数据。
第1行两个正整数,分别表示n和m
第2行n个整数,表示待删除元素的序列a
第3行m个正整数,表示要删除元素的位序

输出格式
只有一行,表示a中剩余的元素,不得改变元素之间原来的先后顺序。

样例

输入样例
10 4
2 81 64 88 55 74 6 80 41 93
0 2 4 7
输出样例
81 88 74 6 41 93

题解及详细注释

#include <stdio.h>
#include <stdlib.h>
#define maxn 1000

//定义顺序表的结构体
typedef struct 
{
    int data[maxn];
    int len;
}Sqlist;

//输入表的的长度
void read1(Sqlist *L)
{
    scanf("%d",&L->len);
}

//输入表的数值
void read2(Sqlist *L)
{
    int i;
    for(i=0;i<L->len;i++)
    {
        scanf("%d",&L->data[i]);
    }
}

//删除操作,i是读取的表Q的数值
void del1(Sqlist *L,int i)//想一想为什么del1函数要放在del2函数的前面
{
    int j;
    for(j=i;j<L->len;j++)
    {
        L->data[j]=L->data[j+1];
    }
    L->len--;
}

//遍历表Q的数值,并且调用del1函数
void del2(Sqlist *L,Sqlist *Q)
{
    int i;
    for(i=Q->len-1;i>=0;i--)
    {
        del1(L,Q->data[i]);
    }
}


//输出删除后的表
void pri(Sqlist *L)
{
    int i;
    for(i=0;i<L->len;i++)
    {
        printf("%d ",L->data[i]);
    }
}

int main()
{
    Sqlist L,Q;//创建表L,Q
    read1(&L);//调用read1函数,读取L长度
    read1(&Q);//同上
    read2(&L);//调用read2函数,读取数值
    read2(&Q);//同上
    del2(&L,&Q);//调用del2函数,删除操作。注意先del2,del2中有del1
    pri(&L);//输出表
}

在这里插入图片描述

我是调用read1和read2函数读取输入,大家也可以直接在主函数里面直接读取读取输入,尝试写一下。若有更好的想法,还请评论区指教。

写于2021年7月21日00:01分,晚安,各位。


如果这篇文章对你帮助很大,麻烦帮忙,点下友情链接: 鱼儿项目网,进去之后切换几个页面,停留几十秒。感激不尽。里面有一些免费项目大家也可以看看

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m明月Java3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值