追忆~似水年华 2019-07-23 13:52 采纳率: 0%
浏览 327

单链表实现的多项式加减法计算,输入的负号变成了正号,并且幂为负时显示错误,这个程序应该怎么改?

//vc6.0实现的C++版![图片说明](https://img-ask.csdn.net/upload/201907/23/1563861033_43306.png)![图片说明](https://img-ask.csdn.net/upload/201907/23/1563861045_50819.png)


//功能:多项式的加减法操作
#include <iostream.h>//读入必须包含的头文件
#include <windows.h>//清屏和颜色设置需要
#include <string.h>
#include <fstream.h>
#include <iomanip.h>
#include <math.h>//处理方幂运算

enum returninfo{success,wrong,fail,overflow,underflow,empty_error};//定义返回信息清单
const int Maxsize=26;//系统允许多项式的最大值
const int Number=40;//设置输入多项式时字符串长度最大限,也可以根据需求任意设置
int order;//设置多项式显示方式0代表降幂显示,1代表升幂显示

class node//定义一个node类,处理多项式中的<项>:如3x^(-2)、4x^3、6x或者常数5等等
{
public:
    node(int initcoeff,int initindex,node *initnext=NULL);//系数、指数、后继结点
    node(node *initnext=NULL);//后继结点函数重载:用于头结点
    ~node();

    int coeff;//系数
    int index;//指数
    node *next;
};

node::node(int initcoeff,int initindex,node *initnext)
{
    coeff=initcoeff;
    index=initindex;
    next=initnext;
}

node::node(node *initnext)
{
    next=initnext;
}

node::~node()
{
}

/*
定义一个线性表类linklist
*/
class linklist
{
public:
    linklist();//构造函数
    ~linklist();//析构函数
    void clearlist(void);//清除多项式
    bool empty(void) const;//判断是否空链
    node *headp;//多项式头结点
};

linklist::linklist()//构造函数
{
    headp = new node;//申请新结点,作为头结点
    headp->next=NULL;//头结点的地址域预设为空地址
}

linklist::~linklist()//析构函数
{
    clearlist();//删除所有数据,释放所有结点
    delete headp;//把头结点也释放掉
}

void linklist::clearlist(void)//清除多项式
{
    node *searchp=headp->next,*followp=headp;//初始化两个指针
    while(searchp!=NULL)
    {
        followp=searchp;
        searchp=searchp->next;
        delete followp;
    }
    headp->next=NULL;//保留了最后一个结点,就是头结点,并且链域置为空
}

bool linklist::empty(void) const//判断是否空链
{
    if(headp->next==NULL)
        return true;
    else
        return false;
}

/*
实现多项式加减法的类sequelist
*/
class sequelist//管理多项式
{
public:
    sequelist();
    ~sequelist();
    returninfo inputdata(void);//从键盘输入多项式
    returninfo deletdata(void);//清空多项式信息
    returninfo calculate(void);//赋值计算
    void addnode(int site,int icoeff,int iindex);//增加项
    void display(char name);//显示某个多项式
    void displayname(void);//显示系统中现存多项式的名称
    void traveral(void);//遍历所有多项式
    void deletepart(char idata);//清除单个多项式信息
    void deletcomp(void);//清除全部多项式信息
    bool findlist(char idata);//查找多项式(提供多项式名称)
    bool scanname(char idata);//判断多项式的名称是否合法
    bool read();//读文件操作
    bool write();//写文件操作
protected:
    linklist list[Maxsize];
};

sequelist::sequelist()
{
}

sequelist::~sequelist()
{
}

returninfo sequelist::deletdata(void)//清空多项式信息
{
    int choice,site;
    char ch,name;
    cout<<"1.清空系统全部多项式信息"<<endl;
    cout<<"2.清除某个指定多项式信息"<<endl;
    cout<<"3.退出清除信息"<<endl;
    cout<<"请选择:";
    cin>>choice;
    if(choice==1||choice==2)
    {
        if(choice==1)
        {
            traveral();
            cout<<endl<<"请问:您确定要清空全部多项式信息吗?(Y/y):";
            cin>>ch;
            if(ch=='Y'||ch=='y')
                deletcomp();
            else
                return fail;
        }
        else
        {
            cout<<"请输入你要清空的多项式的名称(提示:一个大写字母):";
            cin>>name;
            site=int(name-'A');
            if(list[site].empty())
                return wrong;
            display(name);
            cout<<endl<<"请问:您确定要清除该多项式信息吗?(Y/y):";
            cin>>ch;
            if(ch=='Y'||ch=='y')
                deletepart(name);
            else
                return fail;
        }
        return success;
    }
    else
        return fail;
}

