原题
You are given two linked listsrepresenting two non-negative numbers. The digits are stored in reverse orderand each of their nodes contain a single digit. Add the two numbers and returnit as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6-> 4)
Output: 7 -> 0 -> 8
题目大意
有两个单链表,代表两个非负数,每一个节点代表一个数位,数字是反向存储的,即第一个结点表示最低位,最后一个结点表示最高位。求两个数的相加和,并且以链表形式返回。
单链表头文件
#pragma once
typedef struct linknode
{
public:
intdata;
linknode*next;
}LinkNode;
class singleLink
{
private:
LinkNode*head;
public:
singleLink(void);
~singleLink(void);
boolclearSingleLink();
boolisEmpty(){return head==NULL;};
intgetSingleLinkLength();
boolgetSingleLinkItem(int i,int *e);
intlocateSingleLinkItem(int e);
boolpreSingleLinkItem(int cur_e,int *pre_e);
boolnextSingleLinkItem(int cur_e,int *next_e);
boolInsertSingleLinkItem(int i,int e);
booldeleteSingleLinkItem(int i,int *e);
LinkNode*Reverse(); //反转函数
};
单链表实现文件
#include "StdAfx.h"
#include "singleLink.h"
singleLink::singleLink(void)
{
head=NULL;
}
singleLink::~singleLink(void)
{
LinkNode*p=head;
while(head)
{
p=head;
head=head->next;
delete(p);
}
}
bool singleLink::clearSingleLink()
{
booltmp=false;
LinkNode*p=head;
while(head)
{
p=head;
head=head->next;
delete(p);
}
tmp=true;
returntmp;
}
int singleLink::getSingleLinkLength()
{
intlen=0;
LinkNode*p=head;
while(p!=NULL)
{
len++;
p=p->next;
}
returnlen;
}
bool singleLink::getSingleLinkItem(inti,int *e)
{
LinkNode*p=head;
intj=0;
while(p&&j<i)
{
p=p->next;
j++;
}
if(p==NULL)
{
returnfalse;
}
*e=p->data;
returntrue;
}
int singleLink::locateSingleLinkItem(int e)
{
inti=0;
LinkNode*p=head;
while(p!=NULL)
{
if(p->data==e)
{
returni;
}
else
p=p->next;
i++;
}
return-1;
}
bool singleLink::preSingleLinkItem(intcur_e, int *pre_e)
{
LinkNode*p=head;
if(p->data==cur_e)
returnfalse;
while(p->next!=NULL)
{
if(p->next->data==cur_e)
{
*pre_e=p->data;
returntrue;
}
else
p=p->next;
}
returnfalse;
}
bool singleLink::nextSingleLinkItem(intcur_e, int *next_e)
{
LinkNode*p=head;
if(head==NULL||head->next==NULL)
{
returnfalse;
}
while(p->next!=NULL)
{
if(p->data==cur_e)
{
*next_e=p->next->data;
returntrue;
}
else
p=p->next;
}
returnfalse;
}
bool singleLink::InsertSingleLinkItem(inti, int e)
{
LinkNode*p=head,*s;
intj=0;
if(i==0)
{
s=(LinkNode*)new LinkNode[1];
s->data=e;
s->next=p;
head=s;
returntrue;
}
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
{
returnfalse;
}
s=(LinkNode*)new LinkNode[1];
s->data=e;
s->next=p->next;
p->next=s;
returntrue;
}
bool singleLink::deleteSingleLinkItem(inti, int *e)
{
LinkNode*p=head,*s;
if(p==NULL)
{
returnfalse;
}
intj=0;
if(i==0)
{
head=head->next;
*e=p->data;
delete(p);
p=NULL;
returntrue;
}
while(p&&j<i-1)
{
j++;
p=p->next;
}
if(p==NULL)
{
returnfalse;
}
s=p->next;
p->next=p->next->next;
*e=s->data;
delete(s);
s=NULL;
returntrue;
}
LinkNode* singleLink::Reverse()
{
if(head==NULL||head->next==NULL)
{
returnhead;
}
LinkNode*p=head,*q=head->next,*r;
head->next=NULL;
while(q)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head=p;
returnhead;
}
题目实现
#include "stdafx.h"
#include "cctype"
#include "iostream"
#include<math.h>
#include <ctime>
#include "afxtempl.h"
#include "singleLink.h"
using namespace std;
#define random(a,b) (rand()%(b-a+1)+a)
#define MAX_INDEX 20 //定义数组个数
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned)time(NULL));
intfirstBit=0; //第一个数的位数
intsecondBit=0; //第二个数的位数
//随机产生两个3-8之间的数作为两个数的位数
firstBit=random(3,8);
secondBit=random(3,8);
cout<<"firstbit "<<firstBit<<endl;
cout<<"secondBit "<<secondBit<<endl;
singleLinkfirst; //第一个数
singleLinksecond; //第二个数
inttmp;
//产生第一个数
for(int i=0;i<firstBit;i++)
{
if(i==firstBit-1)
{
tmp=random(1,9);
first.InsertSingleLinkItem(firstBit-1,tmp);
}
else
{
tmp=random(0,9);
first.InsertSingleLinkItem(i,tmp);
}
}
//产生第二个数
for(int i=0;i<secondBit;i++)
{
if(i==secondBit-1)
{
tmp=random(1,9);
second.InsertSingleLinkItem(secondBit-1,tmp);
}
else
{
tmp=random(0,9);
second.InsertSingleLinkItem(i,tmp);
}
}
inta=0;
int*p=&a;
//逆序输出第一个数
cout<<"第一个数(逆序):";
for(int i=0;i<first.getSingleLinkLength();i++)
{
if(first.getSingleLinkItem(i,p))
{
cout<<*p<<" ";
}
}
cout<<endl<<"第二个数(逆序):";
//逆序输出第二个数
for(int i=0;i<second.getSingleLinkLength();i++)
{
if(second.getSingleLinkItem(i,p))
{
cout<<*p<<" ";
}
}
singleLinkresult;
intcount=0;
//位数多的当做循环计数
if(firstBit>=secondBit)
{
count=firstBit;
}
else
count=secondBit;
intbase=0; //本位
intcarry=0; //进位
intaa=0;
intbb=0;
int*pf=&aa;
int*ps=&bb;
for(int i=0;i<count;i++)
{
if((first.getSingleLinkItem(i,pf))&&(second.getSingleLinkItem(i,ps)))
{
base=(*pf+*ps+carry)%10;
carry=(*pf+*ps+carry)/10;
result.InsertSingleLinkItem(i,base);
if((i==count-1)&&(carry>0))
{
result.InsertSingleLinkItem(i+1,carry);
}
}
elseif ((!first.getSingleLinkItem(i,pf))&&(second.getSingleLinkItem(i,ps)))
{
base=(*ps+carry)%10;
carry=(*ps+carry)/10;
result.InsertSingleLinkItem(i,base);
if((i==count-1)&&(carry>0))
{
result.InsertSingleLinkItem(i+1,carry);
}
}
elseif ((first.getSingleLinkItem(i,pf))&&(!second.getSingleLinkItem(i,ps)))
{
base=(*pf+carry)%10;
carry=(*pf+carry)/10;
result.InsertSingleLinkItem(i,base);
if((i==count-1)&&(carry>0))
{
result.InsertSingleLinkItem(i+1,carry);
}
}
else
{
;
}
}
cout<<endl<<"结果(逆序):";
for(int i=0;i<result.getSingleLinkLength();i++)
{
if(result.getSingleLinkItem(i,p))
{
cout<<*p<<" ";
}
}
LinkNode*oresult=result.Reverse(); //结果换成正常顺序
//打印结果
cout<<endl<<"最后结果:";
while(oresult)
{
cout<<oresult->data<<"";
oresult=oresult->next;
}
system("PAUSE");
return0;
}