【数据结构】单链表实现一元多项式的相加减

2018年12月26日19点08分:
笔者在整理博客的时候,看到篇博客,发现相应功能没有完善。应该是当时一开始学数据结构的时候,照着书本写一个小demo。不过在另一篇博客(【数据结构】一元稀疏多项式计算器)上,已经把一元多项式的相关计算功能(加、减、乘、求导)完善了,读者可以参考。


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

typedef struct{
 float coef;//系数
 int expn;//指数
}Term;
typedef struct ploynomial{
  Term term;
  ploynomial* next;
}ploynomial,*LinkList;
void InitList(LinkList &L){
    //初始化链表
  L= (ploynomial*)malloc(sizeof(ploynomial));
 L->term.coef=0.0;L->term.expn=-1;//设置头结点的数据元素
 L->next=NULL;
}
int cmp(Term a,Term b){
  //比较结点的系数大小函数
  if(a.expn<b.expn) return -1;
  else if(a.expn==b.expn) return 0;
  else return 1;
}
void insertNode(LinkList &L,Term e){
   //将结点插入多项式链表的适当位置
   ploynomial* q=L;
   while(q->next!=NULL){
       if(cmp(q->next->term,e)<0)
        q=q->next;//q指向下一个结点
       else break;//当前项的指数已经大于或等于要插入的项指数
   }
   if(q->next!=NULL&&cmp(q->next->term,e)==0){//指数相同,系数相加
    q->next->term.coef+=e.coef;
   }
   else{
    ploynomial* node =(ploynomial*) malloc(sizeof(ploynomial));
    node->term.coef=e.coef;
    node->term.expn=e.expn;
    if(q->next==NULL)
        node->next=NULL; //如果q结点为尾结点,则node的指针域设为NULL
    else
        node->next=q->next; //否则node的指针域指向q的下一个结点
    q->next=node;
   }
}
void CreatPolyn(LinkList &L,int m){
  //输入m项的系数和指数,建立表示一元多项式的有序链表L
  Term e;
  InitList(L);
  printf("\n输入%d项的系数和指数:",m);
  for(int i=1;i<=m;i++){
    printf("\n第%d项的系数和指数:",i);
    scanf("%f%d",&e.coef,&e.expn);
    insertNode(L,e);
  }
}
void addPolyn(LinkList &L1,LinkList &L2){
   //完成多项式相加运算,即L1=L1+L2 ,并销毁一元多项式L2
  ploynomial* q;
  for(q=L2->next;q!=NULL;q=q->next){
    insertNode(L1,q->term);//将L2的每一项插入到L1中
  }
  free(L2);
}
void SubtracatPolyn(LinkList &L1,LinkList &L2){
    //完成多项式相减运算,即L1=L1-L2 ,并销毁一元多项式L2
    //减法的实现和加法的实现非常类似,就是把多次项的系数取相反数,然后在求和
    ploynomial* q;
  for(q=L2->next;q!=NULL;q=q->next){
    q->term.coef = -(q->term.coef);
    insertNode(L1,q->term);//将L2的每一项插入到L1中
  }
  free(L2);
}
void visitList(LinkList L){
    //打印输出一元多项式L
   ploynomial* q=L;
   printf("\n");
   while(q->next!=NULL){
    q=q->next;
    if(q->term.coef>0)
        printf("+%fX^%d",q->term.coef,q->term.expn);
    else printf("%fX^%d",q->term.coef,q->term.expn);
   }
}

int main(){
    LinkList L1,L2;
    int n1,n2;
    printf("请输入多项式L1的项数:");
    scanf("%d",&n1);
    CreatPolyn(L1,n1);
    printf("请输入多项式L2的项数:");
    scanf("%d",&n2);
    CreatPolyn(L2,n2);
    printf("\n多项式L1:");
    visitList(L1);
    printf("\n多项式L2:");
    visitList(L2);
    printf("\n相加:");
    addPolyn(L1,L2);
    //printf("\n相减:"); 相加和相减不能连续使用,因为执行相减或相加元素L2会被销毁。需要重新创建多项式L2
    //SubtracatPolyn(L1,L2);
    visitList(L1);

}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值