weixin_44760757 2021-10-26 22:08 采纳率: 100%
浏览 18
已结题

一元多项式的加减乘法的代码错哪了啊


#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
struct Node{
    float coef;
    int exp;
};
typedef Node polynomial;
struct LNode{
    polynomial data;
    LNode *next;
};
typedef LNode* Link;
void CreateLink(Link &L,int n);
void PrintList(Link L);

void PolyAdd(Link &pc,Link pa,Link pb);

void PolyStract(Link &pc,Link pa,Link pb);
void CopyLink(Link &pc,Link pa);
void PolyMultiply(Link &pc,Link pa,Link pb);
int JudgeIfExpSame(Link pa,Link e);
void DestroyLink(Link &L)
{Link p;
p=L->next;
while(p)
{ L->next=p->next;
delete p;
p=L->next;
}
delete L ;
L=NULL;
}
void CreateLink(Link &L,int n)
{if(L!=NULL)
{DestroyLink(L);}
Link p,newp;
L=new LNode;
L->next=NULL;
(L->data).exp=-1;
p=L;
for(int i=1;i<=n;i++)
{ newp=new LNode;
cout<<"请输入第"<<i<<"项的系数和指数:"<<endl;
cout<<"系数:";
cin>>(newp->data).coef;
cout<<"指数:";
cin>>(newp->data).exp;
if(newp->data.exp<0)
{cout<<"您的输入有误,指数不允许为负值!"<<endl;
delete newp;
i--;
continue;
}
newp->next=NULL;
p=L;
if(newp->data.coef==0)
{cout<<"系数为零,重新输入!"<<endl;
delete newp;
i--;
continue;
}
while((p->next!=NULL)&&((p->next->data).exp<(newp->data).exp))
{ p=p->next;
//p指向指数最小的那一个
}
if(!JudgeIfExpSame(L,newp))
{newp->next=p->next;
p->next=newp;
}
else
{
    cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"<<endl;
    delete newp;
    DestroyLink(L);
    CreateLink(L,n);
    break;
}
}
JudgeIf(L);
}
void JudgeIf(Link L)
{Link p;
int flag=0;
p=L->next;
while(p->next!=NULL)
{
    if(abs(p->next->data.exp-p->data.exp)>1)
        flag=1;
    else
        flag=0;
    p=p->next;
}
if(flag)
cout<<"该多项式是稀疏的"<<endl;
else
cout<<"该多项式是连续的"<<endl;
}
int JudgeIfSame(Link L,Link e)
{Link p;
p=L->next;
while(p!=NULL&&(e->data.exp!=p->data.exp))
p=p->next;
if(p==NULL)
return 0;
else return 1;
}
void PrintList(Link L)
{Link p;
if(L==NULL||L->next==NULL)
cout<<"该一元多项式不空!"<<endl;
else
{p=L->next;
if((p->data).coef>0)
{if((p->data).exp==0)
cout<<(p->data).coef;//如果指数为0则直接输出系数
else if((p->data).coef==1&&(p->data).exp!=1)
cout<<"x";
else if((p->data).coef==1&&(p->data).coef!=1)
cout<<"x^"<<(p->data).exp;
else if((p->data).exp==1&&(p->data).coef!=1)
cout<<(p->data).coef<<"x";
else cout<<(p->data).coef<<"x^"<<(p->data).exp;
}
if((p->data).coef<0)
{
    if((p->data).exp==0)
        cout<<(p->data).coef;
    else if(p->data.coef==-1&&p->data.exp==1)
        cout<<"-x";
    else if(p->data.coef==-1&&p->data.exp!=1)
        cout<<"-x^"<<p->data.exp;
    else if(p->data.exp==1)
        cout<<p->data.coef<<"x";//如果指数为1,则输出系数倍经
    else cout<<(p->data).coef<<"x^"<<(p->data).exp;
}
p=p->next;
while(p!=NULL)
{
    if((p->data).coef>0)
    {
        if((p->data).exp==0)
            cout<<"+"<<(p->data).coef;
        else if((p->data).exp==1&&(p->data).coef!=1)
            cout<<"+"<<(p->data).coef<<"x";
        else if((p->data).exp==1&&(p->data).coef==1)
            cout<<"+"<<"x";
        else if((p->data).coef==1&&(p->data).exp!=1)
            cout<<"+"<<"x^"<<(p->data).exp;
        else 
            cout<<"+"<<(p->data).coef<<"x^"<<(p->data).exp;
    }
    if((p->data).coef<0)//系数小于0时输出情况
    {
        if((p->data).exp==0)
            cout<<(p->data).coef;
        else if(p->data.coef==-1&&p->data.exp==1)
            cout<<"-x";
        else if(p->data.coef==-1&&p->data.exp!=1)
            cout<<"-x^"<<p->data.exp;
        else if(p->data.exp==1)
            cout<<p->data.coef<<"x";
        else cout<<(p->data).coef<<"x^"<<(p->data).exp;
    }
    p=p->next;
}
}
cout<<endl;
}