returninfo sequelist::calculate(void)//赋值计算
{
    int site,x,flag=0;
    double result=0,value;
    char name,ch;
    node *searchp;
    cout<<"请输入需要赋值计算的多项式名称(提示:一个大写字母):";
    cin>>name;
    site=int(name-'A');
    if(list[site].empty())
        return wrong;
    display(name);
    cout<<endl<<"请问:您确认要进行赋值计算吗?(Y/y):";
    cin>>ch;
    if(ch=='Y'||ch=='y')
    {
        cout<<"请给出变量x的值(如果方幂过大x不宜取大值):x=";
        cin>>x;
        cout<<endl<<name<<"("<<x<<")=";
        searchp=list[site].headp->next;
        while(searchp!=NULL)
        {
            value=searchp->coeff*pow(x,searchp->index);
            result+=value;
            cout<<" ";
            if(value>=0)
            {
                if(flag!=0)
                    cout<<"+";
            }
            cout<<value;
            flag++;
            searchp=searchp->next;
        }
        cout<<endl<<"  ="<<result<<endl<<endl;
    }
    else
        return fail;
    return success; 
}

void sequelist::display(char name)//显示某个多项式
{
    cout<<name<<"(x)=";
    int site;
    site=int(name-'A');
    node *searchp=list[site].headp->next;
    if(searchp->coeff==0)
        cout<<"0";
    else if(searchp->coeff!=1&&searchp->coeff!=-1)
    {
        if(searchp->index==0)
            cout<<searchp->coeff;
        else if(searchp->index==1)
            cout<<searchp->coeff<<"x";
        else if(searchp->index<0)
            cout<<searchp->coeff<<"x^("<<searchp->index<<")";
        else
            cout<<searchp->coeff<<"x^"<<searchp->index;
    }
    else
    {
        if(searchp->index==0)
            cout<<searchp->coeff;
        else if(searchp->index==1)
            cout<<searchp->coeff<<"x";
        else if(searchp->index<0)
            cout<<searchp->coeff<<"x^("<<searchp->index<<")";
        else
            cout<<searchp->coeff<<"x^"<<searchp->index;
    }
    searchp=searchp->next;
    while(searchp!=NULL)
    {
        cout<<" ";
        if(searchp->coeff!=1&&searchp->coeff!=-1)
        {
            if(searchp->index==0)
            {
                if(searchp->coeff>0)
                    cout<<"+";
                cout<<searchp->coeff;
            }
            else if(searchp->index==1)
            {
                if(searchp->coeff>0)
                    cout<<"+";
                cout<<searchp->coeff<<"x";
            }
            else if(searchp->index<0)
            {
                if(searchp->coeff>0)
                    cout<<"+";
                cout<<searchp->coeff<<"x^("<<searchp->index<<")";
            }
            else
            {
                if(searchp->coeff>0)
                    cout<<"+";
                cout<<searchp->coeff<<"x^"<<searchp->index;
            }
        }
        else if(searchp->coeff==1)
        {
            if(searchp->index==0)
                cout<<"+1";
            else if(searchp->index==1)
                cout<<"+x";
            else if(searchp->index<0)
                cout<<"+x^("<<searchp->index<<")";
            else
                cout<<"+x^"<<searchp->index;
        }
        else
        {
            if(searchp->index==0)
                cout<<"-1";
            else if(searchp->index==1)
                cout<<"-x";
            else if(searchp->index<0)
                cout<<"-x^("<<searchp->index<<")";
            else
                cout<<"-x^"<<searchp->index;
        }
        searchp=searchp->next;
    }
    cout<<endl;
}

void sequelist::deletcomp(void)//清除全部多项式信息
{
    int i;
    char name;
    for(i=0;i<Maxsize;i++)
    {
        name=char(i+'A');
        deletepart(name);
    }
}

void sequelist::deletepart(char idata)//清除单个多项式信息
{
    int site;
    site=int(idata-'A');
    node *searchp=list[site].headp->next,*followp;
    while(searchp!=NULL)
    {
        followp=searchp;
        searchp=searchp->next;
        delete followp;
    }
    list[site].headp->next=NULL;
}

