链表表示八进制加法c语言,用单链表实现八进制加法操作,恳请大家看看Add( )函数的问题...
該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓
源碼:
#include
using namespace std;
typedef int DataType;
typedef struct node{
DataType data;
node* next;
}node;
//尾插法構(gòu)造單鏈表
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;
}
}
}
//八進(jìn)制A加八進(jìn)制B,結(jié)果存在鏈表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中的最后一個結(jié)點(diǎn)元素和B中同位置的元素相加后對8取余,并將余數(shù)放入A中的最后一個結(jié)點(diǎn)的數(shù)據(jù)域。
p->data=sum%8;
//記錄好此時p、q所分別指向的結(jié)點(diǎn)元素相加后是否有進(jìn)位。
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;
}
不知為啥如果鏈表A比B短,最后又有進(jìn)位,那結(jié)果一直都不對(一直比正確結(jié)果多個1)。其余情況正常。看著像是Add( )函數(shù)中A比B短這種情況的問題,但找了半天沒找到邏輯上哪有問題。
//八進(jìn)制A加八進(jìn)制B,結(jié)果存在鏈表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中的最后一個結(jié)點(diǎn)元素和B中同位置的元素相加后對8取余,并將余數(shù)放入A中的最后一個結(jié)點(diǎn)的數(shù)據(jù)域。
p->data=sum%8;
//記錄好此時p、q所分別指向的結(jié)點(diǎn)元素相加后是否有進(jìn)位。
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;
}
}
}
總結(jié)
以上是生活随笔為你收集整理的链表表示八进制加法c语言,用单链表实现八进制加法操作,恳请大家看看Add( )函数的问题...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 咽喉炎的症状有哪些
- 下一篇: 修补过的龋齿怎么护理