数据结构,多项式运算,C++,链表

#include<iostream>
 #include<conio.h>
 #include<stdlib.h>  //标准库头文件包含函数exit()
 using namespace std;
 struct Node     //建立结构体
 {
     float coef;  //项式系数
     int exp;     //项式指数
 };
 typedef Node polynomial;//重命名
 struct LNode
 {
     polynomial data;//链表类型
     LNode *next;
 };
 typedef LNode* Link;
 void Create(Link &L, int n);  //创建一个n项多项式函数
 void Print(Link L);          //输出链表函数
 void Add(Link &pc, Link pa, Link pb); //多项式相加函数
 void Substract(Link &pc, Link pa, Link pb);//多项式相减函数
 void Copy(Link &pc, Link pa);//把一个链表的内容复制给另一个链表创建表函数
 int Judge(Link pa, Link e);//判断指数是否与多项式中已存在的某项相同函数
 void Destroy(Link &L)//销毁链表函数
 {
     Link p;
     p = L->next;
     while (p)
     {
         L->next = p->next;
         delete p;
         p = L->next;
     }
     delete L;
     L = NULL;
 }
 void Create(Link &L, int n)//创建含有n个链表类型结点的项,即创建一个n项多项式
 {
     if (L != NULL)
     {
         Destroy(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) //判断指数是否为0,如果为0,销毁链表,从新输入
         {
             cout << "您输入有误,指数不允许为负值!" << endl;
             delete newp;
             i--;
             continue;
         }
         newp->next = NULL;
         p = L;
         if (newp->data.coef == 0)//判断系数是否为0
         {
             cout << "系数为零,重新输入!" << endl;
             delete newp;
             i--;
             continue;
         }
         while ((p->next != NULL) && ((p->next->data).exp<(newp->data).exp)) //利用while循环使p指向指数最小的项
         {
             p = p->next;
         }
         if (!Judge(L, newp))//判断指数是否与多项式中已存在的某项相同
         {
             newp->next = p->next;
             p->next = newp;
         }
         else
         {
             cout << "输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式" << endl;
             delete newp;
             Destroy(L);
             Create(L, n); //创建多项式没有成功,递归调用重新创建
             break;
         }
     }
 }
 int Judge(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 Print(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)  //输出指数为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 && (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";
             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)
             {
                 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 Copy(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 Add(Link &pc, Link pa, Link pb)//两个一元多项式相加
 {
     Link p1, p2, p, pd;
     Copy(p1, pa);
     Copy(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 Substract(Link &pc, Link pa, Link pb)//两个多项式相减
 {
     Link p, pt;
     Copy(pt, pb);//把pb复制在pt
     p = pt;
     while (p != NULL)
     {
         (p->data).coef = (-(p->data).coef);//将系数取反
         p = p->next;
     }
     Add(pc, pa, pt);//调用加法函数进行减法
     Destroy(pt);
 }
 void Multiply(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;
         }
         Add(pd, pc, p);
         Copy(pc, pd);
         p1 = p1->next;
         p2 = pb->next;
         Destroy(p);
         Destroy(pd);
     }
 }
 void division(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;
         }
         Add(pd, pc, p);
         Copy(pc, pd);
         p1 = p1->next;
         p2 = pb->next;
         Destroy(p);
         Destroy(pd);
     }
 }
 void Menu()//菜单函数
 {
     cout << "" << endl;
     cout << endl;
     cout << "\t\t\t\t\t一元多项式的加减乘除运算" << endl;
     cout << "\t\t\t\t\t\t\t\t   " << endl;
     cout << "\t\t  1 创建要运算的两个一元多项式\t\t   " << endl;
     cout << "\t\t  2 将两个一元多项式相加\t\t\t   " << endl;
     cout << "\t\t  3 将两个一元多项式相减\t\t\t   " << endl;
     cout << "\t\t  4 将两个一元多项式相乘\t\t\t   " << endl;
     cout << "\t\t  5 将两个一元多项式相除\t\t\t   " << endl;
     cout << "\t\t  0 退出         " << endl;
     cout << "\t\t\t\t\t\t\t\t   " << endl;
     cout << endl;
     cout << "\t\t  请选择:";
 }


 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;
             Create(La, n);
             cout << "请输入你要运算的第二个一元多项式的项数:" << endl;
             cin >> n;
             Create(Lb, n);
             break;
         case 2:
             if (La == NULL || Lb == NULL)
             {
                 cout << "您的多项式创建有误,请重新选择……" << endl;
                 break;
             }
             Add(L, La, Lb);
             cout << "" << endl;

             cout << "待相加的两个一元多项式为:" << endl;
             cout << "" << endl;
             cout << "A的多项式为:";
             Print(La);
             cout << "" << endl;
             cout << "B的多项式为:";
             Print(Lb);
             cout << "" << endl;
             cout << "相加后的结果为:";
             Print(L);
             cout << "" << endl;
             Destroy(L);
             break;
         case 3:
             Substract(L, La, Lb);
             cout << "相减的两个一元多项式为:" << endl;
             cout << "" << endl;
             cout << "A的多项式为:";
             Print(La);
             cout << "" << endl;
             cout << "B的多项式为:";
             Print(Lb);
             cout << "" << endl;
             cout << "相减后的结果为:";
             Print(L);
             cout << "" << endl;
             Destroy(L);
             break;
         case 4:
             if (La == NULL || Lb == NULL)
             {
                 cout << "您的多项式创建有误,请重新选择……" << endl;
                 break;
             }
             Multiply(L, La, Lb);
             cout << "相乘的两个一元多项式为:" << endl;
             cout << "" << endl;
             cout << "A的多项式为:";
             Print(La);
             cout << "" << endl;
             cout << "B的多项式为:";
             Print(Lb);
             cout << "" << endl;
             cout << "相乘后的结果为:";

             Print(L);
             Destroy(L);
             cout << "" << endl;
             break;
         case 5:
             if (La == NULL || Lb == NULL)
             {
                 cout << "您的多项式创建有误,请重新选择……" << endl;
                 break;
             }
             division(L, La, Lb);
             cout << "相除的两个一元多项式为:" << endl;
             cout << "" << endl;
             cout << "A的多项式为:";
             Print(La);
             cout << "" << endl;
             cout << "B的多项式为:";
             Print(Lb);
             cout << "" << endl;
             cout << "相除后的结果为:";

             Print(L);
             Destroy(L);
             cout << "" << endl;
             break;
         case 0:exit(1);
             Print(L);
             cout << "" << endl;
             break;
         }
     }
 }

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值