长整数四则运算源代码数据结构Word文档下载推荐.docx
《长整数四则运算源代码数据结构Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《长整数四则运算源代码数据结构Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
for(;
k&
0;
k--)
r=r*a;
returnr;
}
//输入转换函数
Statusconversion(charstr[],NodeList&
amp;
oprh)
{//将字符串形式的操作数转换成所需的类型
NodeListp;
inti,k,buffer;
k=buffer=0;
oprh=(NodeList)malloc(LEN);
oprh-&
next=oprh;
prior=oprh;
for(i=strlen(str)-1;
i&
=0;
i--)
//若输入的数不合法就返回重新输入
if((i!
=0||(str[0]!
=&
#39;
-&
&
&
str[0]!
+&
))&
(str[i]&
9&
||str[i]&
0&
))
returnERROR;
if(str[0]==&
str[1]!
\0&
)
if((str[0]==&
||str[0]==&
)&
str[1]==&
if(str[i]!
str[i]!
buffer=buffer+(str[i]-&
)*axp(10,k);
k++;
if(k==4||str[i-1]==&
||str[i-1]==&
||i==0)
{//将新建结点插入到头结点之后
p=(NodeList)malloc(LEN);
next-&
prior=p;
p-&
next=oprh-&
next;
next=p;
data=buffer;
buffer=k=0;
data=&
;
else
returnOK;
//输入函数
Statusinput(NodeList&
opr1,NodeList&
opr2,charstr[])
intflag=OK;
printf(&
quot;
\n请输入第一个操作数:
\n&
);
scanf(&
%s&
str);
getchar();
flag=conversion(str,opr1);
while(!
flag)
ERROR!
Inputagain:
\n请输入第二个操作数:
flag=conversion(str,opr2);
//========================================================================================
//=======================================输出模块=========================================
//输出函数
Statusoutput(NodeListoprr,charstr[])
Statusinitbuf(charstr[]);
inti,j,num[4];
if(!
oprr)
p=oprr;
i=j=0;
initbuf(str);
if(oprr-&
data==&
str[i++]=&
p=p-&
if(p-&
next==oprr&
p-&
data==0)//若要输出的数为0则执行
while(p!
=oprr)
num[0]=p-&
data/1000;
num[1]=(p-&
data-num[0]*1000)/100;
num[2]=(p-&
data-num[0]*1000-num[1]*100)/10;
num[3]=
data-num[0]*1000-num[1]*100-num[2]*10;
while(j&
4)
if(num[j]!
=0||(str[0]==&
)||(str[0]!
//此判断语句是为了避免输出诸如:
00123…的情况
str[i++]=num[j]+&
j++;
}
j=0;
str[i]=&
//==================================预处理及杂项操作模块==================================
//缓冲区部分初始化函数
Statusinitbuf(charstr[])
inti;
for(i=0;
=10;
i++)
//比较链表长度函数
intcmplinklen(NodeListopr1,NodeListopr2)
{//opr1链比opr2链长则返回1,短则返回-1,否则返回0
NodeListp1,p2;
p1=opr1-&
prior;
p2=opr2-&
while(p1-&
prior!
=opr1&
p2-&
=opr2)
p1=p1-&
p2=p2-&
if(p1-&
=opr1)
if(p2-&
return-1;
return0;
//求链表长度
intlength(NodeListoprr)
intcount=0;
NodeListp=oprr-&
count++;
returncount;
//生成指定长度链表
StatusCreat(NodeList&
oprr,intlen)
oprr=(NodeList)malloc(LEN);
while(len&
0)
next=(NodeList)malloc(LEN);
?
len--;
next=oprr;
oprr-&
//比较opr1、opr2绝对值的大小
intcompare(NodeListopr1,NodeListopr2)
if(cmplinklen(opr1,opr2)==1)//opr1比较长
elseif(cmplinklen(opr1,opr2)==-1)//opr2比较长
else//长度相等的情况
data==p2-&
data&
p1-&
next!
=opr1)//注意不要少了p1-&
=opr1这个条件
data&
p2-&
data)
elseif(p1-&
//-----------------------初始化链表函数-----------------------
Statusinit(NodeList&
oppr)
oppr=NULL;
}//init
//销毁链表函数
Statusdistroy(NodeList&
NodeListq;
if(oprr)
q=oprr-&
while(q!
free(q-&
prior);
q=q-&
oprr=NULL;
}//distroy
//链表短赋值函数
Statusevaluate(NodeList&
opri,inti)
{//将i的值转换成万进制类型,i为整形变量
opri=(NodeList)malloc(LEN);
opri-&
data=i;
next=opri;
prior=opri-&
prior=opri;
}//evaluate
//=======================================加减法模
块=======================================
//加法基本操作
Statusadd_bas(NodeListopr1,NodeListopr2,NodeList&
{//本算法实现A,B相加的操作。
intCF,buffer;
NodeListp1,p2,p3;
prior=oprr;
CF=buffer=0;
while(p1!
p2!
buffer=p1-&
data+p2-&
data+CF;
CF=buffer/10000;
//若buffer的值大于9999则产生进位,赋给CF
//将新建结点插入到头结点之后
p3=(NodeList)malloc(LEN);
prior=p3;
p3-&
next=oprr-&
next=p3;
data=buffer%10000;
//应该将buffer的第四位赋给p3-&
data
//..........................
{//处理opr1链的剩余部分
while(p2!
{//处理opr2链的剩余部分
buffer=p2-&
if(CF)
data=CF;
//减法基本操作
Statussub_bas(NodeListopr1,NodeListopr2,NodeList&
{//本算法实现A,B相减的操作。
//将A链分成与B链长相等的底位部分,和剩余的高位部分,并做相应处理。
intCF,buffer,flag;
NodeListp1,p2,p3,qh,qt,qq;
CF=buffer=flag=0;
{//opr2链的长度小于等于opr1链的
(p2-&
data+CF))
buffer=10000+p1-&
data-(p2-&
data+CF);
CF=1;
CF=0;
{//处理opr1链剩下的部分
CF)
data-CF;
//处理链表开头结点值为0的无意义情况,若链表本身表示0,则不做如下处理
p3=oprr-&
while(p3-&
data==0&
p3-&
p3=p3-&
flag=1;
if(flag)
qh=oprr-&
//保存无用结点的头尾指针
qt=p3-&
//为释放做准备
//重接next链
//重接prior链
qt-&
next=NULL;
while(qh!
=NULL)
{//释放无用结点
qq=qh;
qh=qh-&
free(qq);
//--------------------------------------------------------
//---------------------带符号加法函数---------------------
Statusadd(NodeListopr1,NodeListopr2,NodeList&
if(opr1==NULL||opr2==NULL)
if(opr1-&
data==opr2-&
{//opr1,opr2符号相同
add_bas(opr1,opr2,oprr);
)//opr1与opr2均为正数,即A+B的形式(A,B均是正数,下同)
else//opr1与opr2均为负数,即(-A)+(-B)的形式
}//if(opr1-&
{//符号不相同
{//A+(-B)的情况
if(compare(opr1,opr2)==-1)
{//A&
B的情况
sub_bas(opr2,opr1,oprr);
}//if(compare(opr1,opr2)==-1)
=B的情况
sub_bas(opr1,opr2,oprr);
}//else
opr2-&
{//(-A)+B的情况
if(compare(opr1,opr2)==1)
}//if(compare(opr1,opr2)==1)
}//add
//---------------------带符号减法函数----------------------
Statussub(NodeListopr1,NodeListopr2,NodeList&
{//A-B的情况
e