数据结构的一元多项式相加:
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
功能实现文件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 }
测试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 }