多项式求和和求值

//多项式操作
//作者:nuaazdh
//时间:2011年12月1日 12:52:00
#include <stdio.h>

#define OK 1
#define ERROR 0

typedef int Status;//函数状态代码

typedef struct{ //项的表示
    float coeff;//系数
    int expn;   //指数
}term,ElemType;

typedef struct LNode{//结点类型
    ElemType data;
    struct LNode *next;
}LNode,*Link;

typedef struct{//链表类型
    Link head,tail;//分别指向链表的头结点和尾结点
    int len;//链表的长度
}LinkList;

typedef LinkList polynomial;

//创建多项式,m为多项式中x的最高次幂
void CreatePolyn(polynomial *P,int m)
{
    int i=0;//循环变量
    float input;//用户输入
    for(i=0;i<=m;i++)
    {
        printf("请输入x^%d项的系数:",i);
        scanf("%f",&input);
        if(input!=0)
        {
            Link newnode=(Link)malloc(sizeof(LNode));
            if(newnode==NULL)
            {
                printf("申请内存失败.\n");
                exit(0);
            }
            newnode->data.coeff=input;//系数赋值
            newnode->data.expn=i;//幂赋值
            if(i==0)//第一项
                P->tail=newnode;
            newnode->next=P->head;//插入链表头部
            P->head=newnode;//修改头指针
            if(i==0)    //第一个结点
                P->tail=newnode;
            P->len++;//长度加1
        }
    }
}

//销毁多项式
void DestroyPolyn(polynomial *P)
{
    Link ptr=P->head;//指向首结点
    while(ptr!=NULL)
    {
        P->head=ptr->next;
        free(ptr);//释放结点空间
        ptr=P->head;
        P->len--;//链表长度减1
    }
    P->tail=NULL;
    P->len=0;
}

//输出多项式P
void PrintPolyn(const polynomial *P)
{
    Link ptr=P->head;
    if(!(P->len||P->head||P->tail))//链表为空
    {
        printf("多项式没有任何项.\n");
        return;
    }
    printf("表达式为:\n");
    //输出多项式各项
    while(ptr!=NULL)
    {
        if((ptr->data.coeff>0)&&(ptr!=P->head))//系数为正,且不是首项
            printf("+");//输出前置+号
        printf("%g",ptr->data.coeff);//输出系数
        if(ptr->data.expn)
            printf("x");
        if(ptr->data.expn>1)
            printf("^%d",ptr->data.expn);//输出x幂项
        ptr=ptr->next;
    }
    printf("\n");//输出回车
}

//返回多项式P的项数
int PolynLength(const polynomial *P)
{
    return P->len;//返回链表长度
}

//计算base的expn次幂值
float power(float base,int expn)
{
    if(expn==0)
        return 1.0;
    else
        return base*power(base,expn-1);
}

//计算多项式P在变量值为x时的值
float ComputeValue(const polynomial *P,float x)
{
    float sum=0.0;
    Link ptr;
    if(P->head==NULL)
    {
        printf("多项式为空.\n");
    }
    ptr=P->head;
    while(ptr!=NULL)
    {
        sum+=ptr->data.coeff*power(x,ptr->data.expn);
        ptr=ptr->next;
    }
    return sum;
}

//多项式相加运算,Pa=Pa+Pb,并销毁多项式Pb
void AddPolyn(polynomial *Pa,polynomial *Pb)
{
    Link ptr_a,ptr_b,ta,tb,ha;
    ta=NULL;//Pa链表中的临时指针
    tb=NULL;//Pb链表中的临时指针
    ha=NULL;//ha为当前已经合并的链表最后一个结点
    ptr_a=Pa->head;//指向多项式Pa
    ptr_b=Pb->head;//指向多项式Pb
    while(ptr_a&&ptr_b)
    {
        if(ptr_a->data.expn==ptr_b->data.expn)//幂相等,合并同类项
        {
            ptr_a->data.coeff+=ptr_b->data.coeff;//系数相加
            if(ptr_a->data.coeff==0.0)//系数为0
            {
                if(ha==NULL)//Pa的首相相消
                    Pa->head=ptr_a->next;
                free(ptr_a);//删除ptr_a指向结点
                ptr_a=Pa->head;
            }else{  //系数不为0
                if(ha!=NULL)//和多项式项数不为0
                    ha->next=ptr_a;
                ha=ptr_a;
                ptr_a=ptr_a->next;
            }
            tb=ptr_b->next;
            free(ptr_b);
            ptr_b=tb;
        }
        else if(ptr_a->data.expn<ptr_b->data.expn)//Pb当前项幂较高
        {
            if(ha==NULL)
            {
                Pa->head=ha=ptr_b;
            }else{
                ha->next=ptr_b;
                ha=ptr_b;
            }
            ptr_b=ptr_b->next;
        }
        else//Pa当前项幂较高
        {
            if(ha==NULL)
                ha=ptr_a;
            else
                ha->next=ptr_a;
            ptr_a=ptr_a->next;
        }//if
    }//while
    //链接剩余结点
    if(ha!=NULL)//所有处理过的项均相消
    {
        ha->next=(ptr_a==NULL)?(ptr_b):(ptr_a);
    }
    else
    {
        Pa->head=(ptr_a==NULL)?(ptr_b):(ptr_a);
    }
    Pb->head=Pb->tail=NULL;//修改多项式Pb指针
    Pb->len=0;
    //修正多项式Pa的尾指针和长度
    Pa->len=0;
    Pa->tail=Pa->head;
    if(Pa->tail!=NULL)
        while(Pa->tail->next)
        {
            Pa->tail=Pa->tail->next;
            Pa->len++;
        }
    Pa->len++;
    DestroyPolyn(Pb);//销毁Pb
}

//主函数
int main()
{
    int m;
    float x;
    polynomial p1,p2;//建立新链表
    p1.head=NULL;p1.tail=NULL;p1.len=0;
    p2.head=NULL;p2.tail=NULL;p2.len=0;
    printf("请输入关于x的多项式1中x的最高次幂:");
    scanf("%d",&m);
    if(m<0)
    {
        printf("输入值非法!\n");
    }
    CreatePolyn(&p1,m);//创建多项式
    printf("多项式1");
    PrintPolyn(&p1);//显示多项式1
    printf("请输入关于x的多项式2中x的最高次幂:");
    scanf("%d",&m);
    if(m<0)
    {
        printf("输入值非法!\n");
    }
    CreatePolyn(&p2,m);//创建多项式
    printf("多项式2");
    PrintPolyn(&p2);//显示多项式
    AddPolyn(&p1,&p2);
    printf("和多项式");
    PrintPolyn(&p1);//输出和多项式
    printf("输入x的值:");
    scanf("%f",&x);
    printf("多项式在x=%g时,值为%g",x,ComputeValue(&p1,x));//输出多项式求值
    DestroyPolyn(&p1);//销毁多项式
    return 0;
}


运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值