数据结构实践教程——线性表(一元多项式相加)

一、实验要求
用户根据自己的需求输入两个一元多项式,要求能够显示输入的一元多项式,再将这两个一元多项式相加,输出结果。

二、代码实现

#include
#include
#include
#include
#include
using namespace std;
typedef struct PLNODE{
    double dbCoef;//系数域
    int nExpn;    //指数域
    struct PLNODE *next;
}PLNODE;
typedef PLNODE *PLinkList;

void CreatePolyn(PLinkList &sPolyn)//创建空链表
{
    sPolyn=(PLinkList)malloc(sizeof(PLNODE));//为头结点开辟空间
    if(!sPolyn)
        return;//判断sPolyn是否为空,是就退出
    sPolyn->next=NULL;
}

void ListInsert(PLinkList sPolyn,PLNODE sNewNode)
{
    PLinkList sTemp=sPolyn;
    PLinkList psNewNode=(PLinkList)malloc(sizeof(PLNODE));
    if(!psNewNode)
        return;//判断是否为空
    *psNewNode=sNewNode;//将指针所指对象的值修改为sNewNode
    while(sTemp->next!=NULL)
        sTemp=sTemp->next;
    sTemp->next=psNewNode;//将结点插入链表尾部
    psNewNode->next=NULL;//将尾结点的指向置为空
}

bool GetInt(int &value)
{
    char str[256]={0};
    fflush(stdin);//清空缓冲区
    gets(str);//等待输入数据,并将数据存到str中
    unsigned int index=1;
    int nTemp=0;
    if(str[0]=='-')//判断是否为负数
        nTemp=1;
    for(index=nTemp;index<strlen(str);index++)
    {
        if(str[index]<'0'||str[index]>'9')
            return false;
    }//判断输入的字符串是否合理
    value=atoi(str);//将字符串转化为整数
    return true;
}

void PrintPoly(PLNODE sPTemp)
{
    if(sPTemp.nExpn==0)//指数为0,直接输出系数
       cout<<sPTemp.dbCoef;
    else if(sPTemp.dbCoef==1)//系数为1时
    {
        if(sPTemp.nExpn==1)
            cout<<"x";
        else
            cout<<"x^"<<sPTemp.nExpn;
    }
    else if(sPTemp.dbCoef==-1)//系数为-1时
    {
        if(sPTemp.nExpn==1)
            cout<<"-x";
        else
            cout<<"-x^"<<sPTemp.nExpn;
    }
    else
    {
        if(sPTemp.nExpn==1)
            cout<<sPTemp.dbCoef<<"x";
        else
            cout<<sPTemp.dbCoef<<"x^"<<sPTemp.nExpn;
    }
}

void PrintPolyn(PLinkList sPolyn)
{
    int nIndex=0;
    PLinkList sPTemp=sPolyn->next;//sPTemp指向第一个项数
    if(!sPTemp)
        printf("0");//多项式之和为0时,输出0
    while(sPTemp!=NULL)
    {
        nIndex++;
        if(nIndex==1)//直接输出第一项
            PrintPoly(*sPTemp);
        else if(sPTemp->dbCoef>0)//系数大于0,先输出+号
        {
            cout<<"+";
            PrintPoly(*sPTemp);
        }
        else
            PrintPoly(*sPTemp);
        sPTemp=sPTemp->next;
    }
}
//多项式按指数从小到大排序
PLinkList ListSort(PLinkList sPolyn)
{
    sPolyn = sPolyn->next;//注意指向第一个结点
    PLinkList sTemp1,sTemp2;//这两个变量表示冒泡排序的两个遍历节点变量
    int nTemp=0;//中间变量
    double dbTemp=0.0;//中间变量
    for(sTemp1=sPolyn;sTemp1!=NULL;sTemp1=sTemp1->next)
    {
        for(sTemp2=sTemp1->next;sTemp2!=NULL;sTemp2=sTemp2->next)
        {
            if(sTemp1->nExpn>sTemp2->nExpn)
            {
                //如果sTemp1结点的指数值大,则交换两个结点的指数
                nTemp=sTemp2->nExpn;
                sTemp2->nExpn=sTemp1->nExpn;
                sTemp1->nExpn=nTemp;
                dbTemp=sTemp2->dbCoef;
                sTemp2->dbCoef=sTemp1->dbCoef;
                sTemp1->dbCoef=dbTemp;
            }
        }
    }
        return sPolyn;
}

