您的位置:首页 > 其它

链表相加

2016-04-28 14:51 363 查看
链表相加:

给定两个链表,分别表示两个非负整数。它们的数字逆序存储在链表中,且每个结点中存储一个数字,计算两个数的和,并且返回和的链表头指针。

如:输入:2->4->3,5->6->4.

输出:7->0->8.

程序实现:

/************************************
File Name:ListAdd.cpp
Author: godfrey
Created Time: 2016/04/28
*************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

typedef struct tagSNode{
int value;
tagSNode* pNext;

tagSNode(int v):value(v),pNext(NULL) {}
}SNode;
//打印链表
void Print(SNode* pHead){
SNode* p = pHead->pNext;
while(p){
cout<<p->value<<" ";
p = p->pNext;
}
cout<<endl;
}
//删除分配结点空间
void Destroy(SNode* pHead){
SNode* p = pHead->pNext;
while(p){
pHead->pNext = p->pNext;//与头插法相反
delete p;
p = pHead->pNext;
}
delete pHead;
}
//链表相加
SNode* ListAdd(SNode* pHead1,SNode* pHead2){
SNode* pSum = new SNode(0);
SNode* pTail = pSum;//新结点插入pTail的后面
SNode* p1 = pHead1->pNext;
SNode* p2 = pHead2->pNext;
SNode* pCur = NULL;
int carry = 0;//进位
int value;
//处理两者都存在的加法
while(p1&&p2){
value = p1->value + p2->value +carry;
carry = value / 10;
value %= 10;
pCur = new SNode(value);
pTail->pNext = pCur;
pTail = pCur;

p1 = p1->pNext;
p2 = p2->pNext;
}
//处理长的链表
SNode* p = p1 ? p1 : p2;
while(p){
value = p->value +carry;
carry = value / 10;
value %= 10;
pCur = new SNode(value);
pTail->pNext = pCur;
pTail = pCur;

p = p->pNext;
}
//处理可能存在的进位
if(carry!=0){
pTail->pNext = new SNode(carry);
}

return pSum;
}

int main()
{
SNode* pHead1 = new SNode(0);
for(int i=0;i<6;i++){
SNode* p = new SNode(rand()%10);
p->pNext = pHead1->pNext;
pHead1->pNext = p;
}

SNode* pHead2 = new SNode(0);
for(int i=0;i<9;i++){
SNode* p = new SNode(rand()%10);
p->pNext = pHead2->pNext;
pHead2->pNext = p;
}
Print(pHead1);
Print(pHead2);
SNode* pSum = ListAdd(pHead1,pHead2);
Print(pSum);
Destroy(pHead1);
Destroy(pHead2);
Destroy(pSum);
return 0;
}


运行结果:



转载请注明出处:http://www.cnblogs.com/gaobaoru-articles/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: