多项式运算(数组/链表)c语言版—数据结构

一元多项式加减乘 (链表)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define  LEN sizeof(node)
//定义结构体;                                  
typedef struct  s{
    double coef;                            //系数; 
    int expn;                                //指数; 
    struct s *next;                            //定义指向结构体的指针; 
}*link,node;                                //定义指针link,结构体node; 
//生成结点;
link f(double coef,int expn){                //函数返回指向结构体的指针; 
    link p;
    p=(link)malloc(LEN);                    //动态申请内存  p指针指向该内存; 
    p->coef =coef;                            
    p->expn =expn;                             
    p->next =NULL;
    return p;

//清空链表;
link f0(link head){                            //函数返回头指针 ,参数为头指针; 
    link p=head,q;
    p=head->next;
    while (p){                                
        q=p->next;
        free(p);
        p=q;
    } 
//    printf("%lf,%d",head->coef ,head->expn );
    head->next=NULL;
    return head;

//输入多项式按指数降幂  插入;
link sort(link head,link q){                //参数:为头指针、插入的结点; 
    link p,p1=NULL;
    int i;
    p=head;
    p1=p; 
//    p=p->next;
if(!(p->next)){                                //判断插入之前是否为空链表; 
    p->next = q;
    return head;
}
else{
    p=p->next;                        
    while ((p!=NULL)&&(p->expn>=q->expn)){                                    //链表的中的结点存在  并且插入的数据中指数  小于原链表的指针;        
        if((p->expn==q->expn)&&(p->coef +q->coef==0)){                        //如果插入的数据与原来的数据相加等于0(指数相同的情况下); 
                p1->next=p->next;                                            //删除相加等于0的结点; 
                 free(p);                                                    //释放结点; 
                 free(q);                                
                 return head;    
        }        
        else if(p->expn==q->expn){                                            //插入的指数与原链表中某一项的指数相等但相加不等于0; 
            p->coef =p->coef+q->coef;                                        //相同指数系数相加 
            return head;
        }
        p1=p;                                 
        p=p->next;
    }                    
    if(p==NULL)    p1->next=q;                                                    //项数最小插入到尾链; 
    else{                                        
            p1->next=q;    
            q->next =p;
    }    
            return head;
    }     

 
//建立多项式;
link f1(link head,int d){                                                    //参数为头指针,第几个多项式; 
    int i,expn,n=0;    
    double coef;
    link p=    NULL,q=NULL;
    head->next=NULL;
    head->expn = 0;
    p=head;
    printf("请输入第%d个多项式的系数和指数(中间以逗号隔开 输入0,0结束): ",d);
    scanf("%lf,%d",&coef,&expn);
    while ((coef!=0)&&(expn!=0)){                                            //判断输入是否合法; 
        q = f(coef,expn);                                                    //调用f函数创建结点; 
        head=sort(head,q);                                                    //调用sort函数降幂插序; 
        printf("请输入第%d个多项式的系数和指数( 输入0,0结束): ",d);
        scanf("%lf,%d",&coef,&expn);
    } 
    return head;

//输出多项式;
void f2(link head,int d){                             
    int i,n=0;
    link p=NULL;
    p=head;
    p=p->next;    
    printf("多项式P%d(X)= ",d);
    while (p){                                                                //判断条件为p!=NULL; 
            n++;                                                            //标志变量,用于判

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值