《数据结构小实验》一元多项式计算器

该代码整体运行下来没有问题,但有一些小地方没有很好的优化,仅供参考。

这里写目录标题

    • 实验要求
    • 程序代码
    • 实验结果

实验要求

  • 实验内容
    设有一元多项式Am(x)和Bn(X),编程实现多项式Am(x)和Bn(x)的加法、减法和乘法运算。其中多项式描述为: Am(x)=A0+A1x1+A2x2+A3x3….+Amxm;
    Bn(x)=B0+B1x1+B2x2+B3x3+….+Bnxn。
  • 实验说明
    1.输入和输出:
    (1)输入:
    从键盘输入运算指令(相加、相减、相乘),根据运算指令进行相应运算;
    从键盘输入两个多项式的系数和指数;
    系数和指数采用int类型,运算结果不超出int取值范围。
    (2)输出:
    每种运算结果以多项式形式输出,要输出升幂和降幂两种情况。
    结果多项式中无重复阶项、无零系数项,输出多项式时请采用如下易读形式(一元多项式,总变元为x): x^4 - 3 x^2 + 5
    2.实验要求:
    实现一个简单的交互式界面,包括系统菜单、输入提示等。
    根据多项式不同的运算要求选择合适的存储结构;
    上机编辑、调试出完整正确的程序,包括相加、相减、相乘运算。

程序代码

