主题:关于一道题的讨论结果!!!!!
我曾经发如下一题:
小生遇一难题,百思不得其解。大家指点一下。谢了!!
题目: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的意见,感谢大家!!!!!!!!!
小生遇一难题,百思不得其解。大家指点一下。谢了!!
题目: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的意见,感谢大家!!!!!!!!!