1. 程式人生 > 其它 >單鏈表應用:八進位制求和 假設用不帶頭結點的單鏈表表示八進位制數,例如八進位制數536表示成如圖所示單鏈表。要求寫一個函式Add,該函式有兩個引數A和B,分別指向表示八進位制的單鏈表,執行函式呼叫Add(A,

單鏈表應用:八進位制求和 假設用不帶頭結點的單鏈表表示八進位制數,例如八進位制數536表示成如圖所示單鏈表。要求寫一個函式Add,該函式有兩個引數A和B,分別指向表示八進位制的單鏈表,執行函式呼叫Add(A,

技術標籤:課程學習記錄

10、單鏈表應用:八進位制求和

假設用不帶頭結點的單鏈表表示八進位制數,例如八進位制數536表示成如圖所示單鏈表。要求寫一個函式Add,該函式有兩個引數A和B,分別指向表示八進位制的單鏈表,執行函式呼叫Add(A,B)後,得到表示八進位制A加八進位制B所得結果的單鏈表,結果保留在單鏈表A中。
在這裡插入圖片描述

【輸入說明】A表的長度和A表中八進位制的數碼;(中間用空格隔開)

B表的長度和B表中八進位制的數碼;(中間用空格隔開)

【輸出說明】八進位制A加八進位制B所得結果

    3

    5 3 6

    2

    5 4

【輸出樣例】

    612
#include
<iostream>
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<len;++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<<"Empty"; else{ while(p != NULL){ cout<<p->data; p = p->next; } cout<<endl; } } int main() { node*A,*B; int aLen,bLen; cin>>aLen; init(A,aLen); cin>>bLen; init(B,bLen); reverseList(A); reverseList(B); add(A,B); reverseList(A); show(A); return 0; }