链表应用-- 一元多项式相加
2014-05-20 15:29
281 查看
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; typedef struct ret { int coef; //系数 int expn; //指数 }ElemType; typedef struct LNode { ElemType data; struct LNode *next; }*LinkList; void init(LinkList &L) //初始化 { L=(LinkList)malloc(sizeof(LNode)); L->data.coef=0; L->data.expn=0; L->next=NULL; } void MakeNode(LinkList &s,ElemType e) //申请空间 { s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=NULL; } int compare(ElemType e1,ElemType e2) //比较大小 { if(e1.expn > e2.expn) { return 1; } else if(e1.expn < e2.expn) { return -1; } else return 0; } void creat(LinkList &L,ElemType e)//有序创建链表,方便后面计算 { LinkList p0,p,p1; p=L->next; if(!p) { MakeNode(p0,e); L->next=p0; } else { while(p->next != NULL && p->data.expn < e.expn)//通过循环查找合适插入的地方 { p1=p; p=p->next; } if(p->data.expn > e.expn) { if(p==L->next)//注意处理头结点的情况 { MakeNode(p0,e); p0->next=p; L->next=p0; } else { MakeNode(p0,e); p1->next=p0; p0->next=p; } } else { MakeNode(p0,e); p->next=p0; } } } void show(LinkList L) { LinkList p=L->next; if(p) { printf("%dX^%d",p->data.coef,p->data.expn); p=p->next; } while(p) { if(p->data.coef>0)//判断符号正负 { printf(" + "); } else { printf(" - "); } printf(" %dX^%d ",p->data.coef,p->data.expn); p=p->next; } printf("\n"); } void ListDestory(LinkList &L) { LinkList p=L->next,q; while(p) { q=p; p=p->next; free(q); } free(L); } void Add(LinkList &L1,LinkList &L2,LinkList &L3) { LinkList q,p1,p2,p0; q=L3; p1=L1->next; p2=L2->next; while(p1 && p2) { int n=compare(p1->data,p2->data); switch(n)//相加情况判断 { case -1: //p1->data小 MakeNode(p0,p1->data); q->next=p0; q=p0; p1=p1->next; break; case 1: MakeNode(p0,p2->data); q->next=p0; q=p0; p2=p2->next; break; case 0: float sum=p1->data.coef+p2->data.coef; if(sum==0) { p1=p1->next; p2=p2->next; } else { MakeNode(p0,p2->data); p0->data.coef=sum; q->next=p0; q=p0; p1=p1->next; p2=p2->next; } break; } } if(p1)//链表1多余的数据因为有序,所以直接放到链表3后面 { while(p1) { creat(L3,p1->data); p1=p1->next; } } if(p2)//同上 { while(p2) { creat(L3,p2->data); p2=p2->next; } } } int main() { LinkList L1,L2,L3,p0; init(p0); init(L1); init(L2); init(L3); int i; for(i=0; i<2; i++) { cout<<"请输入L1数据:(系数,指数)"; cin>>p0->data.coef>>p0->data.expn; creat(L1,p0->data); } for(i=0; i<4; i++) { cout<<"请输入L2数据:(系数,指数)"; cin>>p0->data.coef>>p0->data.expn; creat(L2,p0->data); } free(p0); cout<<"L1:"<<endl; show(L1); cout<<"L2:"<<endl; show(L2); Add(L1,L2,L3); cout<<"L3:"<<endl; show(L3); ListDestory(L1); ListDestory(L2); ListDestory(L3); return 0; }
相关文章推荐
- 一元多项式相加-链表应用
- 一元多项式的表示及相加 【链表的应用】
- 【数据结构 链表的应用】一元多项式相加及相乘 和对问题的分析
- 用链表实现一元稀疏多项式的相加
- C++链表应用:多项式相加
- 链表形式 写出两个一元多项式相加的算法
- 一元多项式的相加 数据结构链表实现
- 线性表应用举例——一元多项式相加问题
- 重学数据结构001――链表基本操作与一元多项式相加
- 链表应用——多项式相加
- (链表实现)写出两个一元多项式相加的算法
- 一元多项式相加,链表存储实现 ,不使用头结点
- 重温数据结构:链表的应用之多项式的表示及相加和相乘
- 一元多项式的相加(单链表的应用)
- 线性表的应用——求解两个多项式相加问题描述(链表求解)
- (链表实现)写出两个一元多项式相加的算法
- 数据结构 第二章 单链表应用举例——一元多项式求和(待补充)
- c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加
- 单链表应用--一元多项式求和
- 两个一元多项式相加(链表 || 顺序表实现)