链表表示八进制加法c语言,用单链表实现八进制加法操作,恳请大家看看Add( )函数的问题...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

2e24c89dac1a649c2e4bf9ede453db19.png

源码:

#include

using namespace std;

typedef int DataType;

typedef struct node{

DataType data;

node* next;

}node;

//尾插法构造单链表

void init(node* &first,int len)

{

first = NULL;

node* rear;

for(int i=0;i

DataType elem;

cin>>elem;

node* s = new node;

s->data = elem;

s->next = NULL;

if(first == NULL){

first = s;

rear = first;

}

else{

rear->next = s;

rear = s;

}

}

}

//八进制A加八进制B,结果存在链表A中

void add(node* A,node* B)

{

node* p=A,*q=B;

int flag=0,sum=0;

while(p->next!=NULL&&q->next!=NULL){

sum=p->data+q->data+flag;

p->data=sum%8;

flag=sum/8;

p=p->next;

q=q->next;

}

//A、B等长

if(p->next==NULL&&q->next==NULL){

sum=p->data+q->data+flag;

p->data=sum%8;

flag=sum/8;

if(flag==1){

node* s = new node;

s->data = flag;

s->next = NULL;

p->next=s;

}

}

//A比B短

if(p->next==NULL&&q->next!=NULL){

sum=p->data+q->data+flag;

//将A中的最后一个结点元素和B中同位置的元素相加后对8取余,并将余数放入A中的最后一个结点的数据域。

p->data=sum%8;

//记录好此时p、q所分别指向的结点元素相加后是否有进位。

flag=sum/8;

while(q->next!=NULL){

node* s = new node;

sum=q->next->data+flag;

s->data=sum%8;

flag=sum/8;

s->next = NULL;

p->next=s;

p=p->next;

q=q->next;

}

if(flag==1&&q->next==NULL){

node* s = new node;

s->data=flag;

s->next = NULL;

p->next=s;

}

}

//A比B长

if(q->next==NULL&&p->next!=NULL){

sum=p->data+q->data+flag;

p->data=sum%8;

flag=sum/8;

while(p->next!=NULL){

if(flag==1){

sum=p->next->data+flag;

p->next->data=sum%8;

flag=sum/8;

p=p->next;

}

else

break;

}

if(flag==1&&p->next==NULL){

node* s = new node;

s->data=flag;

s->next = NULL;

p->next=s;

}

}

}

void reverseList(node* &first)

{

node* q=first,*p=first;

if(first==NULL){

return;

}

else{

while(p->next!=NULL){

p=p->next;

}

first=p;

p=q->next;

while(q!=first){

q->next=first->next;

first->next=q;

q=p;

p=p->next;

}

}

}

void show(node* first)

{

node* p = first;

if(p == NULL) cout<

else{

cout<

while(p != NULL){

cout<data;

p = p->next;

}

cout<

}

}

int main()

{

node*A,*B;

int aLen,bLen;

cout<

cin>>aLen;

if(aLen>0){

cout<

}

init(A,aLen);

cout<

cin>>bLen;

if(bLen>0){

cout<

}

init(B,bLen);

reverseList(A);

reverseList(B);

add(A,B);

reverseList(A);

show(A);

return 0;

}

7c9ac39bc5939f06051e0a744f7632fb.png

c5597195da2d6864102d96abe7764160.png

不知为啥如果链表A比B短,最后又有进位,那结果一直都不对(一直比正确结果多个1)。其余情况正常。看着像是Add( )函数中A比B短这种情况的问题,但找了半天没找到逻辑上哪有问题。

//八进制A加八进制B,结果存在链表A中

void add(node* A,node* B)

{

node* p=A,*q=B;

int flag=0,sum=0;

while(p->next!=NULL&&q->next!=NULL){

sum=p->data+q->data+flag;

p->data=sum%8;

flag=sum/8;

p=p->next;

q=q->next;

}

//A、B等长

if(p->next==NULL&&q->next==NULL){

sum=p->data+q->data+flag;

p->data=sum%8;

flag=sum/8;

if(flag==1){

node* s = new node;

s->data = flag;

s->next = NULL;

p->next=s;

}

}

//A比B短

if(p->next==NULL&&q->next!=NULL){

sum=p->data+q->data+flag;

//将A中的最后一个结点元素和B中同位置的元素相加后对8取余,并将余数放入A中的最后一个结点的数据域。

p->data=sum%8;

//记录好此时p、q所分别指向的结点元素相加后是否有进位。

flag=sum/8;

while(q->next!=NULL){

node* s = new node;

sum=q->next->data+flag;

s->data=sum%8;

flag=sum/8;

s->next = NULL;

p->next=s;

p=p->next;

q=q->next;

}

if(flag==1&&q->next==NULL){

node* s = new node;

s->data=flag;

s->next = NULL;

p->next=s;

}

}

//A比B长

if(q->next==NULL&&p->next!=NULL){

sum=p->data+q->data+flag;

p->data=sum%8;

flag=sum/8;

while(p->next!=NULL){

if(flag==1){

sum=p->next->data+flag;

p->next->data=sum%8;

flag=sum/8;

p=p->next;

}

else

break;

}

if(flag==1&&p->next==NULL){

node* s = new node;

s->data=flag;

s->next = NULL;

p->next=s;

}

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值