多项式的加减

#include<stdio.h>
#include<stdlib.h>

#define null 0
#define true 1
#define false 0
typedef struct /* 项的表示, 多项式的项作为LinkList的数据元素 */
{
      float coef;  /* 系数 */
      int exp;   /* 指数 */
}term, ElemType;

typedef struct LNode /* 结点类型 */
{
    ElemType data;  // ElemType是表示多项式中项的结构体类型
    struct LNode *next;
}LNode,*LinkList;

LinkList creatpoly()//建立多项式
{
 LinkList head,r,s;
    float n;
 int m;
    head=(LinkList)malloc(sizeof(LNode));
    printf("输入每项的系数和指数(输入格式为:系数,指数)注:系数输入0,则输入结束!:\n");
    scanf("%f,%d",&n,&m);
    r=head;
    while (n!=0)
 {
  //尾插法建立一个单链表,完成多项式的表示
  s=(LinkList)malloc(sizeof(LNode));//动态生成一个节点
        s->data.coef=n;//节点初始化
  s->data.exp=m;
  r->next=s;//新节点插入到单链表中
  r=s;
  printf("input coef and exp:\n");
  scanf("%f,%d",&n,&m);
 }
 r->next=null;
 head=head->next;
 return(head);
}
LinkList polyadd(LinkList ha,LinkList hb)//相加
{
 LinkList hc,p,q,s,r;
 float x=0.0;
 p=ha;//指向链表ha的首元结点
 q=hb; //指向链表hb的首元结点
 hc=(LinkList)malloc(sizeof(LNode));  //创建新的链表
 s=hc;
 // 实现两个多项式的相加
 while((p!=null)&&(q!=null))
 {
  if(p->data.exp==q->data.exp){
            x=p->data.coef+q->data.coef;
   if(x!=0){
    r=(LinkList)malloc(sizeof(LNode));
    r->data.exp=p->data.exp;
    r->data.coef=x;
    //新链表移动指针
    s->next=r;
    s=r;
   }
   p=p->next;
   q=q->next;
  }
  else if(p->data.exp<q->data.exp)
  {
            r=(LinkList)malloc(sizeof(LNode));
   r->data.coef=q->data.coef;
   r->data.exp=q->data.exp;
   s->next=r;
   s=r;
   q=q->next;
  }
  else
  {
                r=(LinkList)malloc(sizeof(LNode));
    r->data.exp=p->data.exp;
    r->data.coef=p->data.coef;
    s->next=r;
    s=r;
    p=p->next;
  }

 }

    while(p)
    {
        r=(LinkList)malloc(sizeof(LNode));
        r->data.exp=p->data.exp;
  r->data.coef=p->data.coef;
  s->next=r;
  s=r;
  p=p->next;

 }
 while(q)
 {
        r=(LinkList)malloc(sizeof(LNode));
        r->data.exp=q->data.exp;
  r->data.coef=q->data.coef;
  s=r;
  q=q->next;
 }
 
    s->next=null; r=hc;
 hc=hc->next; free(r);
 return(hc);
}

void ployout(LinkList head)//输出一个多项式
{
 LinkList p;
 p=head;
 int i=0;
 while (p!=null)
 {
  if(i&&p->data.coef >= 0)
   printf("+");
  printf("%.3fx%d",p->data.coef,p->data.exp);  
  p=p->next; 
  i++;
 }
 printf("\n");
 }

// 自定义一个两个链表相减的函数,实现一元多项式的相减
 /********************************************/
LinkList polysub(LinkList ha,LinkList hb)//相减
{
 LinkList hc,p,q,s,r;
 float x = 0;
 p=ha;//指向链表ha的首元结点
 q=hb; //指向链表hb的首元结点
 hc=(LinkList)malloc(sizeof(LNode));  //创建新的链表

 s=hc;
while((p!=null)&&(q!=null)) {
  if(p->data.exp==q->data.exp){
            x=p->data.coef-q->data.coef;
   if(x!=0){
    r=(LinkList)malloc(sizeof(LNode));
    r->data.exp=p->data.exp;
    r->data.coef=x;
    s->next=r;
    s=r;
   }
   p=p->next;
   q=q->next;
  }
  else if(p->data.exp<q->data.exp)
  {
            r=(LinkList)malloc(sizeof(LNode));
   r->data.coef=q->data.coef;
   r->data.exp=q->data.exp;
   s->next=r;
   s=r;
   q=q->next;
  }
  else
  {
                r=(LinkList)malloc(sizeof(LNode));
    r->data.exp=p->data.exp;
    r->data.coef=p->data.coef;
    s->next=r;
    s=r;
    p=p->next;
  }

 }

    while(p)
    {
        r=(LinkList)malloc(sizeof(LNode));
        r->data.exp=p->data.exp;
  r->data.coef=p->data.coef;
  s->next=r;
  s=r;
  p=p->next;

 }
 while(q)
 {
        r=(LinkList)malloc(sizeof(LNode));
        r->data.exp=q->data.exp;
  r->data.coef=q->data.coef;
  s=r;
  q=q->next;
 }
   
    s->next=null; r=hc;
 hc=hc->next; free(r);
 return(hc);
}

 


    /********************************************/

void main()
{
 LinkList ha,hb,hc,hd;
 printf("输入第一个多项式:\n");
 ha=creatpoly();
 ployout(ha);
 printf("输入第二个多项式:\n");
 hb=creatpoly();
 ployout(hb);
 // 完成两个多项式的相加
 printf("两个多项式相加结果:\n");
 hc=polyadd(ha,hb);
 ployout(hc);

 // 完成两个多项式的相减   

    printf("两个多项式相减结果:\n");
 hc=polysub(ha,hb);
 ployout(hc);

 }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值