回 帖 发 新 帖 刷新版面

主题:百思不得理解!!!指点加分!!

小生遇一难题,百思不得其解。大家指点一下。谢了!!
  题目:Status DeleteK(SqList &a,int i,int k)//删除线性表a中第i个元素起的k个元素
{
  if(i<1||k<0||i+k-1>a.length) return INFEASIBLE;
  for(count=1;i+count-1<=a.length-k;count++) //注意循环结束的条件
    a.elem[i+count-1]=a.elem[i+count+k-1];
  a.length-=k;
  return OK;
}//DeleteK 

不懂之处:for(count=1;i+count-1<=a.length-k;count++) 
         a.elem[i+count-1]=a.elem[i+count+k-1];
         a.length-k不是就等于i吗??

回复列表 (共11个回复)

沙发

原循环条件似乎有错误,应该写成
for(count=0; count<k; count++) //注意循环结束的条件
    a.elem[i+count]=a.elem[i+count+k];
才对

板凳

亏你的专家分比我高几千,不过谢谢你来顶哦  要想听详细解释加我QQ:178424225

3 楼


题目没有错,删除K个元素后剩余a.length-k个元素,也就是说删除元素后数组的下标要 小于等于a.length-k,也就是题目中的i+count-1<=a.length-k(已知数组下标是从1开始的)

a.elem[i+count-1]=a.elem[i+count+k-1];此语句是在移动元素,删除第i个元素起的k个元素也就是删除了 第 i+k 个元素的前 k 个元素,那么就要移动从第i+k个元素起后的所有元素到前面相应的位置,也就是这里的a.elem[i+count+k-1]
count是从1开始的,所以有个-1;

实在不明白就具体举个例子试试看了!![em9]

4 楼

#include <stdio.h>
void DeleteK(int a[], int i, int  k);
int main(void)
{
    int n, k;
    int a[8] = {2,3,6,1,8,9,7,4};
    
    scanf("%d%d", &n, &k);
    
    DeleteK(a, n, k);
    getch();
}
void DeleteK(int a[], int i, int  k)
{
     int count;
     for(count = 0; count < 8 - k; count++)
     {
         a[i+count-1] = a[i+count+k-1];
     }
     
     for(count = 0; count < 8 - k; count++)
     {
         printf("%d ", a[count]);
     }
}
删除线性表a中第i个元素起的k个元素
其实对这句话只稍微描几眼很有可能会引起错误
是第i个元素后开始还是包括第i个元素
明显是包括第i个元素 ,所以要加(-1)
2,3,6,1,8,9,7,4 a.elem[i+count+k-1]这个意思就是
把8移动过来覆盖6,只是跨度变了而已~!


其实/*goal00001111 兄的思路绝对是正确的,*/
他的目的也只是想简化程序而已~

5 楼

battle和我想的一样 给你30

6 楼

至于xieyong456  2楼的思路是是对的 但是考虑不全 错在count〈k,count是有可能大于k的   谢谢参与 给你们10分

7 楼

[quote]至于xieyong456  2楼的思路是是对的 但是考虑不全 错在count〈k,count是有可能大于k的   谢谢参与 给你们10分[/quote]

无语!再仔细看看题目和条件吧

8 楼

我觉得我应该没错  原题我倒是看懂了  你说的循环我开始也是这么想的
 打个比方吧  1 2 3 4 5 6 7 8 9  i=5 k=2
             for(count=0; count<k; count++) //注意循环结束的条件
             a.elem[i+count]=a.elem[i+count+k];
              则a.elem[5]=a.elem=[7]
                a.elem[6]=a.elem[8]
                 那么a.elem[9]呢  没有前移  最后不是给删除了吗???

9 楼

惭愧!我错了!确实应该增加一个条件 count+k < a.length

10 楼

楼主的程序是正确的,但不好理解.现给出一个稍微好理解点的程序:
Status DeleteK(SqList &a,int i,int k)//删除线性表a中第i个元素起的k个元素
{
  if(i<1||k<0||i+k-1>a.length) return INFEASIBLE;
  int moveTimes = a.length - (i + k);//移动元素的次数(被移动的元素在区间[a.length-(i+k),a.length)) 
  for(count=0; count<moveTimes; count++) //注意循环结束的条件
    a.elem[i+count]=a.elem[i+count+k];
  a.length-=k;
  return OK;
}//DeleteK 

算法思想是把区间[a.length-(i+k),a.length))向前平移k个位置

我来回复

您尚未登录,请登录后再回复。点此登录或注册