一元多项式相加

数据结构的一元多项式相加:

 1 LinkAdd.h
 2 #ifndef LINKADD_H
 3 #define LINKADD_H
 4 const int MaxSize=100;
 5 struct elem
 6 {
 7  int coef;
 8  int exp;
 9  elem * next;
10 };
11 struct Node
12 {
13  int coef;
14  int exp;
15 };
16 
17 class LinkList
18 {
19  friend void Add(LinkList &, LinkList);
20  public:
21   LinkList(Node a[]);
22  ~LinkList();
23   void Insert(int i, Node x);
24   elem Delete(int i);
25   int Locate(elem x);
26   void PrintList();
27   private:
28   elem* first;
29   
30 };
31 #endif
View Code

 

功能实现文件LinkAdd.cpp

  1 LinkAdd.cpp
  2 #include<iostream>
  3 using namespace std;
  4 #include "LinkAdd.h"
  5 LinkList::LinkList(Node a[])
  6 {
  7  
  8  int coef, exp;
  9  int n=0;
 10  cout<<"请输入(coef,exp)的值,以(0,0)结束"<<endl;
 11  cin>>coef>>exp;
 12   
 13  while(coef||exp)
 14  {
 15   
 16   a[n].coef=coef;
 17   a[n].exp=exp;
 18   n++;
 19   cin>>coef>>exp;
 20  }
 21  
 22 
 23  first=new elem;
 24  first->next=NULL;
 25  elem *rear=new elem;
 26  rear=first;
 27  int i;
 28  for(i=0; i<n; i++)
 29  {
 30   elem *s=new elem;
 31   s->coef=a[i].coef;
 32   s->exp=a[i].exp;
 33   rear->next=s;
 34   rear=s;
 35  }
 36  rear->next=NULL;
 37 }
 38 //
 39 析构函数如果照函数中的注释写,会出现异常,
 40 下面有一句 delete B.first, B对象的结点都
 41 被释放了,它没有了头结点,找不到整个链表
 42  但是还要按照下面的代码析构就会
 43 引起异常
 44 //
 45 
 46 LinkList::~LinkList()
 47 {
 48 // elem *p=first;
 49 //elem *pre=p;
 50 //while(p)
 51 //{
 52  //pre=p;
 53   //p=p->next;
 54 //  delete pre;
 55 // }
 56  
 57 }
 58 void Add(LinkList &A, LinkList B)      //此处链表相加后的值存放到A中,故A传的是引用,而B是按值传递
 59 {
 60  elem *pre=A.first; elem *p=pre->next;
 61  elem *qre=B.first; elem *q=qre->next;
 62  while(p&&q)
 63  {
 64   if(p->exp<q->exp)
 65   {
 66      pre=p;            //pre向后移
 67      p=p->next;       //p向后移
 68   }
 69   else if(p->exp>q->exp)
 70   {
 71    elem *v=new elem;
 72    v=q->next;
 73    pre->next=q;
 74    q->next=p;
 75     q=v;
 76    qre->next=q; 
 77 //B中的一个结点被插入到A中后,B的qre->next要改变,因为这个结点在B中已经不存在,所以qre->next=q
 78    pre=pre->next;
 79 //在A中插入一个结点后,这个结点在A的pre和p之间,故pre要向后移动一个位置
 80   }
 81   else
 82   {
 83    p->coef=p->coef+q->coef;
 84    if(p->coef==0)
 85    {
 86     pre->next=p->next;
 87     delete p;
 88     p=pre->next;
 89    }
 90    else
 91    {
 92     pre=p;
 93     p=p->next;
 94    }
 95    qre->next=q->next;
 96    delete q;
 97    q=qre->next;
 98   }
 99  }
100  if(q) pre->next=q;
101     delete B.first;
102 
103 }
104 void LinkList::PrintList()
105 {
106  elem *p=first->next;
107  while(p)
108  {
109     cout<<"("<<p->coef<<","<<p->exp<<")"<<" ";
110     p=p->next;
111  }
112  cout<<endl;
113 }
View Code

 

测试main函数

 1 #include<iostream>
 2 using namespace std;
 3 #include "LinkAdd.h"
 4  
 5 int main()
 6 {
 7    Node a[MaxSize]={0};
 8    Node b[MaxSize]={0};
 9    LinkList A(a);
10    cout<<"LinkList A is:"<<endl;
11    A.PrintList();
12    LinkList B(b);
13    cout<<"LinkList B is:"<<endl;
14    B.PrintList();
15    Add(A,B);
16    cout<<"The added LinkList is:"<<endl;
17    A.PrintList();
18    return 0;
19 }
View Code

 

posted @ 2013-11-05 17:51  关雎天下  阅读(259)  评论(0编辑  收藏  举报