一元多项式的计算

来源:互联网 发布:守望先锋账号购买淘宝 编辑:程序博客网 时间:2024/04/28 15:12

【任务要求】

(1) 能够按照指数降序排列建立并输出多项式;

(2) 能够完成两个多项式的相加、相减,并将结果输入;

实现提示:可选择带头结点的单向循环链表或单链表存储多项式,头结点可存放多项式的参数,如项数等。

要求:在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;

【测试数据】 

        自行选择 

  本题主要考察的是链表的建立,删除和增加元素,下面附上代码(带有注释)。若有更好的方法欢迎提建议




#include<stdio.h>
#include<malloc.h>
#include<math.h>
typedef struct Lnode
{
    int co;//系数
    int exp;//指数
    struct Lnode *next;
}Lnode;//结构体
int t=0;
Lnode Creat()//创建链表
{
    Lnode *head,*p;
    int c,e;
    head=(Lnode*)malloc(sizeof(Lnode));
    p=head;
    head->next=NULL;//创建空链表
    printf("请分别输入新的一项的系数,指数(以-1作为结束)\n");
    scanf("%d %d",&c,&e);//输入系数和指数
    while((c!=-1)||(e!=-1))//当指数不等于-1或系数不等于-1时进入循环尾插法建立链表
    {
         Lnode *s;
         s=(Lnode*)malloc(sizeof(Lnode));
         s->co=c;
         s->exp=e;
          scanf("%d %d",&c,&e);
         p->next=s;
         p=s;
         t++;
    }
    p->next=NULL;
   return *head;
}
Lnode add(Lnode *a,Lnode *b)//多项式相加的函数
{
    Lnode *c;
    c=(Lnode*)malloc(sizeof(Lnode));
    c->next=NULL;//生成一个新的头结点
    Lnode *p1,*p2;
    p1=a->next;//p1指向链表a的第一个节点
    p2=b->next;//p2指向链表b的第一个节点
    Lnode *rear=c;
    while(p1!=NULL&&p2!=NULL)//当指针p1和p2都不为空时
    {
        if(p1->exp>p2->exp)//当链表a节点的指数数小于链表b节点的指数时
        {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点p3;
            p3->co=p1->co;//把p1的系数赋值给p3的系数
            p3->exp=p1->exp;//把p1的指数赋值给p3的指数
            p3->next=NULL;//把p3的nest赋值为空
            rear->next=p3;//把rear的next指向新节点p3
            rear=p3;//rear 指向p3
            p1=p1->next;//p1移动到下一个指针位置
        }//总体实现的功能利用尾插法形成一个新的链表
        else if(p1->exp < p2->exp)//当链表a节点的指数数大于链表b节点的指数时
        {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p2->co;//把p2的系数赋值给p3的系数
            p3->exp=p2->exp;//把p2的指数赋值给p3的指数
            rear->next=p3;//把rear的next指向新节点p3
            rear=p3;//rear 指向p3
            p2=p2->next;//p2移动到下一个指针位置
        }
       else //当p1->exp==p2->exp
       {
           if((p1->co!=0)&&(p2->co!=0))//如果p1的系数和p2的系数不同时为0
           {
               Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p1->co+p2->co;//把p1和p2系数的和赋值给p3的系数
            p3->exp=p1->exp;//把p1的指数赋值给p3的指数
            p3->next=NULL;
            rear->next=p3;//把rear的next指向新节点p3
             rear=p3;//rear 指向p3
           }
            p2=p2->next;//p2移动到下一个指针位置
            p1=p1->next;//p1移动到下一个指针位置
       }
    }
    if(p1==NULL)
    {
        while(p2!=NULL)//当指针p1为空p2不为空时
        {
              Lnode *p3;
             p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点
             p3->co=p2->co;
             p3->exp=p2->exp;
             p3->next=NULL;
             rear->next=p3;
             rear=p3;
             p2=p2->next;
        }
    }
    else
    {
        while(p1!=NULL)//当指针p1不为空p2为空时
        {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p1->co;
            p3->exp=p1->exp;
            p3->next=NULL;
            rear->next=p3;
             rear=p3;
              p1=p1->next;
        }
    }
    return *c;//返回指针c
}
Lnode dec(Lnode *a,Lnode *b)//多项式a-多项式b的函数
{
    Lnode *c;
    c=(Lnode*)malloc(sizeof(Lnode));
    c->next=NULL;
    Lnode *p1,*p2;
    p1=a->next;
    p2=b->next;
    Lnode *rear=c;
    while(p1!=NULL&&p2!=NULL)//当p1不为空p2不为空时
    {
        if(p1->exp>p2->exp)//如果p1的指数小于p2的指数
        {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p1->co;
            p3->exp=p1->exp;
            p3->next=NULL;
            rear->next=p3;
            rear=p3;
            p1=p1->next;
        }
        else if(p1->exp <p2->exp)
        {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=-(p2->co);
            p3->exp=p2->exp;
            rear->next=p3;
            rear=p3;
            p2=p2->next;
        }
       else //p1->exp==p2->exp  p1的指数和p2的指数相等时
       {
           if((p1->co!=0)&&(p2->co!=0))//p1的系数不等于p2的系数不等于0
           {
               Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p1->co-p2->co;//把p1的系数减去p2的系数之差赋值给p3
            p3->exp=p1->exp;//把p1的指数赋值给p3的指数
            p3->next=NULL;
            rear->next=p3;
             rear=p3;
           }
            p2=p2->next;
            p1=p1->next;
       }
    }
    if(p1==NULL)
    {
        while(p2!=NULL)
        {
              Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=-(p2->co);
            p3->exp=p2->exp;
            p3->next=NULL;
            rear->next=p3;
            rear=p3;
            p2=p2->next;
        }
    }
    else if(p2==NULL)
    {
        while(p1!=NULL)
        {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p1->co;
            p3->exp=p1->exp;
            p3->next=NULL;
            rear->next=p3;
             rear=p3;
              p1=p1->next;
        }
    }
    return *c;
}
void print(Lnode *head,int n)//打印节点的函数
{
    int i=0;
    if(head==NULL)//如果链表不存在
    {
        printf("多项式不存在");
        return ;
    }
    Lnode *p;
    p=head->next;
    if(p!=NULL&&p->co!=0)//如果p指针不为空p的系数不为0
          printf("%d*x^%d",p->co,p->exp);
    p=p->next;
    while(p!=NULL)
    {
             if(p->co>0)//当p的系数大于0时
             {
                    printf("+%d*x^%d",p->co,p->exp);//把连字符“+”打印出来
                    p=p->next;
             }
             else if(p->co<0)//当p的系数小于0时
             {
                     printf("%d*x^%d",p->co,p->exp);//此时不用打印"+"连字符
                    p=p->next;
             }
        else
        {
            i++;//i计数
            p=p->next;
            continue;
        }
    }
    if(i==t)//多项式不存在的情况
        printf("多项式不存在!");
    printf("\n");
}
int main()
{
    printf("请输入多项式A:");
    Lnode p;
    p=Creat();//创建链表a
   printf("多项式A为:\n");
   print(&p,t);
    printf("请输入多项式B:\n");
    Lnode p1;
    p1=Creat();//创建链表b
    printf("多项式B为:\n");
    print(&p1,t);  Lnode p2,p3;
    p2=add(&p,&p1);//调用链表相加函数
    printf("多项式A加B后的结果为:");
    print(&p2,t);
    p3=dec(&p,&p1);//调用链表相减函数
    printf("多项式A减B后的结果为:");
    print(&p3,t);
    return 0;
}
1 0
原创粉丝点击