#include 
#include 
typedef struct PolyNode *Polynimial;
struct PolyNode
{
    int coef;
    int expon;
    Polynimial link;
};
void Attach(int c,int e,Polynimial *pRear);//多项式结点的创建
Polynimial ReadPoly();//创建多项式
void PrintPolyn(Polynimial P);//升幂输出多项式
Polynimial Add(Polynimial P1,Polynimial P2);//多项式相加
Polynimial Decrease(Polynimial P1,Polynimial P2);//多项式相减
int Compare(int a,int b);//比较多项式系数大小
Polynimial Mult(Polynimial P1,Polynimial P2);//多项式相乘
Polynimial ReverseList(Polynimial P);//多项式的转置
void mune();//菜单选项
Polynimial ReadPoly()
{
    Polynimial P,Rear,t;
    int c,e,N;
    printf("请输入多项式的项数\n");
    scanf("%d",&N);
    P=(Polynimial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    Rear=P;
    printf("请输入多项式(以系数c 指数e的格式输入)\n");
    while(N--)
    {
        scanf("%d%d",&c,&e);
        Attach(c,e,&Rear);
    }
    t=P;
    P=P->link;
    free(t);
    return P;
}
void Attach(int c,int e,Polynimial *pRear)
{
    Polynimial P;
    P=(Polynimial)malloc(sizeof(struct PolyNode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*pRear)->link=P;
    *pRear=P;
}
void PrintPolyn(Polynimial P)
{
    printf("%dx^%d",P->coef,P->expon);
	P =P->link;
	while(P!=NULL)
	{
		if(P->coef>= 0)
			printf("+%dx^%d",P->coef,P->expon);
		else
			printf("%dx^%d",P->coef,P->expon);

		P =P->link;
	}
	printf("\n\n\n");
}
int Compare(int a,int b)
{
    if(a>b) return 1;
    else if(a<b) return -1;
    else return 0;
}
Polynimial Add(Polynimial P1,Polynimial P2)
{
    Polynimial P,Rear,t,t1,t2;
    t1=P1;t2=P2;
    P=(Polynimial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    Rear=P;
    while(t1&&t2)
    {
        switch(Compare(t1->expon,t2->expon))
        {
        case 1:
            Attach(t1->coef,t1->expon,&Rear);
            t1=t1->link;
            break;
        case -1:
            Attach(t2->coef,t2->expon,&Rear);
            t2=t2->link;
            break;
        case 0:
            if(t1->coef+t2->coef)
            Attach(t1->coef+t2->coef,t1->expon,&Rear);
            t1=t1->link;
            t2=t2->link;
            break;
        }
    }
    for(; t1; t1 = t1->link) Attach(t1->coef, t1->expon, &Rear);
    for(; t2; t2 = t2->link) Attach(t2->coef, t2->expon, &Rear);
    Rear->link=NULL;
    t=P;
    P=P->link;
    free(t);
    return P;
}
Polynimial Decrease(Polynimial P1,Polynimial P2)
{
    Polynimial P,Rear,t,t1,t2;
    t1=P1;t2=P2;
    P=(Polynimial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    Rear=P;
    while(t1&&t2)
    {
        switch(Compare(t1->expon,t2->expon))
        {
        case 1:
            Attach(t1->coef,t1->expon,&Rear);
            t1=t1->link;
            break;
        case -1:
            Attach(t2->coef,t2->expon,&Rear);
            t2=t2->link;
            break;
        case 0:
            if(t1->coef+t2->coef)
            Attach(t1->coef-t2->coef,t1->expon,&Rear);
            t1=t1->link;
            t2=t2->link;
            break;
        }
    }
    for(; t1; t1 = t1->link) Attach(t1->coef, t1->expon, &Rear);
    for(; t2; t2 = t2->link) Attach(t2->coef, t2->expon, &Rear);
    Rear->link=NULL;
    t=P;
    P=P->link;
    free(t);
    return P;
}
Polynimial Mult(Polynimial P1,Polynimial P2)
{
    Polynimial P,Rear,t1,t2,t;
    int c,e;
    if(!P1||!P2) return NULL;
    t1=P1,t2=P2;
    P=(Polynimial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    Rear=P;
    while(t2)
    {
        Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
        t2=t2->link;
    }
    t1=t1->link;
    while(t1)
    {
        t2=P2;Rear=P;
        while(t2)
        {
            e=t1->expon+t2->expon;
            c=t1->coef*t2->coef;
            while(Rear->link&&Rear->link->expon>e)
                Rear=Rear->link;
            if(Rear->link&&Rear->link->expon==e)
            {
                if(Rear->link->coef+c)
                    Rear->link->coef+=c;
                else {
                    t=Rear->link;
                    Rear->link=t->link;
                    free(t);
                }
            }
            else
            {
                t=(Polynimial)malloc(sizeof(struct PolyNode));
                t->coef=c;
                t->expon=e;
                t->link=Rear->link;
                Rear->link=t;
                Rear=Rear->link;
            }
            t2=t2->link;
        }
        t1=t1->link;
    }
    t2=P;
    P=P->link;
    free(t2);
    return P;
}
Polynimial ReverseList(Polynimial P)
{
    Polynimial Ta=NULL;
    Polynimial Tb=P;
    while(Tb!=NULL)
    {
        Polynimial Pt=Tb;
        Tb=Tb->link;
        Pt->link=Ta;
        Ta=Pt;
    }
    return Ta;
}
void mune()
{
    printf("                                                                    \n");
    printf("                                                                    \n");
    printf("                                                                    \n");
    printf("       *****************      欢迎使用多项式计算器      ***************   \n  ");
    printf("                                                                    \n");
    printf("    请选择操作:\n");
    printf("                           1:创建多项式:\n");
    printf("                                                                    \n");
    printf("                           2:多项式相加:\n");
    printf("                                                                    \n");
    printf("                           3:多项式相减:\n");
    printf("                                                                    \n");
    printf("                           4:多项式相乘:\n");

}
int main()
{
   mune();
   Polynimial Pa,Pb,Pc,Pd;
   int choice,t;
    printf("请输入操作指令:");
   scanf("%d",&t);
   switch(t)
   {
      case 1:
      Pa=ReadPoly();
      Pb=ReadPoly();
      break;
   }
   printf("请输入操作指令:");
   scanf("%d",&choice);
   switch(choice)
   {
   case 2:
     printf("输出结果:\n");
     Pc=Add(Pa,Pb);
     printf("正序:");
     PrintPolyn(Pc);
     printf("反序:");
     Pd=ReverseList(Pc);
     PrintPolyn(Pd);
     break;
   case 3:
     printf("输出结果:\n");
     Pc=Decrease(Pa,Pb);
     printf("正序:");
     PrintPolyn(Pc);
     printf("反序:");
     Pd=ReverseList(Pc);
     PrintPolyn(Pd);
     break;
   case 4:
    printf("输出结果:\n");
     Pc=Mult(Pa,Pb);
     printf("正序:");
     PrintPolyn(Pc);
     printf("反序:");
     Pd=ReverseList(Pc);
     PrintPolyn(Pd);
     break;
   }

   return 0;
}

实验结果

  • 加法
    《数据结构小实验》一元多项式计算器_第1张图片
  • 减法
    《数据结构小实验》一元多项式计算器_第2张图片
  • 乘法
    《数据结构小实验》一元多项式计算器_第3张图片

你可能感兴趣的:(数据结构,数据结构,c++,恰饭,经验分享)