C++使用链表、模板和堆栈设计了一个大整数加减法类



当前我只实现了添加部分。

在主功能中,我的程序实际上可以分别打印出n2和n3,但它无法打印出下一个"n2+n3"案例,因为它会出现运行时错误。

设置断点后,我发现当bigInteger&n转移到情况"n2+n3"中,下面的语句不起作用,因此n的内容没有被修改。
linkedListIterator r=n.digitals.begin()


以下是该程序的三段代码。还有另一个链表头文件,它定义了node、迭代器(p,q)和一些成员函数(如insert()和length())的用法。

无论如何,谢谢你的帮助。

class bigInteger
{
private:
int sign;                       // set 0 for positive, 1 for negative
linkedListType<int> digits;     // internal linked-list for storing digits in reverse order
public:
bigInteger();                           // default constructor
bigInteger(const bigInteger& other);    // copy constructor
// Overload constructor
// Use an numerical string to construct this bigInteger
// For negative number, the first char in the string is '-'
// e.g. "-12345"
bigInteger(const string& number);       
// overload the assignment operator
const bigInteger& operator= (const bigInteger& other);
// Return a new bigInteger that is equal to *this + other
// The contents of this and other should not be modified
bigInteger& operator+ (bigInteger& other);
// Return a new bigInteger that is equal to *this - other
// The contents of this and other should not be modified
bigInteger& operator- (bigInteger& other);
// Print a big integer
// Since the digits are stored in reverse order in the internal
// list, you should print the list reversely
// Print "undefined" if the digits list is empty
friend ostream& operator<<(ostream& os, bigInteger& n);
};


第二个是关于成员函数的实现。


bigInteger& bigInteger::operator+ ( bigInteger& other )
{
bigInteger resultBI; //saving the answer
bigInteger forSwap;  //not used
bool explicitSign = 0; //..
stack<int> resultStack; // stack saving the answer, later converting to Type BigInteger
int result;    //local var for addition
int carry = 0; //..
linkedListIterator<int> p = digits.begin();       //iterator marking the first node
linkedListIterator<int> q = other.digits.begin(); //..

if ( this->digits.length() >= other.digits.length() )
{
    while ( q != NULL )
    {
        result = ( *p + *q + carry ) % 10;  //  '*' acts like dereference
        carry = ( *p + *q + carry ) / 10;
        ++p;                                // "++' acts like increment to the link
        ++q;
        resultStack.push(result);          
    }
    while ( p != NULL )  //remaining carry
    {
        result = ( *p + carry ) % 10;
        carry = ( *p + carry ) / 10;
        ++p;
        resultStack.push(result);
    }
}
if ( this->digits.length() < other.digits.length() )
{
    while ( p != NULL )
    {
        result = ( *p + *q + carry ) % 10;
        carry = ( *p + *q + carry ) / 10;
        ++p;
        ++q;
        resultStack.push(result);
    }
    while ( q != NULL )
    {
        result = ( *q + carry ) % 10;
        carry = ( *q + carry ) / 10;
        ++q;
        resultStack.push(result);
    }
}
if ( carry != 0 )             //push and remaining carry
{
    resultStack.push(carry);
}

while ( !resultStack.empty() )                  //convert the stack to Type bigInteger
{
    resultBI.digits.insert ( resultStack.top() );
    resultStack.pop();
}
if ( explicitSign == 1 )  // not used
    resultBI.sign = 1;
return resultBI;
}


最后一部分是主要功能

int main()
{
//-------- Test Case 1
bigInteger n1;                  
bigInteger n2("987654321");     
bigInteger n3("123456789");     
cout << "n1 = ";
cout << n1 << endl;             // undefined
cout << "n2 = ";
cout << n2 << endl;             // 987654321
cout << "n3 = ";
cout << n3 << endl;             // 123456789
//-------- Test Case 2
cout << "n2 + n3 = ";
cout << n2 + n3 << endl;    // 1111111110 //run-time error
return 0;
}

问题是,您通过引用一个局部变量来返回结果,该变量在返回后立即消失。

将您的操作员定义为按价值返回,它应该工作得更好:

bigInteger operator+ (bigInteger& other);   // return by value.  

附加信息:

  • 这里有一篇文章,其中包含了很好地解释这个问题的指导原则("按值返回对象"部分)。

  • 这里有一篇关于运营商过载的文章,由运营商家族解释了采取的方法和避免的陷阱。

相关内容

  • 没有找到相关文章

最新更新