用链表实现多项式相乘

原创 2004年09月10日 11:01:00

/******************************************************
  多项式相乘
*******************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

//多项式中的一项的结构

typedef  struct term{
 double coef;
 int expn;
        struct term* next;
}PolyNode ,*pPolyNode;

//创建一个保存多项式的链表,返回指向头结点的指针。多项式按指数降序排列
pPolyNode CreatePoly()
{
 PolyNode *p,*q,*s,*head=NULL;
 double coef;
 int expn;

 head=(pPolyNode)malloc( sizeof(PolyNode) );
 if(head==NULL)
 {
  printf("Allocable memory fail!/n");
  return NULL;
 }
 head->coef =0.0;
 head->expn =0;
 head->next =NULL;

 printf("Please input Coefficient and  exponent (intput 0 0 end):/n");
 //scanf("%lf%d",&coef,&expn);
 printf("Please input Coefficient:");
 scanf("%lf",&coef);
 printf("please input exponent:");
 scanf("%d",&expn);


 while( (long)coef !=0 && expn !=0 )
 {
  s = (pPolyNode)malloc(sizeof(PolyNode));
  s->coef = coef;
  s->expn = expn;
  
  q=head->next ;
  p=head;
  while(q && expn <q->expn  )
  {
   p=q;
   q=q->next;
  }

  if(q== NULL || expn > q->expn )
  {
   p->next =s;
   s->next =q;
  }
  else
  {
   q->coef+=coef;
  }
  //read next number
  printf("Please input Coefficient:");
  scanf("%lf",&coef);
  printf("please input exponent:");
  scanf("%d",&expn);
 }
 return head;

}

//将多项式逆置,按升幂排列

pPolyNode  Reverse(pPolyNode head)
{
 PolyNode *p,*q,*t;
 p=NULL;
 q=head->next;
 while( q!=NULL )
 {
  t=q->next;
  q->next =p;
  p=q;
  q=t;
 }
 head->next =p;
 return head;
}
//两个多项式相乘
pPolyNode multiply(pPolyNode A,pPolyNode B)
{
 PolyNode *pa,*pb,*pc,*u,*head;
 int k ,maxExp;
 double coef;

 //The head node of the multiply
 head=(pPolyNode)malloc( sizeof (PolyNode) );
 if(head==NULL)
 {
  printf("Allocable memory fail!/n");
  return NULL;
 }

 head->coef=0.0;
 head->expn =0;
 head->next =NULL;
 
 if(A->next !=NULL && B->next != NULL)
 {
  maxExp=(A->next) ->expn +(B->next )->expn ;
 }
 else
 {
  return head;
 }
 pc=head;
 B=Reverse (B);

 for(k=maxExp; k>=0; k--)
 {
  pa = A->next ;
  while(pa != NULL && pa->expn >k)
   pa=pa->next ;
  
  pb = B->next ;
  while( pb != NULL && pa != NULL && (pa->expn + pb->expn) < k )
   pb=pb->next;

  coef=0.0;
  while(pa != NULL && pb != NULL )
  {
   if( (pa->expn +pb->expn )==k )
   {
    coef+=pa->coef * pb->coef;
    pa=pa->next;
    pb=pb->next;
   }
   else
   {
    if(( pa->expn  +  pb->expn ) > k )
    {
     pa=pa->next;
    }
    else
    {
     pb=pb->next;
    }
   }
  }
  if( coef != 0.0 )
  {
   u=(pPolyNode)malloc(sizeof(PolyNode));
   u->coef =coef;
   u->expn =k;
   u->next =pc->next;
   pc->next=u;
   pc=u;
  }
 }
 B=Reverse(B);
 return head;
 
}

//print Poly

void Printpoly(pPolyNode head)
{
 PolyNode *p=head->next;

 while(p)
 {
  printf("%1.1f",p->coef);
  if(p->expn )
   printf("*x^%d",p->expn );
  if(p->next && p->next->coef >0)
   printf("+");
  p=p->next;
 }
}

int main()
{
 pPolyNode A,B,C;
 A=CreatePoly();
 printf("A(x)=");
 Printpoly (A);
 printf("/n");

 B=CreatePoly();
 printf("B(x)=");
 Printpoly (B);
 printf("/n");

 C=multiply(A,B);

 //C=CreatePoly();
 printf("C(x)=");
 Printpoly (C);
 printf("/n");

 //getch();

 return 0;
}

实战数据结构(9)_单链表实现多项式的相乘

/************************************************************************/ /* @author lynnbest 目标:多项...
  • liuyunjay66
  • liuyunjay66
  • 2013年08月29日 16:03
  • 3319

通过链表实现的多项式乘法【C++】

被某喵发给我让我改的代码丑到哭。。。。就随手再写一个吧。。。 话说
  • BearCute
  • BearCute
  • 2014年10月31日 04:41
  • 2053

用链表实现一元多项式的加、减、乘、求导运算

在数据结构线性表的链表学习中有一个很有趣的题目:计算两个多项式的加、减、乘和多项式的导数。   题目不难,将多项式的系数和指数存进链表,然后进行相应操作即可。   一、加法:     1、判断指...
  • Jung_zhang
  • Jung_zhang
  • 2015年09月09日 15:27
  • 3258

两个一元多项式相乘,数组与链表实现

/*一元多项式求乘积*/#include#include#includevoid init_num(int x[],int y[]){ /* int i; srand( (unsigned)time(...
  • yanghangjun
  • yanghangjun
  • 2011年04月15日 13:13
  • 4951

多项式相乘求组合数RC(n,r)——链表实现

设集合S={n1*e1, n2*e2, ... nt*et}, n1 + n2 +...+nt = n, 从S中任取r个,求其组合数RC(n, r)。 设多项式   则RC(n,r)就是多项式中...
  • Candy1232009
  • Candy1232009
  • 2012年03月21日 10:28
  • 671

C语言链表实现多项式应用

  • 2016年03月28日 20:17
  • 2KB
  • 下载

数据结构,多项式的链表形式简单实现

  • 2011年04月11日 22:51
  • 4KB
  • 下载

数据结构链表实现多项式加减乘

  • 2013年04月11日 20:46
  • 2.98MB
  • 下载

利用单链表实现多项式基本运算(C++模板实现)

  • 2014年08月10日 16:47
  • 4KB
  • 下载

多项式相加 java链表实现

  • 2009年10月19日 22:57
  • 37KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用链表实现多项式相乘
举报原因:
原因补充:

(最多只允许输入30个字)