删除线性表第i个元素开始的k个元素

#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
#define false 0
#define true 1
typedef int elemtype;
typedef struct
{
 elemtype a[maxsize];
 int length;
}sqlist;
void creat(sqlist *L);
void out(sqlist *L);
void delet(sqlist *L,int i,int k);
void creat(sqlist *L)
{
 int i,k;
 printf("请输入你创建的线性表的大小:\t");
 scanf("%d",&k);
 printf("\n");
 for(i=0;i<k;i++)
 {
  scanf("%d",&L->a[i]);
  L->length++;
 }
 
}
void out(sqlist *L)
{
     int i;
  printf("\n线性表为:\n\n");
  for(i=0;i<L->length;i++)
  {
   printf("%d\t",L->a[i]);
  }

}
void delet(sqlist *L,int i,int k)
{
 int j;
        if(i<=L->length&&i>=1)
  {
   if((i+k)>L->length)
   {
    printf("error!\n");
   }
   else
   {
    for(j=i-1+k;j<L->length;j++)
    {
     L->a[i-1]=L->a[j];
     i++;
    }
    L->length=L->length-k;
   }

  }
  else
  {
   printf("\nerror!\n");
  }
}
void main()
{
 sqlist *a;
 int i,k;
 creat(&a);
 getch();
 out(&a);
 getch();
 printf("\n\n请输入您要删除的第i个k个数(i k):");
 scanf("%d%d",&i,&k);
 delet(&a,i,k);
 out(&a);
 getch();
 exit(0);
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 算法如下: 1. 判断i和k是否合法,即i+k是否超出线性的范围,若超出则删除失败,返回原线性。 2. 从第i+k个元素开始,将其后面的元素向前移动k个位置,覆盖掉要删除元素。 3. 将线性的长度减去k,即可删除k个元素。 具体实现如下: void delete_k_elements(int i, int k, int l[]) { int len = sizeof(l) / sizeof(l[]); // 获取线性长度 if (i + k > len) { // 判断i和k是否合法 printf("删除失败,超出线性范围"); return; } for (int j = i + k; j < len; j++) { // 将后面的元素向前移动k个位置 l[j - k] = l[j]; } len -= k; // 删除k个元素 } ### 回答2: 解决这个问题的算法需要几个步骤。我们可以从起点i开始,将从i+k到线性的最后一个位置的所有元素依次向前移动k个位置。这样就会将要删除的k个元素覆盖掉。最后,我们再将线性的长度减去k即可。 下面是详细的算法: 首先,检查输入的参数是否合法:如果i小于0或k小于1,或者i+k大于线性的长度,则输入不合法,返回错误信息。 然后,我们需要使用循环来完成移动元素的工作。我们从i+k位置开始,一直到线性的最后一个位置,每个元素都要依次向前移动k个位置。 移动元素后,将线性的长度减去k,以便删除元素占据的空间被释放。 最后,返回成功删除元素后的线性。 下面是算法的伪代码实现: def delete_elements(l, i, k): # 检查输入是否合法 if i < 0 or k < 1 or i + k > len(l): return "输入不合法" # 移动元素 for j in range(i + k, len(l)): l[j-k] = l[j] # 删除元素后更新线性的长度 l = l[:len(l)-k] return l 这个算法的时间复杂度为O(n),其中n是线性的长度。它的空间复杂度也为O(n),因为它需要操作原始的线性。 ### 回答3: 删除线性中指定位置的元素,需要在顺序l中按照一定的规则进行操作。 我们可以采用以下步骤来完成该算法: 1、检查线性长度:首先,我们需要确保线性l中包含足够的元素以容纳删除操作。如果线性长度小于开始位置i+k,则删除操作无法完成,我们需要给出相应的错误提示。 2、从第i个元素开始遍历:从要删除元素的位置i开始,我们需要遍历线性l,并用i+k作为截止点。 3、覆盖被删除元素的位置:首先,我们需要将i和i+k之间的元素线性l中删除。为了完成这一步骤,我们可以简单地将原始位置i+k后面的元素前移k个位置,以覆盖被删除元素的位置。 4、修改线性长度:最后,我们需要调整线性的长度,以避免添加位置可能会覆盖旧数据。在删除k个元素后,我们应该将线性l的长度减去k。 总结来说,我们可以通过检查线性长度、遍历线性、覆盖被删除元素位置和修改线性长度来实现从线性删除从第i个元素开始的k个元素的算法。这个算法的时间复杂度是O(n),其中n是线性的长度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值