主题:百思不得理解!!!指点加分!!
lg182
[专家分:40] 发布于 2006-11-27 21:16:00
小生遇一难题,百思不得其解。大家指点一下。谢了!!
题目: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个回复)
沙发
goal00001111 [专家分:4030] 发布于 2006-11-27 22:45:00
原循环条件似乎有错误,应该写成
for(count=0; count<k; count++) //注意循环结束的条件
a.elem[i+count]=a.elem[i+count+k];
才对
板凳
lg182 [专家分:40] 发布于 2006-11-27 22:53:00
亏你的专家分比我高几千,不过谢谢你来顶哦 要想听详细解释加我QQ:178424225
3 楼
battle [专家分:650] 发布于 2006-11-27 23:47:00
题目没有错,删除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 楼
xieyong456 [专家分:2620] 发布于 2006-11-28 12:35:00
#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 楼
lg182 [专家分:40] 发布于 2006-11-28 14:21:00
battle和我想的一样 给你30
6 楼
lg182 [专家分:40] 发布于 2006-11-28 14:23:00
至于xieyong456 2楼的思路是是对的 但是考虑不全 错在count〈k,count是有可能大于k的 谢谢参与 给你们10分
7 楼
goal00001111 [专家分:4030] 发布于 2006-11-28 18:59:00
[quote]至于xieyong456 2楼的思路是是对的 但是考虑不全 错在count〈k,count是有可能大于k的 谢谢参与 给你们10分[/quote]
无语!再仔细看看题目和条件吧
8 楼
lg182 [专家分:40] 发布于 2006-11-28 19:35:00
我觉得我应该没错 原题我倒是看懂了 你说的循环我开始也是这么想的
打个比方吧 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 楼
goal00001111 [专家分:4030] 发布于 2006-11-29 07:38:00
惭愧!我错了!确实应该增加一个条件 count+k < a.length
10 楼
goal00001111 [专家分:4030] 发布于 2006-11-29 08:17:00
楼主的程序是正确的,但不好理解.现给出一个稍微好理解点的程序:
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个位置
我来回复