2014-02-10 112 views
0

我正在做一项任务,教授不希望我们使用任何其他代码来插入除他提供的伪代码以外的值。我误解了这个伪代码吗?

我在做什么的简要说明。我正在创建一个动态的整数数组,它们将按顺序插入(从最低到最高)。

这里是他提供的伪代码:

for (i = valueNum - 1; array[i] is the wrong spot for newValue; --i) 
    array[i] = array[i-1] 

其中阵列[i]是用于NEWVALUE错了地方:

(i > 0) AND (value at array[i-1] is greater than newValue) 

他也包括这样的信息:

你也应该说服自己上述伪代码适用于(即,也覆盖)要存储的新值是#1值的情况,要存储的新值大于或等于最高现有值的情况,以及要存储的新值小于或等于最小现有值的情况。

所以,它看起来很直截了当。我给它一个尝试:

void IntArray::insert(int nInt) 
{ 
    /* check if resize is needed */ 
    if(mySize == capacity) 
    { 
     int newCapacity = capacity * 1.5; 
     if(newCapacity == capacity) 
      newCapacity = capacity + 1; 
     capacity = newCapacity; 
    } 

    /* here is where my mistake was */ 
    int i; 
    mySize++; 

    for(i = mySize -1; i > 0 && data[i-1] > nInt; --i) 
    { 
     data[i] = data[i - 1]; 
    } 
    data[i] = nInt; 
} 

现在看来似乎正确遵循伪代码,但它看起来像它不将永远工作,如果mySize为0或1。有人能指出我在正确的方向?

+0

您是否尝试过使用mySize在0或1处运行它?怎么了? –

+0

只是在不改变存储空间的情况下更改'容量'是不会有太大帮助的,是吗?你不需要分配一些东西吗?你也从来没有实际存储新的价值。 –

+0

@DamienBlack它不会进入循环,因为它不符合条件语句。 – Bobbin4Apples

回答

1

在不同的意见,我说:

只是不断变化的容量不改变存储是不会帮助很大,是吗?你不需要分配一些东西吗?你也从来没有实际存储新的价值。

和(轻度编辑):

更新(定时2014年2月10日19:19:10Z)看起来像什么,我期望使用。当mySize最初为0时它显然起作用;你增加它到1,然后设置i = 0并倒计时(一个无操作),结束设置data[0] = nInt;。当你有一行时,新的可以比现有的更大,或者小于或等于现有的。如果它更大,则i不会递减,因此新条目将在处放入您想要的位置。如果它较小,则i递减,旧值由循环主体向上移动,并将新值插入data[0]所需的位置。冲洗并重复...