📄 kk.txt
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#include <conio.h>
struct DuLNode{
struct DuLNode *prior;
int data;
struct DuLNode *next;
}*DuLink[2]; //双向循环链表结点结构定义体
int NodeNum[2]={0,0}; //长整数的节数,循环链表的结点计数器
struct DuLNode *Build_BDCL(int k);
//该函数体用来形成双向循环链表,用以存放万进制格式的长整数
void main()
{
struct DuLNode *temp,*result,*temp0,*temp1;
int i,j; //j为存放长整数的双向循环链表的元素结点计数器
int off; //off记录同号长整数加法溢出进位值
char ch;
do
{
off=0; //溢出进位值清0
printf("请您按万进制格式输入两个任意长整数:");
for (i=0;i<2;i++)
{
printf("\n请输入第%d个长整数:",i+1);
DuLink[i]=Build_BDCL(i); //调用Build_BDCL(i)函数
}
//结点计数器j大于长整数的结点总数时,循环结束
for (i=0;i<2;i++)
{
printf("\n你输入的第%d个长整数是:",i+1);
temp=DuLink[i]; //temp初始存放长整数的双向循环链表的首元素结点
j=1; //存放长整数的双向循环链表的元素结点计数器初始值为1
do
{
//首元素结点不必对前导'0'进行处理,其它结点需要打印出不同位数的前导'0'
if (j>1)
{
//当temp->data的绝对值<=999,<=99,<=9时,加入前导0
if (abs(temp->data)<=9)
printf("000");
else if (abs(temp->data)<=99)
printf("00");
else if (abs(temp->data)<=999)
printf("0");
}
//当j<长整数的结点总数时,打印当前结点后加','
if (j<NodeNum[i])
printf("%d,",temp->data);
//当j==长整数的结点总数时,即打印最后一个结点时,其后不加','
else
printf("%d",temp->data);
temp=temp->next; //结点指针后移
j++; //结点计数器加1
}while (j<=NodeNum[i]);
}
printf("\n加法运算的结果是:");
//如果两个长整数同号相加
if (DuLink[0]->data*DuLink[1]->data>=0)
{
//同号相加,如果长整数的首元素均为负,打印负号'-'
if (DuLink[0]->data<0)
printf("-");
//双向循环链表的首元素结点前驱即为末元素结点,从长整数的最低四位数计算
temp0=DuLink[0]->prior;
temp1=DuLink[1]->prior;
//同号相加,如果第一个长整数的结点总数较大或两个长整数的结点总数相等
if (NodeNum[0]>=NodeNum[1])
{
for (i=0;i<NodeNum[1];i++)
{
temp0->data=abs(temp0->data)+abs(temp1->data)+off;
off=0;
if (temp0->data>9999) //溢出,进位
{
off=1;
temp0->data=temp0->data-10000;
}
//指针回溯,继续高一位结点的加法运算
temp0=temp0->prior;
temp1=temp1->prior;
}
for (i=NodeNum[1];i<NodeNum[0];i++)
{
temp0->data=abs(temp0->data)+off;
off=0;
if (temp0->data>9999)
{
off=1;
temp0->data=temp0->data-10000;
}
temp0=temp0->prior;
}
if (off)
printf("1,");
result=DuLink[0];//;temp0->next
}
//同号相加,如果第二个长整数的结点总数较大
else
{
for (i=0;i<NodeNum[0];i++)
{
temp1->data=abs(temp0->data)+abs(temp1->data)+off;
off=0;
if (temp1->data>9999)
{
off=1;
temp1->data=temp1->data-10000;
}
//指针回溯到高一位结点,继续高一位结点的加法运算
temp0=temp0->prior;
temp1=temp1->prior;
}
for (i=NodeNum[0];i<NodeNum[1];i++)
{
temp1->data=abs(temp1->data)+off;
off=0;
if (temp1->data>9999)
{
off=1;
temp1->data=temp1->data-10000;
}
temp1=temp1->prior;
}
if (off)
printf("1,");
result=DuLink[1];//temp1->next;
}
}
//如果两个长整数异号相加
else
{
//异号相加,如果两个长整数的结点总数相等
if (NodeNum[0]==NodeNum[1])
{
//先判断两个长整数异号相加后的正负符号,并将其打印出来
temp0=DuLink[0]; //temp0指向存放第一个长整数的双向循环链表的首元素结点
temp1=DuLink[1]; //temp1指向存放第二个长整数的双向循环链表的首元素结点
for (i=0;i<NodeNum[0];i++)
{
//异号相加,两个长整数的结点总数相等,从最高4位起检查,如果存在某个结点数据的绝对值不相等
if (abs(temp0->data)!=abs(temp1->data))
{
//如果第一个长整数的当前结点数据的绝对值大
if (abs(temp0->data)>abs(temp1->data))
{
if (DuLink[0]->data<0)
printf("-");
}
//如果第二个长整数当前结点数据的绝对值大,互换两个长整数
else
{
if (DuLink[1]->data<0)
printf("-");
temp=DuLink[0];
DuLink[0]=DuLink[1];
DuLink[1]=temp;
}
//i=NodeNum[0]+10;
//第一个长整数的结点总数+10?不明白?奇怪注释掉或保留都不影响正确运行???
}
//异号相加,两长整数结点总数相等,如当前结点数据绝对值相等,指针后移,比较下一个结点
else
{
temp0=temp0->next;
temp1=temp1->next;
}
}
//双向循环链表的首元素结点前驱即为末元素结点,从长整数的最低四位数计算
temp0=DuLink[0]->prior;
temp1=DuLink[1]->prior;
//两个长整数异号相加后的正负符号问题已解决,首元素结点数据取绝对值
DuLink[0]->data=abs(DuLink[0]->data);
DuLink[1]->data=abs(DuLink[1]->data);
for (i=0;i<NodeNum[0];i++)
{
//借位处理,如当前结点数据原为0000,被低一位借位后为-1,需继续向高一位结点借位
if (temp0->data==-1)
{
temp0->data=9999-temp1->data;
temp0->prior->data=temp0->prior->data-1; //高一位结点数据减1
}
//借位处理
else if (temp0->data-temp1->data<0)
{
temp0->data=10000+temp0->data-temp1->data;
temp0->prior->data=temp0->prior->data-1; //高一位结点数据减1
}
else
temp0->data=temp0->data-temp1->data;
//指针回溯,继续高一位结点的加法运算
temp0=temp0->prior;
temp1=temp1->prior;
}
result=DuLink[0];//temp0->next;
}
//异号相加,如果第一个长整数的结点总数较大
else if (NodeNum[0]>NodeNum[1])
{
temp0=DuLink[0]->prior;
temp1=DuLink[1]->prior;
if (DuLink[0]->data<0)
{
printf("-");
DuLink[0]->data=abs(DuLink[0]->data);
}
else
DuLink[1]->data=abs(DuLink[1]->data);
for (i=0;i<NodeNum[1];i++)
{
if (temp0->data==-1)
{
temp0->data=9999-temp1->data;
temp0->prior->data=temp0->prior->data-1;
}
else if (temp0->data-temp1->data<0)
{
temp0->data=10000+temp0->data-temp1->data;
temp0->prior->data=temp0->prior->data-1;
}
else
temp0->data=temp0->data-temp1->data;
temp0=temp0->prior;
temp1=temp1->prior;
}
for (i=NodeNum[1];i<NodeNum[0];i++)
{
if (temp0->data==-1)
{
temp0->data=9999;
temp0->prior->data=temp0->prior->data-1;
}
temp0=temp0->prior;
}
result=DuLink[0]; //temp0->next;
}
//异号相加,如果第二个长整数的结点总数较大
else
{
temp0=DuLink[0]->prior;
temp1=DuLink[1]->prior;
if (DuLink[1]->data<0)
{
printf("-");
DuLink[1]->data=abs(DuLink[1]->data);
}
else
DuLink[0]->data=abs(DuLink[0]->data);
for (i=0;i<NodeNum[0];i++)
{
if (temp1->data==-1)
{
temp1->data=9999-temp0->data;
temp1->prior->data=temp1->prior->data-1;
}
else if (temp1->data-temp0->data<0)
{
temp1->data=10000+temp1->data-temp0->data;
temp1->prior->data=temp1->prior->data-1;
}
else
temp1->data=temp1->data-temp0->data;
temp0=temp0->prior;
temp1=temp1->prior;
}
for (i=NodeNum[0];i<NodeNum[1];i++)
{
if (temp1->data==-1)
{
temp1->data=9999;
temp1->prior->data=temp1->prior->data-1;
}
temp1=temp1->prior;
}
result=DuLink[1]; //temp0->next;
}
}
//继续输出结果
//(运算结果的正负符号以及同号加运算的最高位溢出进位得到的'1'已经打印)
temp=result;
j=0; //双向循环链表的结点计数器j初值清0
do
{
//temp后移到再次等于result,即回到第一个结点的位置时,do循环结束
if (off) //如果加法运算中进行过最高位结点溢出处理
j=1;
if (j)
{
if (abs(temp->data)<0)
printf("0000");
else if (abs(temp->data)<=9)
printf("000");
else if (abs(temp->data)<=99)
printf("00");
else if (abs(temp->data)<=999)
printf("0");
}
if (temp->data>0)
j=1;
if (temp->next==result) //输入到最后一个结点
printf("%d",temp->data);
else
{
if (j)
printf("%d,",temp->data);
}
temp=temp->next;
}while (temp!=result);
free(DuLink[0]);
NodeNum[0]=0;
free(DuLink[1]);
NodeNum[1]=0;
printf("\n\n还要进行长整数加法计算吗?(Y or y):");
ch=getche();
printf("\n");
}while ((ch=='Y')||(ch=='y'));
}
//该函数用来形成双向循环链表,用以存放万进制格式的长整数
struct DuLNode *Build_BDCL(int k)
{
struct DuLNode *p=NULL,*q,*head;
int i=0;
char str[6]="",ch;
do
{
ch=getche();
if ((ch==',') || (ch=='\r')) //如果输入的是","或"回车"
{
NodeNum[k]++; //结点计数器加1
*(str+i)=NULL; //赋空值
q=(struct DuLNode*) malloc(sizeof(struct DuLNode));
q->data=atoi(str); //给结点赋值
if (p==NULL)
{
p=q->prior=q->next=q;
head=p;
}
else
{ //后向插入新结点
p->next->prior=q;
q->prior=p ;
q->next=p->next;
p->next=q;
p=q;
}
i=0;
*str='\0';
}
else
{
*(str+i)=ch;
i++;
}
} while (ch!='\r'); //以输入回车符结束一个长整数的输入
head->prior=q;
q->next=head;
return head;
}//Build_BDCL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -