回 帖 发 新 帖 刷新版面

主题:关于一道题的讨论结果!!!!!

我曾经发如下一题:
   小生遇一难题,百思不得其解。大家指点一下。谢了!!
  题目: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吗??


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



battle说::题目没有错,删除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;

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



xieyong456说::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 兄的思路绝对是正确的,*/
他的目的也只是想简化程序而已~



我同意battle的意见,感谢大家!!!!!!!!!

回复列表 (共1个回复)

沙发

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

我来回复

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