数据结构第二次上机实验【链表实现多项式的加法和乘法】

利用链表实现一元多项式的加法和乘法

#define null 0
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
int op;
typedef struct
{ 
     float coef;//系数 
     int expn;//指数 
}term;

typedef struct Lnode
{
	term data;
	Lnode *next;
}*Link,*Linklist;

int cmp(term a,term b)//将指数从小到大排序 
{
	if (a.expn==b.expn) 
	    return 0;
	else 
	    return (a.expn-b.expn)/abs(a.expn-b.expn);
}
void Orderinsert(Linklist &L,term e,int (*comp)(term,term))//直接将输入的项数和指数放入链表(没有可以合并的项) 
{
	Link o,p,q;
	q=L;
	p=q->next;
	while (p&&comp(p->data,e)<0)
	{
	    q=p;
		p=p->next;
	}
	o=(Link)malloc(sizeof(Lnode));
	o->data=e;
	q->next=o;
	o->next=p;
}
void chengfa(Linklist &L1,Linklist &L2,Linklist &L3)
{
	L3 = (Link)malloc(sizeof(Lnode));
    L3->next = null;
    Link S = L1->next;
    term s, e;
	while(S)
	{
		s.coef=S->data.coef;
		s.expn=S->data.expn;
		Link Q=L2->next;
		while(Q)
		{
			e.coef = s.coef * Q->data.coef;
            e.expn = s.expn + Q->data.expn;
            Orderinsert(L3,e,cmp);
            Q=Q->next;
		}
		S=S->next;
	}
}
int LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term))//判断是否有可以合并的项 
{
	Link p;
	s=L;
	p=s->next;
	while (p&&comp(p->data,e)!=0)
	{
		s=p;
		p=p->next;
	}
	if(!p) 
	{
		s=q=null;
		return 0;
	}
	else 
	{
		q=p;
		return 1;
	}
}
void Delnext(Linklist &L,Link s)
{
	Link q=s->next;
	 s->next=q->next;
	 free(q);
}

void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term))//将同一个多项式里相同的项合并 
{
	Link q,s;
	if (LocateElem(L,e,s,q,compara))
	{
		q->data.coef+=e.coef;
		if (!q->data.coef)
		{
		  Delnext(L,s);
	    }
	}
	else	
	    Orderinsert(L,e,compara);
}

void Creatpolyn (Linklist &p,int m)//输入多项式的系数和指数 
{
	 term e;
	 int i;
	 p=(Link)malloc(sizeof(Lnode));//给链表开拓空间 
	 p->next=null;
	 printf("
请输入%d个系数和指数用空格符间隔:
",m);
	 for(i=1;i<=m;i++)
 	{
	 	scanf("%f%d",&e.coef,&e.expn);
  		Orderinsertmerge(p,e,cmp);//将输入的多项式中可以合并的项合并 
  	}
}
void add(Linklist &La,Linklist Lb)//合并两个多项式 
{
	Link qb;term b;
	 qb=Lb->next;
	 while(qb)
	 {
		 b=qb->data;
		 Orderinsertmerge(La,b,cmp);
		 qb=qb->next;
	 }
	 //销毁链表Lb
}
void fuzhi(Linklist &Lc,Linklist La)
{
	Lc=(Link)malloc(sizeof(Lnode));
	Lc->next=null;
	Link S=La->next;
	term e;
	while(S)
	{
		e.coef=S->data.coef;
		e.expn=S->data.expn;
		Orderinsertmerge(Lc,e,cmp);
		S=S->next;
	}
}
void printpolyn(Linklist p)//打印出相加后的多项式 
{	
	Link q;
	q=p->next;
	int t=0;
	while(q)
	{
		if(t==0)
		{
			if(q->data.coef==1)
			    printf("x^%d",q->data.expn);
		    else if(q->data.coef==-1)
		        printf("-x^%d",q->data.expn);
			else if(q->data.coef>0)
			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
			else if(q->data.coef<0)
			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
		}
		else
		{
			if(q->data.coef==1)
			    printf("+x^%d",q->data.expn);
		    else if(q->data.coef==-1)
		        printf("-x^%d",q->data.expn);
			else if(q->data.coef>0)
			    printf("+%.2f*x^%d",q->data.coef,q->data.expn);
			else if(q->data.coef<0)
			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
		}
	 	q=q->next;
	 	t++;
	}
}
int main()
{
	int x;
	Linklist L1,L2,L3;
	printf("
请输入第一个一元多项式的项数:");
	scanf("%d",&x);
	Creatpolyn(L1,x);
	printf("
请输入第二个一元多项式的项数:");
	scanf("%d",&x);
	Creatpolyn(L2,x);
	fuzhi(L3,L1);
	add(L3,L2);
	printf("
相加以后的一元多项式为:
");
	printpolyn(L3);
	printf("
相乘以后的一元多项式为:
");
	chengfa(L1,L2,L3);
	printpolyn(L3);
    return 0;
}

  

原文地址:https://www.cnblogs.com/tonghao/p/4875975.html