正常线性表-链式存储结构及其操作算法的实现-多项式的代数运算
一般线性表-----链式存储结构及其操作算法的实现-----多项式的代数运算
//file :list_link.h #ifndef _LIST_LINK_H_HUMING_INCLUDE_ #define _LIST_LINK_H_HUMING_INCLUDE_ #include<cstdio> template <class T> class node { public: T data; node<T>* next; node():next(NULL) {}; //No-arg constructor node(T p)//Constructor { this->data=p;//"this" means "class node" next=NULL; }; }; //node definatio template <class T> class link { public : link(); void Insert(T x,node<T>* p); void Delete(node<T>* p); node<T>* Locate(T x); node<T>* First(); T Retrieve(node<T>* p); node<T>* Previous(node<T>* p); node<T>* Next(node<T>* p); node<T>* End(); void Swap(node<T>* p,node<T>*q); private : node<T>* L; }; //link defination template <class T> link<T>::link() { L=new node<T>; L->next=NULL; }; template <class T> node<T>* link<T>::First() { return L; } template <class T> void link<T>::Insert(T x,node<T>* p) { node<T>* q=new node<T>; q->data=x; q->next=p->next; p->next=q; } template <class T> void link<T>::Delete(node<T>* p)//delete p next node<T>* data { node<T>* q; if(p->next!=NULL) { q=p->next; p->next=p->next; } delete q; } template <class T> node<T>* link<T>::Locate(T x) { node<T>* p; p=L; while(p->next!=NULL) { if(p->next->data==x) return p; else p=p->next; } return p; } template <class T> T link<T>::Retrieve(node<T>* p) { return (p->next->data);//show p node<T>* next element!,注意啊,不然实现的时候会抽的! } template <class T> node<T>* link<T>::Previous(node<T>* p) { node<T>* q; if(p=L->next) return NULL; else { q=L; while(q->next!=p) q=q->next; return q;//q->next==p } } template <class T> node<T>* link<T>::Next(node<T>* p) { if(p->next==NULL) return NULL; else return p->next; } template <class T> node<T>* link<T>::End() { node<T>* p; p=L; while(p->next!=NULL)p=p->next; return p; } template <class T> void link<T>::Swap(node<T>* p,node<T>*q) { T temp; temp=p->data; p->data=q->data; q->data=temp; } #endif
//多项式加法! #include<iostream> #include "list_link.h" using namespace std; struct polynode { int coef;//系数 int exp;//指数 }; link <polynode> a,b,c; void PolyAdd(link<polynode>a,link<polynode>b,link<polynode>c); void show(link<polynode>x); int main() { freopen("in.txt","r",stdin); int n; node<polynode>* m; polynode x; // printf("请输入第一个多项式\n"); cin >> n >> x.coef >> x.exp; a.Insert(x,a.First()); for(int i=1; i<=n-1; i++) { cin >> x.coef >> x.exp; m=a.First(); while(m!=a.End()) { if(a.Retrieve(m).exp>x.exp) m=a.Next(m); else break; } a.Insert(x,m); } // printf("请输入第二个多项式\n"); cin >> n >> x.coef >> x.exp; b.Insert(x,b.First()); for(int i=1; i<=n-1; i++) { cin >> x.coef >> x.exp; m=b.First(); while(m!=a.End()) { if(b.Retrieve(m).exp>x.exp) m=b.Next(m); else break; } b.Insert(x,m); }//插入的时候就按顺序插入,省的排序! PolyAdd(a,b,c); show(a); printf("+"); show(b); printf("="); show(c); return 0; } void show(link<polynode>x) { node<polynode> *i; i=x.First(); while(i->next!=x.End()) { printf("%d*x^%d+",x.Retrieve(i).coef,x.Retrieve(i).exp); i=x.Next(i); } printf("%d*x^%d",x.Retrieve(i).coef,x.Retrieve(i).exp); } void PolyAdd(link<polynode> a,link<polynode> b,link<polynode> c) { polynode temp; node<polynode>*p1=a.First(),*i,*p2=b.First();//指向节点类型的指针 while(a.Next(p1)!=NULL&&b.Next(p2)!=NULL) { if(a.Retrieve(p1).exp>b.Retrieve(p2).exp) { c.Insert(a.Retrieve(p1),c.End()); p1=a.Next(p1); } else if(a.Retrieve(p1).exp<b.Retrieve(p2).exp) { c.Insert(b.Retrieve(p2),c.End()); p2=b.Next(p2); } else { temp.coef=a.Retrieve(p1).coef; temp.exp=a.Retrieve(p1).exp; temp.coef+=b.Retrieve(p2).coef; c.Insert(temp,c.End()); p1=a.Next(p1); p2=b.Next(p2); } } if(p1!=a.End()) { for(i=p1; i!=a.End(); i=a.Next(i)) c.Insert(a.Retrieve(i),c.End()); } if(p2!=b.End()) { for(i=p2; i!=b.End(); i=b.Next(i)) c.Insert(b.Retrieve(i),c.End()); } }