您的位置:首页 > 其它

链表应用-- 一元多项式相加

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: