#include<bits/stdc++.h>
using namespace std;
class Big_Number{
public:
Big_Number(); //构造函数
~Big_Number(); //析构函数
Big_Number &operator = (Big_Number && rhs)noexcept;
Big_Number(Big_Number &&)noexcept; //移动构造
void read(); //读入数据
void display()const; //显示并换行
void display(int x)const; //重载,显示不换行
int compare(const Big_Number &rhs)const; //比较大小
void Compare_And_Display(const Big_Number &rhs); //比较大小后显示
Big_Number plus(const Big_Number &rhs); //加法
Big_Number subtraction(const Big_Number &rhs); //减法
private:
struct Node{
int data;
struct Node *pre;
struct Node *next;
}*pHead,*pTail;
int len; //链表长度
};
//构造函数
Big_Number::Big_Number(){
pHead = new Node;
pHead ->next =NULL;
}
//析构函数
Big_Number::~Big_Number(){
while(pHead){
Node *p=pHead;
pHead=p->next;
delete p;
}
}
移动赋值
Big_Number & Big_Number::operator =(Big_Number &&rhs)noexcept{
Node *p = this->pHead;
this->pHead = rhs.pHead;
rhs.pHead=p;
p = this->pTail;
this->pTail = rhs.pTail;
rhs.pTail = p;
this->len = rhs.len;
return *this;
}
//移动构造函数
Big_Number::Big_Number(Big_Number &&rhs)noexcept{
pHead = rhs.pHead;
rhs.pHead = NULL;
}
//读入函数
void Big_Number::read(){
string s;
cin>>s;
Node *p=pHead;
int i =0;
while(s[i]!='\0'){
Node *q = new Node;
q->data=s[i]-'0';
p->next=q;
q->pre=p;
p=q;
i++;
}
pTail=p;
len=i;
}
//显示
void Big_Number::display()const{
Node *p = pHead->next;
for(int i=0;i<len;i++){
cout<<p->data;
p=p->next;
}
cout<<endl;
}
void Big_Number::display(int x)const{
Node *p = pHead->next;
for(int i=0;i<len;i++){
cout<<p->data;
p=p->next;
}
}
//比较函数,大于返回1,等于返回0,小于返回-1;
int Big_Number::compare(const Big_Number &rhs)const{
if(len < rhs.len) return -1;
else if (len > rhs.len) return 1;
else{
Node *p1=pHead->next;
Node *p2=rhs.pHead->next;
int i=1;
while(i<len &&p1->data == p2->data){
p1=p1->next;
p2=p2->next;
i++;
}
if(p1->data>p2->data) return 1;
else if (p1->data<p2->data) return -1;
else return 0;
}
}
//比较并显示 要改
void Big_Number::Compare_And_Display(const Big_Number &rhs){
display(1);
if (compare(rhs)==1) cout<<'>';
else if (compare(rhs)==0) cout<<'=';
else cout<<'<';
rhs.display();
}
Big_Number Big_Number::plus(const Big_Number &rhs){
Big_Number result;
Node *front = new Node;
Node *s=front; //为了和原来的链表具有一样的结构,最后释放这个空的尾结点;
Node *p=pTail;
Node *q=rhs.pTail;
int jw=0;
for(int i=0;i<min(len,rhs.len);i++){
Node *newnode = new Node;
newnode->data=(p->data+q->data+jw)%10;
jw=(p->data+q->data+jw)/10;
newnode->next=front;
front->pre=newnode;
front=newnode;
p=p->pre;
q=q->pre;
}
if(len>min(len,rhs.len)){
for (int i=0;i<len-min(len,rhs.len);i++){
Node *newnode = new Node;
newnode->data=(p->data+jw)%10;
jw=(p->data+jw)/10;
newnode->next=front;
front->pre=newnode;
front=newnode;
p=p->pre;
}
if(jw>0){
Node *newnode = new Node;
newnode->data=jw;
newnode->next=front;
front->pre=newnode;
front=newnode;
result.pHead->next=front;
front->pre= result.pHead;
result.len=len+1;
}
else{
result.pHead->next=front;
front->pre= result.pHead;
result.len=len;
}
}
else if(rhs.len>min(len,rhs.len)){
for (int i=0;i<rhs.len-min(len,rhs.len);i++){
Node *newnode = new Node;
newnode->data=(q->data+jw)%10;
jw=(q->data+jw)/10;
newnode->next=front;
front->pre=newnode;
front=newnode;
q=q->pre;
}
if(jw>0){
Node *newnode = new Node;
newnode->data=jw;
newnode->next=front;
front->pre=newnode;
front=newnode;
result.pHead->next=front;
front->pre= result.pHead;
result.len=rhs.len+1;
}
else{
result.pHead->next=front;
front->pre= result.pHead;
result.len=rhs.len;
}
}
else{
if(jw>0){
Node *newnode = new Node;
newnode->data=jw;
newnode->next=front;
front->pre=newnode;
front=newnode;
result.pHead->next=front;
front->pre= result.pHead;
result.len=rhs.len+1;
}
else{
result.pHead->next=front;
front->pre= result.pHead;
result.len=rhs.len;
}
}
result.pTail=s->pre;
s->pre->next = NULL;
delete s;
return result;
}
Big_Number Big_Number::subtraction(const Big_Number &rhs){
Big_Number result;
Node *front = new Node;
Node *s=front; //为了和原来的链表具有一样的结构,最后释放这个空的尾结点;
Node *p=pTail;
Node *q=rhs.pTail;
if(compare(rhs)==2){
for(int i=0;i<rhs.len;i++){
Node *newnode = new Node;
if(p->data<q->data){
newnode->data = p->data - q->data+10;
p->pre->data-=1;
}
else {newnode->data=p->data - q->data;}
p=p->pre;
q=q->pre;
front->pre=newnode;
newnode->next=front;
front=newnode;
}
for(int i=0;i<len-rhs.len;i++){
Node *newnode = new Node;
newnode->data=p->data;
p=p->pre;
front->pre=newnode;
newnode->next=front;
front=newnode;
}
//去除前导0
result.len=len;
Node *tmp=front;
while(front->data==0){
front=front->next;
delete tmp;
tmp = front;
result.len--;
}
}
else if(compare(rhs)==0){
for(int i=0;i<len;i++){
Node *newnode = new Node;
if(q->data<p->data){
newnode->data = q->data - p->data+10;
q->pre->data-=1;
}
else newnode->data=q->data-p->data;
p=p->pre;
q=q->pre;
front->pre=newnode;
newnode->next=front;
front=newnode;
}
for(int i=0;i<rhs.len-len;i++){
Node *newnode = new Node;
newnode->data=q->data;
q=q->pre;
front->pre=newnode;
newnode->next=front;
front=newnode;
}
//去除前导0
result.len=rhs.len;
Node *tmp=front;
while(front->data==0){
front=front->next;
delete tmp;
tmp = front;
result.len--;
}
}
else{
Node *newnode = new Node;
newnode->data=0;
front->pre=newnode;
newnode->next=front;
front=newnode;
result.len=1;
}
result.pHead->next=front;
front->pre=result.pHead;
result.pTail=s->pre;
s->pre->next=NULL;
delete s;
return result;
}
int main(){
Big_Number s1,s2,s3,s4,s5;
s1.read();
s2.read();
s1.display();
s2.display();
s1.Compare_And_Display(s2);
s3=s1.plus(s2);
Big_Number s6(s1.plus(s2));
s3.display();
s6.display();
s4=s1.subtraction(s2);
s4.display();
s5=s3.plus(s4);
s5.display();
return 0;
}
想问一下,文章的第七八行
Big_Number &operator = (Big_Number && rhs)noexcept;
Big_Number(Big_Number &&)noexcept; //移动构造
这两处编译出现问题,能否告知如何修改