多项式操作及文件读写

本文介绍了一种使用链表实现一元多项式加法、减法及乘法的方法,并通过文件读取多项式数据,展示了如何进行多项式运算的具体过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define NULL 0
//定义多项式结构体类型
typedef struct polynomial
{
   int ceof;
      int expn;
  struct polynomial *next;
}polynomial;
//从文件中读取多项式
void PrintPolyn(FILE *fp)
{int ceof,expn,i;
 fscanf(fp,"%d %d",&ceof,&expn);
    printf("%dx^%d",ceof,expn);
    for(i=0;i<4;i++)
  {
   if(!feof(fp))//判断文件是否读完
   {
   fscanf(fp,"%d%d",&ceof,&expn);
         printf("+%dx^%d",ceof,expn);
     
   }
  }


}

//对比两个多项式的的指数
int Compare_expn(int a,int b)
{
 if(a==b)
  return 0;
 else if(a<b)
  return -1;
 else
  return 1;
}
//运用链表初始化多项式
polynomial *CreatPolyn(FILE *fp)
{   polynomial *head,*pre,*q;
    head=(polynomial*)malloc(sizeof(polynomial));
 head->next=NULL;
    pre=head;
 while(!feof(fp))
 {
  q=(polynomial*)malloc(sizeof(polynomial));
  fscanf(fp,"%d%d",&q->ceof,&q->expn);
        pre->next=q;//q的首地址赋值当前指针next指针变量。
     pre=q;//将q的首地址转给pre
  q->next=NULL;
 } 
 return(head);

}

void printpy(polynomial *head)

 int chang;
 polynomial *p;
    p=head->next;
 chang=1;
 while(chang)
 {    chang=0;
 if(p->next!=NULL)
 { 
  printf(" %d %d",p->ceof,p->expn);
     p=p->next;
  chang=1;
 }
 else
  printf(" %d %d",p->ceof,p->expn);

    }

}

//多项式相加函数
polynomial * AddPolyn(polynomial *ha, polynomial *hb)
{
 polynomial *qa,*qb,*pre;
 int a,b,sum;
 pre=ha;
    qa=ha->next;
    qb=hb->next;
 
 while(qa&&qb)
 {  a=qa->expn; 
    b=qb->expn;
 
       switch(Compare_expn(a,b))
    {
         case 0:
     sum=qa->ceof+qb->ceof;
    if(sum)
    {
   qa->ceof=sum;
      pre=qa;//当前指针pre后移到qa的位置
  
    }
     else//两项相加(数值相等,符号相异)和为零,所以释放qa。
     {
      pre->next=qa->next;//pre指向当前ha节点的指针。
       free(qa);
     }
      qa=pre->next;
      qb=qb->next;
      break;
        case -1:
     pre=qa;
     qa=qa->next;
     break;
       case 1:
    pre->next=qb;
    pre=qb;
    qb=qb->next;
       pre->next=qa;
         break;
    }
 }

while(qb)
{
 pre->next=qb;
 qb=qb->next;
}

return (ha);}
//两个一元多项式相减
polynomial * MnsPolyn(polynomial *ha, polynomial *hb)
{
 polynomial *qa,*qb,*pre;
 int a,b,result;
    pre=ha;
    qa=ha->next;
    qb=hb->next;

 while(qa&&qb)
 { a=qa->expn; 
     b=qb->expn;
 
       switch(Compare_expn(a,b))
    {
         case 0:
    result=qa->ceof-qb->ceof;
   if(result)
    {
   qa->ceof=result;
   pre=qa;
  
    }
     else//两项相减为零,所以释放qa(也即删除qa)。
     {
      pre->next=qa->next;
     
     }
      qa=qa->next; 
  
      qb=qb->next;break;
   
        case -1:
     pre=qa;
     qa=qa->next;break;
       case 1:
    pre->next=qb;
    pre=qb;
    qb=qb->next;
       pre->next=qa;break;

    }
 }

   if(qb)
   {
 pre->next=qb;

   }
   return (ha);

}

void  MultPolyn(polynomial *hb,polynomial *hc)
 {   polynomial *p,*q,*elem1,*elem2,*pre,*np;
     p=hb->next;//指向hb的第一个节点。
    elem1=(polynomial*)malloc(sizeof(polynomial));
    elem1->next=NULL;
 elem2=(polynomial*)malloc(sizeof(polynomial));
 elem2->next=NULL;
    pre=elem2;
     while(p!=NULL)
  {   
           for(q=hc->next;q;q=q->next)
   {
      np=(polynomial*)malloc(sizeof(polynomial));
      np->ceof=p->ceof*q->ceof;
         np->expn=p->expn+q->expn;
      pre->next=np;
      pre=np;
               np->next=NULL;
            }
          p=p->next;
          AddPolyn(elem1,elem2); 
      } 
  printf("第一个和第三个多项式相乘的结果:/n");
  printpy(elem1);
     printf("/n");
 }
void main()
{
    polynomial *ha,*hb,*hc,*p3;
 FILE *fp,*fp1,*fp2,*fp3,p1;
 printf("<******************一元多项式的操作******************>/n/n");
    fp=fopen("E://a.txt","r");
 fp1=fopen("E://b.txt","r");
 fp2=fopen("E://c.txt","r");
 fp3=fopen("E://d.txt","w");
 
 //输出多项式
 printf("从文件中读取两个一元多项式如下:/n/n");
 printf("第一个多项式:y=");
 PrintPolyn(fp);
 printf("/n");
    printf("第二个多项式:y=");
    PrintPolyn(fp1);
 printf("/n");
 printf("第三个多项式:y=");
 PrintPolyn(fp2);
 printf("/n");
   //fp指向文件已经读到最后了。想要再读则要再次打开
 fp=fopen("E://a.txt","r");
 fp1=fopen("E://b.txt","r");
 fp2=fopen("E://c.txt","r");
 //构建一元多项式和输出。
    printf("/n");
 printf("多项式链表构建成功,输出为:/n/n");
 printf("第一多项式系数和指数为:/n");
 ha=CreatPolyn(fp);
 printpy(ha);
 printf("/n");
    printf("第二多项式系数和指数为:/n");
    hb=CreatPolyn(fp1);
 printpy(hb);
 hc=CreatPolyn(fp2);
 //多项式相加
 printf("/n");
 printf("两个多项式相加的和:/n");
    AddPolyn(ha,hb);
 printpy(ha);
    printf("/n");
 p3=ha->next;//指向链表的的一个节点
 //向文件写入数据
 for(int i=0;i<3;i++)
 { 
  fprintf(fp3," %d %d",p3->ceof,p3->expn);
        p3=p3->next;
 }
 fclose(fp3);
 //多项式相减。
 MnsPolyn(ha,hb);
    printf("两个多项式相减的结果:/n");
    printpy(ha);
 printf("/n");
    //多项式相乘
   MultPolyn(hb,hc);
 


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值