长整数的代数计算 - -数据结构课程设计 下载本文

沈阳航空航天大学课程设计报告

p=p->next; len--; } p->next=oprr; oprr->prior=p; return OK; }

int compare(NodeList opr1,NodeList opr2) //比较opr1、opr2绝对值的大小 { NodeList p1,p2; p1=opr1->next; p2=opr2->next; if(cmplinklen(opr1,opr2)==1)//opr1比较长 return 1; else if(cmplinklen(opr1,opr2)==-1)//opr2比较长 return -1; else//长度相等的情况 { while(p1->data==p2->data && p1->next!=opr1) { p1=p1->next; p2=p2->next; } if(p1->data>p2->data) return 1; else if(p1->datadata) return -1; else return 0; } }

//-----------------------初始化链表函数----------------------- Status init(NodeList &oppr) { oppr=NULL; return OK; }

//===========================加法模块========================== Status jiafa(NodeList opr1,NodeList opr2,NodeList &oprr)//本算法实现A,B相加的操作 { int CF,buffer;

NodeList p1,p2,p3; oprr=(NodeList)malloc(LEN);

19

沈阳航空航天大学课程设计报告

oprr->next=oprr; oprr->prior=oprr; p1=opr1->prior; p2=opr2->prior; CF=buffer=0; while(p1!=opr1 && p2!=opr2) { buffer=p1->data+p2->data+CF; CF=buffer/10000;//若buffer的值大于9999则产生进位,赋给CF //将新建结点插入到头结点之后 p3=(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr; p3->next=oprr->next; oprr->next=p3; p3->data=buffer000;//应该将buffer的第四位赋给p3->data //.......................... p1=p1->prior; p2=p2->prior; } while(p1!=opr1) {//处理opr1链的剩余部分 buffer=p1->data+CF; CF=buffer/10000;//若buffer的值大于9999则产生进位,赋给CF //将新建结点插入到头结点之后 p3=(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr; p3->next=oprr->next; oprr->next=p3; p3->data=buffer000; //.......................... p1=p1->prior; } while(p2!=opr2) {//处理opr2链的剩余部分 buffer=p2->data+CF; CF=buffer/10000;//若buffer的值大于9999则产生进位,赋给CF //将新建结点插入到头结点之后 p3=(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr; p3->next=oprr->next;

20

沈阳航空航天大学课程设计报告

oprr->next=p3; p3->data=buffer000; p2=p2->prior; } if(CF) { p3=(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr; p3->next=oprr->next; oprr->next=p3; p3->data=CF; } return OK; }

//===================减法基本操作==========================

Status jianfa(NodeList opr1,NodeList opr2,NodeList &oprr)//本算法实现A,B相减的操作 {

//将A链分成与B链长相等的底位部分,和剩余的高位部分,并做相应处理。 int CF,buffer,flag; NodeList p1,p2,p3,qh,qt,qq; oprr=(NodeList)malloc(LEN); oprr->next=oprr; oprr->prior=oprr; p1=opr1->prior; p2=opr2->prior; CF=buffer=flag=0; while(p2!=opr2)//opr2链的长度小于等于opr1链的 { if(p1->data<(p2->data+CF)) { buffer=10000+p1->data-(p2->data+CF); CF=1; } else { buffer=p1->data-(p2->data+CF); CF=0; } p3=(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr; p3->next=oprr->next;

21

沈阳航空航天大学课程设计报告

oprr->next=p3; p3->data=buffer; p1=p1->prior; p2=p2->prior; } while(p1!=opr1) {//处理opr1链剩下的部分 if(p1->datadata-CF; CF=1; } else { buffer=p1->data-CF; CF=0; } p3=(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr; p3->next=oprr->next; oprr->next=p3; p3->data=buffer; p1=p1->prior; } //处理链表开头结点值为0的无意义情况,若链表本身表示0,则不做如下处理 p3=oprr->next; while(p3->data==0 && p3->next!=oprr) { p3=p3->next; flag=1; } if(flag) { qh=oprr->next;//保存无用结点的头尾指针 qt=p3->prior;//为释放做准备 oprr->next=p3;//重接next链 p3->prior=oprr;//重接prior链 qt->next=NULL; while(qh!=NULL) {//释放无用结点 qq=qh; qh=qh->next;

22