单链表应用--一元多项式求和
来源:互联网 发布:sql语句创建的表在哪 编辑:程序博客网 时间:2024/05/29 11:35
用带头结点的单链表 设两个工作指针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分别后移。
template<typename T>void add(linklist<T> &A,linklist<T> B){node<T>*pre=A.first;node<T>*p=pre->next;node<T>*qre=B.first;node<T>*q=qre->next;//qre,pre始终是q,p的前驱节点while(q&&p){if(p->exp<q->exp){pre=p;p=p->next;}//第一种情况else if(p->exp>q->exp){node<T>*t=q->next;pre->next=q;q->next=p;qre->next=t; q=t;}//第二情况,q插入p之前else {p->data=p->data+q->data;if(p->data==0){pre->next=p->next; delete p;p=pre->next;}else {pre=p;p=p->next;}qre->next=q->next;//删除节点q delete q;q=qre->next;}//第三种}if(q)pre->next=q;}例如:x+5x^3+x^4
x^2+6x^3-x^4
其和为x+x^2+11x^3
调用:
#include<iostream>#include<cstdlib>#include<string>using namespace std;//link liststruct ele{int data;int exp;};template<typename T>struct node{ T data; T exp; node<T>*next;}; template<typename T> class linklist{ private:node<T>*first;//单链表的头指针 int linksize; public: linklist(){fisrt=new node<T>; first->next=NULL;//无参构造构造空线性表 linksize=0;} linklist(ele A[],int m){ first=new node<T>; linksize=m; node<T>*p=first; for(int i=0;i<m;i++){ node<T>*s=new node<T>; s->data=A[i].data; s->exp=A[i].exp; p->next=s; p=s;} p->next=NULL;} ~linklist(){ node<T>*p=first; while(p){ node<T>*q=p; p=p->next; delete q;}} int size(); T get(int i); int loc(T x); void insert(int i,T x); T del(int i); void prt(); template<typename T> friend void add(linklist<T> &A,linklist<T> B);};//友元函数,可以直接使用类私有数据first template<typename T> int linklist<T>::size(){ return linksize;} template<typename T> T linklist<T>::get(int i){ node<T>*p=first; int j=0; while(p&&j<i){ p=p->next; j++;} if(!p) throw"i error"; else return p->data;} template<typename T> int linklist<T>::loc(T x){ node<T>*p=first; int j=0; while(p&&x!=p->data){ p=p->next; j++;} if(!p)throw"x no"; else return j;} template<typename T> void linklist<T>::insert(int i,T x){ node<T>*p=first; int j=0; while(p&&j<i-1){ p=p->next; j++;}//找到i-1 if(!p)throw"insert error"; else{ node<T>*s=new node<T>; s->data=x; s->next=p->next; p->next=s;} linksize++;} template<typename T> T linklist<T>::del(int i){ node<T>*p=first; int j=0; while(p&&j<i-1){ p=p->next; j++;} if(!p||!p->next)throw"del error"; else{ T t=p->next->data; p->next=p->next->next; return t;} linksize--;} template<typename T> void linklist<T>::prt(){ node<T>*p=first; if(!p)cout<<"empty"<<endl; p=p->next; while(p){ cout<<p->data<<" and "<<p->exp<<" "; p=p->next;} cout<<endl;} template<typename T>void add(linklist<T> &A,linklist<T> B){node<T>*pre=A.first;node<T>*p=pre->next;node<T>*qre=B.first;node<T>*q=qre->next;//qre,pre始终是q,p的前驱节点while(q&&p){if(p->exp<q->exp){pre=p;p=p->next;}else if(p->exp>q->exp){node<T>*t=q->next;pre->next=q;q->next=p;qre->next=t; q=t;}else {p->data=p->data+q->data;if(p->data==0){pre->next=p->next; delete p;p=pre->next;}else {pre=p;p=p->next;}qre->next=q->next; delete q;q=qre->next;}}if(q)pre->next=q;}
int main(){ele A[]={{1,1},{5,3},{1,4}};ele B[]={{1,2},{6,3},{-1,4}};linklist<int>l1(A,3);linklist<int>l2(B,3);cout<<"the inf l1:"<<endl;l1.prt();cout<<"the inf l2:"<<endl;l2.prt();add(l1,l2);cout<<"the inf l1:"<<endl;l1.prt();system("pause");return 0;}
0 0
- 单链表应用--一元多项式求和
- 一元多项式求和算法(单链表实现)
- 一元多项式求和
- 一元多项式求和
- 一元多项式求和
- 一元多项式求和
- 一元多项式求和
- 数据结构 第二章 单链表应用举例——一元多项式求和(待补充)
- 顺序表应用之两个一元多项式求和
- 一元多项式求和的实现
- 学习笔记------数据结构(C语言版)链表应用~一元多项式求和
- 一元多项式的相加(单链表的应用)
- 一元多项式求和(Java链表实现)
- <PTA>一元多项式的求和和乘积运算解题报告
- java数据结构之单链表应用之一元多项式求和
- 单链表实现一元多项式乘法
- 单链表实现一元多项式相加
- 链表应用-- 一元多项式相加
- java RMI原理详解
- 第11周 自选阅读3
- 测试用例
- 微软近年来很给力啊!
- 抑郁症的表现及危害
- 单链表应用--一元多项式求和
- Android多线程下安全访问数据库
- 中断处理流程分析
- android 三种定时器的写法
- 总体,个体,抽样,样本,样本容量,随机变量,期望,方差,离差,残差
- PHP的自动加载机制
- android中定时定位的实现
- FatFS文件系统详解-附移植建议
- 谈谈RTP传输中的负载类型和时间戳