简体   繁体   English

C ++使用链表,模板和堆栈设计用于大整数加法和减法的类

[英]C++ designing a class for big integer addition and subtraction using linked list, template and stack

Current I have implemented only the addition part. 目前我只实施了添加部分。

In the main function, my program can actually print out n2 n3 respectively, but it can't print out the next "n2+n3" case as it gets run-time error. 在main函数中,我的程序实际上可以分别打印出n2 n3,但它不能打印出下一个“n2 + n3”的情况,因为它会得到运行时错误。

After I set the breakpoints, I found that when bigInteger& n is passing into case "n2+n3", the follow statement didnt work and thus the content of n is not modified. 设置断点后,我发现当bigInteger&n传入case“n2 + n3”时,follow语句不起作用,因此n的内容不会被修改。
linkedListIterator r = n.digits.begin(); linkedListIterator r = n.digits.begin();


Below are three pieces of codes of the program. 以下是该程序的三段代码。 There's another linked list header file which defines the uses of node, iterator (p, q) and some member function like insert() and length(). 还有另一个链表头文件,它定义了node,iterator(p,q)和一些成员函数(如insert()和length())的用法。

Thanks anyways for your help. 不管怎样,谢谢你的帮助。

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);
};


The second one is about member function implementation. 第二个是关于成员函数的实现。


 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; } 


The last part is the main function. 最后一部分是主要功能。

 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; } 

The problem is that you return the result by reference to a local variable that will disapear as soon as you return. 问题是您通过引用返回结果返回一个局部变量,该变量将在您返回后立即消失。

Define your operator as returning by value and it should work much better: 将运算符定义为按值返回,它应该更好地工作:

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

Additional information: 附加信息:

  • Here is an article with guidelines explaining the issue pretty well (section "Returning Objects by Value"). 这篇文章的指南很好地解释了这个问题(“按值返回对象”一节)。

  • Here an article about operator overloading which explains by family of operators the approach to take and pittfalls to avoid. 这里有一篇关于运算符重载的文章 ,该文章由运营商家族解释了采取的方法和要避免的陷阱。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM