日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链表系列之单链表——使用单链表实现大整数相加

發布時間:2025/3/20 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表系列之单链表——使用单链表实现大整数相加 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文:http://blog.csdn.net/iloveyoujelly/article/details/38321735

大數相加在我之前的一篇博客里有一個使用數組實現的方案,使用單鏈表實現更靈活。

有兩個由單鏈表表示的數。每個結點代表其中的一位數字。

數字的存儲是逆序的, 也就是說個位位于鏈表的表頭。
寫一函數使這兩個數相加并返回結果,結果也由鏈表表示。

eg.

?Input:(3->9->6), (4->7->8->3)

Output:(7->6->5->4)

?

[html]?view plaincopy
  • #include?<iostream>??
  • #include?<stack>??
  • using?namespace?std;??
  • ??
  • typedef?struct?node??
  • {??
  • ????int?data;??
  • ????node?*next;??
  • }Node,?*LinkList;??
  • //建立鏈表??
  • Node*?createList(const?int?a[],?int?n)??
  • {??
  • ????Node?*head,?*endPtr;??
  • ????head?=?endPtr?=?NULL;??
  • ??????
  • ????for(int?i=0;i<n;i++)??
  • ????{??
  • ????????Node?*temp?=?new?Node; / /node = (struct Node *)malloc(sizeof(struct Node));
  • ????????temp->data?=?a[i];??
  • ????????temp->next?=?NULL;??
  • ??
  • ????????if(i==0)??
  • ????????{??
  • ????????????head?=?endPtr?=?temp;??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????endPtr->next?=?temp;??
  • ????????????endPtr?=?temp;??
  • ????????}??
  • ????}??
  • ??
  • ????return?head;??
  • }??
  • /*從尾到頭打印鏈表,要求不修改鏈表結構*/??
  • //使用棧適配器??
  • void?PrintListReversing(LinkList?pHead)??
  • {??
  • ????stack<Node*>?nodes;??
  • ????Node*?pNode?=?pHead;??
  • ??????
  • ????if(pNode==NULL)??
  • ????????return;??
  • ??
  • ????while(pNode!=NULL)???//將節點依次入棧??
  • ????{??
  • ????????nodes.push(pNode);??
  • ????????pNode?=?pNode->next;??
  • ????}??
  • ??
  • ????while(!nodes.empty())???//出棧??
  • ????{??
  • ????????pNode?=?nodes.top();???//讀取棧頂元素??
  • ????????cout<<pNode->data;??
  • ????????nodes.pop();???//刪除棧頂元素??
  • ????}??
  • }??
  • //大數相加??
  • Node?*ListAdd(Node*?L1,?Node*?L2)??
  • {??
  • ????if(L1==NULL)??
  • ????????return?L2;??
  • ????if(L2==NULL)??
  • ????????return?L1;??
  • ??
  • ????Node?*ptr1?=?L1,?*ptr2?=?L2,?*ResultPtr=NULL,?*TmpPtr=NULL;??
  • ????int?carry?=?0;??
  • ??
  • ????Node?*p_node?=?new?Node();??
  • ????p_node->data?=?(L1->data+L2->data)%10;??
  • ????p_node->next?=?NULL;??
  • ????carry?=?(L1->data+L2->data)/10;??
  • ????ResultPtr?=?TmpPtr?=?p_node;??
  • ????TmpPtr->next?=?NULL;??
  • ????L1?=?L1->next;??
  • ????L2?=?L2->next;??
  • ??
  • ????while(L1?&&?L2)??
  • ????{??
  • ????????Node?*pNode?=?new?Node();??
  • ????????TmpPtr->next?=?pNode;??
  • ??
  • ????????int?tmp?=?L1->data+L2->data+carry;??
  • ????????carry?=?tmp/10;??
  • ????????pNode->data?=?tmp%10;??
  • ????????pNode->next?=?NULL;??
  • ??
  • ????????TmpPtr?=?TmpPtr->next;??
  • ????????L1?=?L1->next;??
  • ????????L2?=?L2->next;??
  • ????}??
  • ??
  • ????while(L1)??
  • ????{??
  • ????????Node?*pNode?=?new?Node();??
  • ????????TmpPtr->next?=?pNode;??
  • ??
  • ????????int?tmp?=?L1->data+carry;??
  • ????????carry?=?tmp/10;??
  • ????????pNode->data?=?tmp%10;??
  • ????????pNode->next?=?NULL;??
  • ??
  • ????????TmpPtr?=?TmpPtr->next;??
  • ????????L1?=?L1->next;??
  • ????}??
  • ????while(L2)??
  • ????{??
  • ????????Node?*pNode?=?new?Node();??
  • ????????TmpPtr->next?=?pNode;??
  • ??
  • ????????int?tmp?=?L2->data+carry;??
  • ????????carry?=?tmp/10;??
  • ????????pNode->data?=?tmp%10;??
  • ????????pNode->next?=?NULL;??
  • ??
  • ????????TmpPtr?=?TmpPtr->next;??
  • ????????L2?=?L2->next;??
  • ????}??
  • ??
  • ????if(carry)??
  • ????{??
  • ????????Node?*pNode?=?new?Node();??
  • ????????TmpPtr->next?=?pNode;??
  • ??
  • ????????pNode->data?=?carry;??
  • ????????pNode->next?=?NULL;??
  • ????}??
  • ??
  • ????return?ResultPtr;??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?a[]?=?{1,9,9};??//991??
  • ????int?b[]?=?{9,8,5,6,6,2,8};???//8266589??
  • ????Node?*L1?=?createList(a,3),?*L2?=?createList(b,7),?*L3?=?NULL;??
  • ??
  • ????L3?=?ListAdd(L1,L2);??
  • ??
  • ????PrintListReversing(L1);??
  • ????cout<<"+";??
  • ????PrintListReversing(L2);??
  • ????cout<<"=";??
  • ????PrintListReversing(L3);??
  • ????cout<<endl;??
  • ??
  • ????return?1;??
  • } ?
  • 總結

    以上是生活随笔為你收集整理的链表系列之单链表——使用单链表实现大整数相加的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。