用带头结点的单链表
设两个工作指针p和q,分别指向两个单链表的开始节点,两个多项式求和的实质上是对结点p的指数域和结点q的指数域进行比较。
(1)若p->exp<q->exp,则结点p应为结果中的一个结点,将指针p后移。
(2)若p->exp>q->exp,则结点q应为结果中的一个结点,将q插入到第一个单链表结点p之前,再将指针q后移。
(3)若p->exp=q->exp,则p与q所指的为同类项,将q的系数加到p的系数上,若相加结果不为0,则将指针p后移,删除结点q,若相加结果为0,则标明结果中无此项,删除结点p和结点q,并将指针p和指针q分别后移。
- #include "stdafx.h"
- #include<iostream>
- using namespace std;
- struct Node
- {
- int coef;
- int exp;
- Node *next;
- };
- void add(Node *firstp,Node *firstq)
- {
- Node *pre=firstp;
- Node *p=pre->next;
- Node * qre=firstq;
- Node *q=qre->next;
- while(p&&q)
- {
- if(p->exp<q->exp)
- {
- pre=p;
- p=p->next;
- }
- else if(p->exp>q->exp)
- {
- Node *qnext=q->next;
- pre->next=q;
- q->next=p;
- qre->next=qnext;
- q=qnext;
- }
- else
- {
- p->coef=p->coef+q->coef;
- if(p->coef==0)
- {
- pre->next=p->next;
- p=pre->next;
- }
- else
- {
- pre=p;
- p=p->next;
- }
- qre->next=q->next;
- q=qre->next;
- }
- }
- if(q)
- pre->next=q;
- }
- void main()
- {
- Node p[5];
- p[0].next=&p[1];
- p[1].coef=7;
- p[1].exp=0;
- p[1].next=&p[2];
- p[2].coef=12;
- p[2].exp=3;
- p[2].next=&p[3];
- p[3].coef=-2;
- p[3].exp=8;
- p[3].next=&p[4];
- p[4].coef=5;
- p[4].exp=12;
- p[4].next=NULL;
- Node q[6];
- q[0].next=&q[1];
- q[1].coef=4;
- q[1].exp=1;
- q[1].next=&q[2];
- q[2].coef=6;
- q[2].exp=3;
- q[2].next=&q[3];
- q[3].coef=2;
- q[3].exp=8;
- q[3].next=&q[4];
- q[4].coef=5;
- q[4].exp=20;
- q[4].next=&q[5];
- q[5].coef=7;
- q[5].exp=28;
- q[5].next=NULL;
- add(&p[0],&q[0]);
- Node *tmp=p[0].next;
- while(tmp!=NULL)
- {
- cout<<tmp->coef<<"x^"<<tmp->exp<<" ";
- tmp=tmp->next;
- }
- }