Polylist AddPolylist() { Polylist A=NULL, B=NULL, C=NULL, p=NULL, q=NULL, r=NULL; A=CreatePolylist(); B=CreatePolylist(); InitPolylist(&C); p=A; q=B; while(p!=NULL && q!=NULL) { if(p->exp<q->exp) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=q->coef; r->exp=q->exp; r->next=C; C=r; q=q->next; } else { if(p->exp==q->exp) { if(fabs(p->coef + q->coef)>1e-6) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=p->coef+q->coef; r->exp=p->exp; r->next=C; C=r; } p=p->next; q=q->next; } else { r=(Polylist)malloc(sizeof(Polynode)); r->coef=p->coef; r->exp=p->exp; r->next=C; C=r; p=p->next; } } } while(p!=NULL) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=p->coef; r->exp=p->exp; r->next=C; C=r; p=p->next; } while(q!=NULL) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=q->coef; r->exp=q->exp; r->next=C; C=r; q=q->next; } return C; }
时间: 2024-02-14 08:21:57 浏览: 67
这段代码实现了两个多项式相加的操作,其中Polylist是一个链表结构,每个节点包含一个系数和指数。代码首先调用CreatePolylist函数分别创建了两个多项式链表A和B,然后初始化结果链表C为空。接下来使用p和q指向A和B的头节点,依次遍历两个链表的每个节点,根据节点的指数大小关系进行不同的操作。
如果A的当前节点的指数小于B的当前节点的指数,则将B的当前节点的系数与指数插入到结果链表C的头部,并将q指向下一个节点。
如果A的当前节点的指数等于B的当前节点的指数,则将A和B的当前节点的系数相加,判断和是否不为0,如果不为0,则将和与指数插入到结果链表C的头部,并将p和q指向下一个节点。
如果A的当前节点的指数大于B的当前节点的指数,则将A的当前节点的系数与指数插入到结果链表C的头部,并将p指向下一个节点。
当其中一个链表遍历完毕后,将另一个链表中剩余的节点插入到结果链表C的头部。
最后返回结果链表C。
相关问题
Polylist AddPolylist()/*创建两个多项式并相加,完成后显示序列*/ { Polylist x,y,a,b,tail,tl,temp; double sum=0; x=CreatePolylist(); y=CreatePolylist(); a=x->next;/*x->next赋给a*/ b=y->next; tail =(Polylist)malloc(sizeof(Polynode)) ; tail->next=NULL; tl=tail; while(a!=NULL&&b!=NULL){ if(a->exp<b->exp){/*a的指数小于b的指数*/ tl->next=a; tl=tl->next; a=a->next; }else if(a->exp=b->exp){/*a的指数等于b的指数*/ sum = a->coef+b->coef; if(sum!=0){ a->coef=sum; tl->next=a; tl=tl->next; a=a->next; b=b->next; }else{ temp =a; a=a->next; free(temp);/*释放temp*/ temp=b; b=b->next; free(temp); } }else{ tl->next=b; tl=tl->next; b=b->next; } } if(a!=NULL){ tl->next=a; }else tl->next=b; return tail; }为什么这样做
这段代码的主要目的是实现两个多项式的相加,并且将结果保存在一个新的多项式链表中。具体实现过程如下:
1. 首先创建两个多项式链表x和y;
2. 然后将x链表的第一个节点赋值给a,y链表的第一个节点赋值给b;
3. 创建一个新的多项式链表tail,并将其头节点的指针指向空;
4. 定义一个指针tl,初始化为tail;
5. 对于每一个a和b,比较它们的指数大小,将指数较小的节点连接到tl后面,并将tl指向该节点;
6. 如果a和b的指数相等,将它们的系数相加,如果和不为0,则将和赋值给a的系数,并将a连接到tl后面,并将tl指向a;如果和为0,则释放a和b节点,并将a和b指向下一个节点;
7. 如果a已经为空,将b连接到tl后面;如果b已经为空,将a连接到tl后面;
8. 返回tail链表。
这样做的目的是为了实现多项式相加的功能,通过比较两个多项式的指数大小,将它们相加,并将结果保存在一个新的多项式链表中。同时,对于系数为0的项,需要删除节点,以节省空间。
while(a!=NULL){ PolyList s;s=(PolyList)malloc(sizeof(Node)); s->coef=a->coef;s->exp=a->exp; c->next=s;s->next=NULL; c=c->next;a=a->next; } while(b!=NULL){ PolyList s;s=(PolyList)malloc(sizeof(Node)); s->coef=(-1)*b->coef;s->exp=b->exp; c->next=s;s->next=NULL; c=c->next;b=b->next; }
这段代码是用来实现多项式的加法运算的。其中a和b分别表示两个多项式的头结点,c表示结果多项式的头结点。代码中使用了while循环来遍历两个多项式,并将它们的系数和指数分别赋值给新的节点s,然后将s插入到结果多项式c的末尾。其中第二个while循环中的系数取相反数是为了实现减法运算。
阅读全文