returninfo sequelist::inputdata(void)//从键盘输入多项式(重点,难点,关键)
{
    char iname,idata[Number];
    node *searchp,*followp;
    int flag=0;//标志项系数正负(flag==1表示负,flag==0表示正)A=3x^(-2)+4x^3-6x^(-3)+5
    cout<<"请输入你要新建多项式的名称(提示:一个大写字母):";
    cin>>iname;
    if(scanname(iname))//名称通过检验
    {
        int site,icoeff=0,iindex=0,i=0,j=0,k=0;
        char data[20][20];//将输入的数据分项处理分成20块长度为20的项
        site=int(iname-'A');
        cout<<"请连续输入多项式不要有空格:"<<endl<<iname<<"(x)=";
        cin>>idata;
        //首先将第一项分开来处理
        data[k][i]=idata[i];
        while(idata[++i]!='+'&&idata[i]!='-'&&idata[i]!='\0')
            data[k][++j]=idata[i];
        data[k][++j]='\n';//项的最后一位以'\n'结束
        k++;//将项数加1,
        //从第二项开始往后的各项处理
        for(;idata[i]!='\0';)
        {
            j=0;//j还原为0
            data[k][0]=idata[i];//记录每一项的符号位
            while(idata[++i]!='+'&&idata[i]!='-'&&idata[i]!='\0')
            {
                data[k][++j]=idata[i];
                if(idata[++i]=='(')//指数为负的处理
                {
                    data[k][++j]=idata[i];
                    data[k][++j]=idata[++i];//将负号写入
                    i++;
                }
                i--;
            }
            data[k][++j]='\n';//项的最后一位以'\n'结束
            k++;//继续写下一项
        }//注意:此时的k后面会有用!!!
        //得到的data[20][20]为多项式的20个项
        for(i=0;i<k;)//将每一项分为node格式,并将其挂链对应的多项式上面
        {
            icoeff=0;
            iindex=0;
            j=0;
            if(data[i][0]=='-')//如果为负
            {
                flag=1;
                j++;
            }
            else if(data[i][0]=='+')//如果为正
            {
                flag=0;
                j++;
            }
            else
                flag=0;//这个是针对多项式的第一项为正的情况考虑的
            //项系数的确定
            while(data[i][j]>='0'&&data[i][j]<='9')
            {
                icoeff=icoeff*10+int(data[i][j]-'0');
                j++;
            }
            if(icoeff==0)
                icoeff=1;
            if(icoeff==1)
                icoeff=0-icoeff;//如果系数为负,则加上负号
            switch(data[i][j])//将data[i][j]分路:
            {
            case 'x'://此项为含x的项
                if(data[i][++j]=='\n')//指数为1的情况
                    iindex=1;
                else
                {
                    if(data[i][j]=='^')//后面紧接着是指数的情况(正和负)
                    {
                        if(data[i][++j]=='(')//指数为负的情况
                        {
                            j++;//跳过负号
                            while(data[i][++j]>='0'&&data[i][j]<='9')
                                iindex=iindex*10+int(data[i][j]-'0');
                            iindex=0-iindex;
                        }
                        else//指数为正的情况
                        {
                            j--;
                            while(data[i][++j]>='0'&&data[i][j]<='9')
                                iindex=iindex*10+int(data[i][j]-'0');
                        }
                    }
                    else
                    {
                        deletepart(iname);//清空现场再返回错误信息
                        return wrong;
                    }
                }
                //将项插入多项式中
                addnode(site,icoeff,iindex);
                break;
            case '\n'://此项为常数项
                iindex=0;
                addnode(site,icoeff,iindex);
                break;
            default://此项涉及到前面的多项式,如4A,5B,A*B等等
                int site1,site2;
                site1=int(data[i][j]-'A');
                if(site==site1||list[site1].empty())//如果为空
                {
                    deletepart(iname);//清空现场再返回错误信息
                    return wrong;
                }
                node *searchp1=list[site1].headp->next;
                if(data[i][++j]=='\n')//如4A,5B
                {
                    while(searchp1!=NULL)
                    {
                        addnode(site,(searchp1->coeff)*icoeff,searchp1->index);
                        searchp1=searchp1->next;
                    }
                }
                else if(data[i][j]=='*')//如3A*B等等
                {
                    site2=int(data[i][++j]-'A');
                    if(site==site2||data[i][++j]!='\n')
                    {
                        deletepart(iname);//清空现场再返回错误信息
                        return wrong;
                    }
                    if(list[site2].empty())//如果为空
                    {
                        deletepart(iname);//清空现场再返回错误信息
                        return empty_error;
                    }
                    node *searchp2=list[site2].headp->next;
                    while(searchp2!=NULL)
                    {
                        searchp1=list[site1].headp->next;
                        while(searchp1!=NULL)
                        {
                            addnode(site,(searchp1->coeff)*icoeff*(searchp2->coeff),(searchp1->index)+(searchp2->index));
                            searchp1=searchp1->next;
                        }
                        searchp2=searchp2->next;
                    }
                }
                else
                {
                    deletepart(iname);//清空现场再返回错误信息
                    return wrong;
                }
                break;
            }
            i++;
        }
        //到现在为止,多项式已经创建成功,下面进行系数项为0的清除工作
        followp=list[site].headp;
        searchp=list[site].headp->next;
        while(searchp!=NULL)
        {
            if(searchp->coeff==0)//系数项为0的清除
            {
                followp->next=searchp->next;
                delete searchp;
                searchp=followp;
            }
            followp=searchp;
            searchp=searchp->next;
        }
        if(list[site].headp->next==NULL)//多项式为0的情况
        {
            searchp=new node(0,0);//附加一个0项
            list[site].headp->next=searchp;
            searchp->next=NULL;
        }
        cout<<endl<<"新建多项式信息整理后如下:"<<endl;
        display(iname);//多项式显示
        return success;
    }
    return fail;
}
void sequelist::displayname(void)//显示系统中现存多项式的名称
{
    int j=0;
    cout<<"系统当前存在多项式的名称有:"<<endl;
    for(int i=0;i<Maxsize;i++)
    {
        if(!list[i].empty())
        {
            cout<<setw(4)<<char(i+'A');
            j++;
            if((j+1)%8==0)//每行显示7个多项式名称
                cout<<endl;
        }
    }
    cout<<endl<<"◇◇共"<<j<<"个多项式信息!"<<endl<<endl;
}

