在一段利(没)用(事)链(找)表(事)来实现正整数相加的程序中,有一个函数是这样的,实现了将位数较小的链表最高位加到位数较大的链表上的功能。
void addMostDigit(List addee, List adder){//addee的位数不小于adder
int index = addee.size() – adder.size();
int sum = addee.get(index)->digit + adder.header->digit;
adder.header = adder.header->next;
if (sum < 10)
{
addee.get(index)->digit = sum;
return;
}
while (sum >= 10){
addee.get(index)->digit = sum % 10;
if (index == 0)//需要变动最高位
{
Node* newHead = new Node(‘1’);
newHead->next = addee.header;
addee.header = newHead;
break;
}
sum = addee.get(–index)->digit + sum / 10;
if (sum < 10)
{
addee.get(index)->digit = sum;
break;
}
}
}
错误是很简单的,此处传递的List应该是List*,而非List;这一点相信在交换两个整数值的函数中就已明确。我犯错的原因,大概是不知不觉间又用了java的思维——一切都是引用变量。
解决方案很简单,该用地址传递即可。
void addMostDigit(List* addee, List* adder){
int index = addee->size() – adder->size();
int sum = addee->get(index)->digit + adder->header->digit;
adder->header = adder->header->next;
if (sum < 10)
{
addee->get(index)->digit = sum;
return;
}
while (sum >= 10){
addee->get(index)->digit = sum % 10;
if (index == 0)
{
Node* newHead = new Node(‘1’);
newHead->next = addee->header;
addee->header = newHead;
break;
}
sum = addee->get(–index)->digit + sum / 10;
if (sum < 10)
{
addee->get(index)->digit = sum;
break;
}
}
}
从这个角度讲,java的原点运算符实际上等价于C++的->,而java编程时的规则,不过是C++可遵守的诸多规则之一而已。
换而言之,在栈帧的调用时,准备的入口参数中,真的包含了List这个struct的实体。那么,如果struct很大的话,这样的函数调用岂不是花费巨大?如果这样,那么全部用指针或引用(引用更安全一些),或许会是一种很好的编程方法。
评论0