Typedef struct node {
int data1; //存储系数 0<=data1<=9
unsigned long int data2; // 存储指数0~232-1
struct node *next;
struct node *pre;
}// node, *DuLinkList ;
status CreatList(DuLinkList &L) //长整数的输入与存储
{ char c[];
gets(c);//将长整数以字符串的形式输入
p=L . head; if (a[0]='-' or a[0]='+') { if(a[0]='-') L.head->data1=-1 ;//如果长整数为负,在链表头结点中标记为-1 else L.head->data1=1;//如果长整数为正,在链表头结点中标记为1 for (i=0; a[i]!=''; i++) a[i]= a[i+1]; }
else L.head->data1=1;//如果长整数为正,在链表头结点中标记为1
for(i=0 ; i<strlen(c) ; i++) //从数组转入链表并转化数据类型
{
if(a[i]>' 9 ' or a[i]< ' 0 ') exit ( ERROR INPUT);//出错处理
f(a[i]= ' 0 ') ;//如果当前数位上的数值为0, 则不建立该结点
else
{
r=(node *)malloc(sizeof (node));//分配空间
if(! r) exit (OVERFLOW);//分配失败,则出错
r->data1=a[i]-' 0 '; //数据类型转化 char to int
r->data2= strlen(c)-1-i;
p->next= r; r->pre =p;
p=r;
}
} free(c); //删除数组c return OK;
}// CreatList
void DeletCurElem(*p)//删除当前结点 { h=p->pre; h->next=p->next; p->next->pre=h; free(p); p=h->next; h=NULL; }
void JudgeCurElem(*q) //出理当前数位的进位退位 { h=q->pre; if(q->data1>9) { q->data1-=10; h->data1+=1; JudgeCurElem(h); if(q->data1=0) DeletCurElem(q); q=q->next; } if(0<q->data1<=9) q=q->next; if(q->data1=0) DeletCurElem(q); if(q->data1<0) { q->data1+=10; h->data1-=1; build(h,q);//建立h和p之间的结点 if(h->data1=0) DeletCurElem(h); q=q->next; } h=NULL; }
void build(*p, *q) { t=p; i=p->data2-q->data2-1; for(;i>0;i--)//分配i个空间 { r=(node *)malloc(sizeof (node)); if(! r) exit (OVERFLOW);//分配失败,则出错 r->data1= 9;
r->data2= q->data2+i;
t->next= r; r->pre =t;
t=r;
} t->next=q ; q->pre=t; t=NULL }
void output(DuLinkList &L) //输出函数 { printf("计算结果为:"); p=L.head->next; if(!p) //计算结果为0 printf("0"); else { if L.head->data1=-1 printf("-"); //如果为负数则输出负号 while(p) { printf("%d",p->data1); // 补充为0的数位 if(p->next) { p->data2-- ; while(p->data2!=p->next->data2) { printf("0"); p->data2--; } } if(!p->next&&p->data2!=0) while( p->data2!=0) { printf("0"); p->data2-- ; } p=p->next; } } }
void main() { InitList(La); InitList(Lb); printf(“请输入第一个长整数”); CreatList(La); printf(“请输入第二个长整数”); CreatList(Lb); printf(“请输入运算符”); c=getchar(); if( c= '+ '); if( c= '- ') Lb.head->data1*=-1; else exit(ERROR INPUT); a=La.head->data1; b=Lb.head->data1; qa=La.head->next; qb=Lb.head->next; while(qa and qb) //合并La, Lb { ha=qa->pre; hb=qb->pre; if(qa->data2>qb->data2) qa=qa->next;
if(qa->data2=qb->data2) { qa->data1=(qa->data1*a+qb->data1*b)/a; DeletCurElem(qb); }
if(qa->data2<qb->data2) //将qb插入到qa之前 { qb->data1=qb->data1*b/a; //将qb内数据转换为qa内数据 ha->next=qb; qb->pre=ha; hb->next=qb->next; qb->next=qa; qa->pre=qb; qb=hb->next; } }
if(!ListEmpty(Lb))//Lb 不为空时将其插入到La末尾 { ha->next=qb; qb->pre=ha; qa=ha->next; // qa=qb Lb.head->next=NULL; hb=NULL; while (qa) { qa->data1=qa->data1*b/a; //将qb内数据转换为qa内数据 } qb=NULL; free(Lb.head); } p=La.head->next; if(p->data1<0) { La.head->data1*=-1; while(p) {p->data1*=-1;p=p->next;} } p=La.head->next; while(p) JudgeCurElem(p);//重新遍历La, 进行进位退位处理 output(La); } 上面的算法为长整数的加法和减法运算, 稍微修改一下就可以上机调试.