void sequelist::addnode(int site,int icoeff,int iindex)//增加项
{
    node *newnode,*searchp,*followp;
    if(list[site].empty())//如果为空
    {
        newnode= new node(icoeff,iindex);
        list[site].headp->next=newnode;
        newnode->next=NULL;
    }
    else
    {
        followp=list[site].headp;
        searchp=list[site].headp->next;
        if(order==1)//降序显示
        {
            while(searchp!=NULL&&searchp->index>iindex)
            {
                followp=searchp;
                searchp=searchp->next;
            }
        }
        else//升序显示
        {
            while(searchp!=NULL&&searchp->index>iindex)
            {
                followp=searchp;
                searchp=searchp->next;
            }
        }
        if(searchp!=NULL&&searchp->index==iindex)
        {
            searchp->coeff+=icoeff;//同类项合并
        }
        else//非同类项则按序插入
        {
            newnode=new node(icoeff,iindex);
            newnode->next=searchp;
            followp->next=newnode;
        }
    }
}

void sequelist::traveral(void)//遍历所有多项式
{
    int j=0;
    for(int i=0;i<Maxsize;i++)
    {
        if(!list[i].empty())
        {
            display(char(i+'A'));
            j++;
        }
    }
    cout<<"系统中现有多项式个数为:"<<j<<endl;
}

bool sequelist::findlist(char idata)//查找多项式(提供多项式名称)
{
    int site;
    site=int(idata-'A');
    if(list[site].empty())
        return false;
    else
    {
        display(idata);
        return true;
    }
}

bool sequelist::scanname(char idata)//判断多项式的名称是否合法
{
    if(idata>='A'&&idata<='Z')
    {
        int site;
        site=int(idata-'A');
        if(!list[site].empty())
        {
            cout<<"对不起,多项式"<<idata<<"已经存在!"<<endl;
            display(idata);
            return false;
        }
        else
        {
            cout<<"恭喜!多项式名称通过检验!请继续..."<<endl;
            return true;
        }
    }
    cout<<"对不起,您输入的多项式名称格式不正确!"<<endl;
    return false;
}