void InputData(int nOrder,PLinkList &sPolyn)
{
    CreatePolyn(sPolyn);//创建空链表
    int n;
    do{
         GetInt(n);
         if(n<0)
            cout<<"输入项数为负,重新输入"<<endl;
    }while(n<0);
    PLNODE sNewNode;//定义新结点
    double dbCoef;
    int nExpn;
    int Expn[n];
    for(int i=0;i<n;i++)
    {
        do{
           cout<<"请输入第"<<i+1<<"项的系数:";
           cin>>dbCoef;
           if(cin.fail()||dbCoef==0)
           cout<<"输入系数不合法"<<endl;
        }while(cin.fail()||dbCoef==0);
        cout<<"请输入第"<<i+1<<"项的指数:";
        GetInt(nExpn);
        //cout<
        int Expn[n];//
        Expn[i]=nExpn;//使用数组记录之前输入的指数
        for(int j=0;j<i-1;j++)
            if(nExpn==Expn[j])
            {
                cout<<"指数输入重复"<<endl;
                return;
            }//当前指数是否已输入过,是则报错
        sNewNode.dbCoef=dbCoef;//存入数据
        sNewNode.nExpn=nExpn;
        ListInsert(sPolyn,sNewNode);//将新结点插入多项式链表的尾部
    }
}

PLinkList AddPolyn(PLinkList sPolyn1,PLinkList sPolyn2)
{
    PLinkList sPolynAdd;//要生成的多项式之和链表
    CreatePolyn(sPolynAdd);//创建空链表,sPolynAdd为头指针
    PLinkList sPolyn1Temp=sPolyn1->next;//指向第一个多项式的第一项
    PLinkList sPolyn2Temp=sPolyn2->next;//指向第二个多项式的第一项
    PLNODE sNewNode;//要插入和多项式中的结点
    while((sPolyn1Temp!=NULL)&&(sPolyn2Temp!=NULL))
    {
        int nEx=sPolyn1Temp->nExpn-sPolyn2Temp->nExpn;//计算指数差
        if(nEx<0)//多项式sPolyn1当前节点的指数值小
        {
            sNewNode.nExpn=sPolyn1Temp->nExpn;
            sNewNode.dbCoef=sPolyn1Temp->dbCoef;
            ListInsert(sPolynAdd,sNewNode);//将提取出来的项存入和链表中
            sPolyn1Temp=sPolyn1Temp->next;//移动sPolyn1Temp的结点
        }
        else if(nEx==0)//当前结点的指数相同
        {
            double dbCo=sPolyn1Temp->dbCoef+sPolyn2Temp->dbCoef;
            if(dbCo!=0.0)//当前相同指数的项的系数之和不为0
            {
                sNewNode.nExpn=sPolyn1Temp->nExpn;
                sNewNode.dbCoef=dbCo;
                ListInsert(sPolynAdd,sNewNode);//将提取出来的项存入和链表中
            }
            sPolyn1Temp=sPolyn1Temp->next;
            sPolyn2Temp=sPolyn2Temp->next;//移动结点
        }
        else
        {
            sNewNode.nExpn=sPolyn2Temp->nExpn;
            sNewNode.dbCoef=sPolyn2Temp->dbCoef;
            ListInsert(sPolynAdd,sNewNode);
            sPolyn2Temp=sPolyn2Temp->next;
        }
    }
    PLinkList sPolynTemp;
    CreatePolyn(sPolynTemp);
    if(sPolyn1Temp)
        sPolynTemp=sPolyn1Temp;
    else
        sPolynTemp=sPolyn2Temp;


    while(sPolynTemp)//链接剩余结点到和链表中
    {
        sNewNode.nExpn=sPolynTemp->nExpn;
        sNewNode.dbCoef=sPolynTemp->dbCoef;
        ListInsert(sPolynAdd,sNewNode);
        sPolynTemp=sPolynTemp->next;
    }

    return sPolynAdd;
}
void FreePolyn(PLinkList sPolyn)
{
    PLinkList sTemp=sPolyn;
    while(sPolyn!=NULL)
    {
        sPolyn=sPolyn->next;
        free(sTemp);
        sTemp=sPolyn;
    }
}

int main()
{
    cout<<"/*注意:系数为浮点类型,指数为整数(可为负)类型。\n";
    cout<<"请按指数从小到大的顺序输入多项式。*\n\n";
    PLinkList A,B,C;
    int m,n;
    cout<<"请输入第1个多项式的项数:";
    InputData(m,A);
    ListSort(A);
    cout<<"第1个多项式:";
    PrintPolyn(A);
    cout<<endl<<endl;
    cout<<"请输入第2个多项式的项数:";
    InputData(n,B);
    ListSort(B);
    cout<<"第2个多项式:";
    PrintPolyn(B);
    cout<<endl<<endl;
    cout<<"多项式之和为:";
    C=AddPolyn(A,B);
    ListSort(C);
    PrintPolyn(C); cout<<endl;
    cout<<"第1个多项式:";
    PrintPolyn(A); cout<<endl;
    cout<<"第2个多项式:";
    PrintPolyn(B);
    //释放链表
    FreePolyn(A);
    FreePolyn(B);
    FreePolyn(C);
    return 0;
}

三、运行结果
数据结构实践教程——线性表(一元多项式相加)_第1张图片

你可能感兴趣的:(数据结构,数据结构,链表,指针)