void CopyLink(Link &pc,Link pa)
{Link p,q,r;
pc=new LNode;
pc->next=NULL;
r=pc;
p=pa;
while(p->next!=NULL)
{
    q=new LNode;
    q->data.coef=p->next->data.coef;
    q->data.exp=p->next->data.exp;
    r->next=q;
    q->next=NULL;
    r=q;
    p=p->next;
}
}



//加法模块

void PolyAdd(Link &pc,Link pa,Link pb)
{
    Link p1,p2,p,pd;
    CopyLink(p1,pa);
    CopyLink(p2,pb);
    pc=new LNode;
    pc->next=NULL;
    p=pc;
    p1=p1->next;
    p2=p2->next;
    while(p1!=NULL&&p2!=NULL)
    {
        if(p1->data.exp<p2->data.exp)
        {
            p->next=p1;
            p=p->next;
            p1=p1->next;
        }
        else if(p1->data.exp>p2->data.exp)
        {
            p->next=p2;
            p=p->next;
            p2=p2->next;
        }
        else
        { 
            p1->data.coef=p1->data.coef+p2->data.coef;
            if(p1->data.coef!=0)
        {
            p->next=p1;
            p=p->next;
            p1=p1->next;
            p2=p2->next;
        }
        else
        {
            pd=p1;
            p1=p1->next;
            p2=p2->next;
            delete pd;
        }
        }
    }
    if(p1!=NULL)
    {
        p->next=p1;
    }
    if(p2!=NULL)
    {
        P->next=p2;
    }
}

void PolySubstract(Link &pc,Link pa,Link pb)
{
    Link p,pt;
    CopyLink(pt,pb);
    p=pt;
    while(p!=NULL)
    {
        (p->data).coef=(-(p->data).coef);
        p=p->next;
    }
    PolyAdd(pc,pa,pt);
    DestroyLink(pt);
}

void Clear()
{
    system("pause");
    system("cls");
}//让用户重新选择


void PolyMultiply(Link &pc,Link pa,Link pb)
{
    Link p1,p2,p,pd,newp,t;
    pc=new LNode;
    pc->next=NULL;
    p1=pa->next;
    p2=pb->next;
    while(p1!=NULL)
    {
        pd=new LNode;
        pd->next=NULL;
        p=new LNode;
        p->next=NULL;
        t=p;
        while(p2)
        {
            newp=new LNode;
            newp->next=NULL;
            newp->data.coef=p1->data.coef*p2->data.coef;
            newp->data.exp=p1->data.exp+p2->data.exp;
            t->next=newp;
            t=t->next;
            p2=p2->next;
        }
        PolyAdd(pd,pc,p);
        CopyLink(pc,pd);
        p1=p1->next;
        p2=pb->next;
        DestroyLink(p);
        DestroyLink(pd);
    }
}