/*
定义一个实现多项式功能的菜单处理类interfacebase 
*/
class interfacebase
{
private:
    sequelist listonface;
public:
    void clearscreen(void);//清屏
    void showmenu(void);//显示菜单函数
    int userchoice(void);//用户的选项
    returninfo processmenu(int menuchoice);//菜单函数
};

void interfacebase::clearscreen(void)
{
    system("cls");
}

void interfacebase::showmenu(void)
{
    cout<<"单链表实现多项式的功能菜单"<<endl;
    cout<<"=========================="<<endl;
    cout<<"1.输入多项式(从键盘输入)"<<endl;
    cout<<"2.显示多项式(遍历所有多项式)"<<endl;
    cout<<"3.清空多项式信息"<<endl;
    cout<<"4.赋值计算"<<endl;
    cout<<"5.显示某个多项式"<<endl;
    cout<<"6.显示系统中现存多项式的名称"<<endl;
    cout<<"7.查找多项式(提供多项式名称)"<<endl;
    cout<<"0.退出程序"<<endl;
    cout<<"=========================="<<endl;
}

int interfacebase::userchoice(void)
{
    int menuchoice;
    cout<<"请输入您的选择:";
    cin>>menuchoice;
    return menuchoice;
}

returninfo interfacebase::processmenu(int menuchoice)
{
    int position,item,returnvalue;
    char name;
    switch(menuchoice)//根据用户的选择进行相应的操作
    {
    case 1:
        returnvalue=listonface.inputdata();
        if(returnvalue==fail)
            cout<<"对不起,您输入的多项式名称格式不正确!请按任意键继续..."<<endl;
        else if(returnvalue==wrong)
            cout<<"对不起,该项多项式错误(或者为空),已删除!请按任意键继续..."<<endl;
        else if(returnvalue==empty_error)
            cout<<"对不起,该项多项式为空!请按任意键继续..."<<endl;
        else
            cout<<"输入多项式操作成功!请按任意键继续..."<<endl;
        break;
    case 2:
        listonface.traveral();
        cout<<"多项式遍历操作成功!请按任意键继续..."<<endl;
        break;
    case 3:
        returnvalue=listonface.deletdata();
        if(returnvalue==fail)
            cout<<"操作取消!请按任意键继续..."<<endl;
        else if(returnvalue==wrong)
            cout<<"对不起,该项多项式为空!请按任意键继续..."<<endl;
        else
            cout<<"清除操作成功!请按任意键继续..."<<endl;
        break;
    case 4:
        returnvalue=listonface.calculate();
        if(returnvalue==wrong)
            cout<<"对不起,该项多项式为空!请按任意键继续..."<<endl;
        else if(returnvalue==fail)
            cout<<"操作取消!请按任意键继续..."<<endl;
        else
            cout<<"赋值计算操作成功!请按任意键继续..."<<endl;
        break;
    case 5:
        cout<<"请输入要显示的多项式名称:";
        cin>>name;
        listonface.display(name);
        cout<<"显示某个多项式操作成功!请按任意键继续..."<<endl;
        break;
    case 6:
        listonface.displayname();
        cout<<"显示系统中现存多项式的名称操作成功!请按任意键继续..."<<endl;
        break;
    case 7:
        cout<<"请输入要查找的多项式名称:";
        cin>>name;
        listonface.findlist(name);
        if(true)
            cout<<"查找多项式操作成功!请按任意键继续..."<<endl;
        else
            cout<<"该多项式为空(不存在)!请按任意键继续..."<<endl;
        break;
    case 0:
        exit(0);
    default:
        cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
        break;
    }
    return success;
}

/*
程序主入口
*/
void main(void)
{
    int menuchoice;//定义变量,菜单选单项的选择
    interfacebase interfacenow;
    sequelist sequelistnow;
    system("color f0");//修改屏幕的背景色和字的颜色
    interfacenow.clearscreen();//清屏
    while(1)//永真循环
    {
        interfacenow.showmenu();//显示菜单
        menuchoice=interfacenow.userchoice();//获取用户的选择
        interfacenow.processmenu(menuchoice);//处理用户的选择
        system("pause");//暂停
        interfacenow.clearscreen();//清屏
    }
}//主函数结束
  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号
    • ¥50 安装pyaudiokits失败
    • ¥15 计组这些题应该咋做呀
    • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?