void Menu()
{
    cout<<""<<endl;
    cout<<endl;
    cout<<"***************************一元多项式的加、减、乘运算***************************"<<endl;
    cout<<"\t\t\t\t\t\t\t\t    "<<endl;
    cout<<"[1]  创建要运算的两个一元多项式\t\t   "<<endl;
    cout<<"[2]  将两个一元多项式相加\t\t\t   "<<endl;
    cout<<"[3]  将两个一元多项式相减\t\t\t   "<<endl;
    cout<<"[4]  将两个一元多项式相乘\t\t\t   "<<endl;
    cout<<"[5]  显示两个一元多项式\t\t\t   "<<endl;
    cout<<"[6]  销毁所创建的两个一元多项式\t\t\t "<<endl;
    cout<<"[7]  退出\t\t\t\t\t "<<endl;
    cout<<"\t\t\t\t\t\t\t\t   "<<endl;
    cout<<"请选择:";
}

int CompareIfNum(int i)
{
    if(i>0&&i<8)
        return 0;
    else return 1;//返回1时出错,因为菜单中只有1-7
}


void main()
{
    int n;
    Link L,La=NULL,Lb=NULL;//la,lb分别为创建的两个多项式
    int choose;
    while(1)
    {
        Menu();
        cin>>choose;
        switch(choose)
        {
        case 1:
            cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl;
            cin>>n;
            if(CompareIfNum(n)==1)
            {
                cout<<"您的输入有误,请重新输入......"<<endl;
                Clear();
                break;
            }
            CreateLink(Lb,n);
            Clear();
            break;
        case 2:
            if(La==NULL||Lb==NULL)
            {
                cout<<"您的多项式创建有误,请重新选择......"<<endl;
                Clear();
                break;
            }
            PolyAdd(L,La,Lb);
            cout<<""<<endl;
            cout<<"设相加的两个一元多项式为A和B则:"<<endl;
            cout<<""<<endl;
            cout<<"A的多项式为:"<<endl;
            PrintList(La);
            cout<<""<<endl;
            cout<<"B的多项式为:"<<endl;
            PrintList(Lb);
            cout<<""<<endl;
            cout<<"相加后的结果为:"<<endl;
            PrintList(L);
            cout<<""<<endl;
            Clear();
            DestroyLink(L);
            break;
        case 3:
            if(La==NULL||Lb==NULL)
            {
                cout<<"您的多项式创建有误,请重新选择......"<<endl;
                Clear();
                break;
            }
            PolySubstract(L,La,Lb);
            cout<<"设相减的两个一元多项式为A和B则:"<<endl;
            cout<<""<<endl;
            cout<<"A的多项式为:"<<endl;
            PrintList(La);
            cout<<""<<endl;
            cout<<"B的多项式为:"<<endl;
            PrintList(Lb);
            cout<<""<<endl;
            cout<<"相减后的结果为:"<<endl;
            PrintList(L);
            cout<<""<<endl;
            Clear();
            DestroyLink(L);
            break;
        case 4:
            if(La==NULL||Lb==NULL)
            {
                cout<<"您的多项式创建有误,请重新选择......"<<endl;
                Clear();
                break;
            }
            PolyMultiply(L,La,Lb);
            cout<<"设相乘的两个一元多项式为A和B则:"<<endl;
            cout<<""<<endl;
            cout<<"A的多项式为:"<<endl;
            PrintList(La);
            cout<<""<<endl;
            cout<<"B的多项式为:"<<endl;
            PrintList(Lb);
            cout<<""<<endl;
            cout<<"相乘后的结果为:"<<endl;
            PrintList(L);
            DestroyLink(L);
            cout<<""<<endl;
            Clear();
            break;
        case 5:
                if(La==NULL||Lb==NULL)
            {
                cout<<"您的多项式创建有误,请重新选择......"<<endl;
                Clear();
                break;
            }
                cout<<"一元多项式A为:"<<endl;
                PrintList(La);
                cout<<""<<endl;
                cout<<"一元多项式B为:"<<endl;
                PrintList(Lb);
                cout<<""<<endl;
                Clear();
                break;
        case 6:
            if(La&&Lb)
            {
                DestroyLink(La);
                DestroyLink(Lb);
                cout<<"多项式销毁成功!"<<endl;
                Clear();
            }
            break;
        case 7:
            exit(0);//exit(0)强制终止程序,返回状态码0表示正常结束
        default:
                cout<<"您的输入有误,请重新选择操作......"<<endl;
                Clear();
                break;
                }
            }
            }
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月3日
    • 创建了问题 10月26日

    悬赏问题

    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
    • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)