数据结构课程设计之一元多项式的计算

2023-05-16

数据结构不是听会的,也不是看会的,是练会的,对于写这么长的代码还是心有余也力不足啊,对于指针的一些操作,也还是不熟练,总出现一些异常错误大哭,对于数据结构掌握还是不够啊,还是要多练,这个课程设计做的还是有点粗糙,还有待改进啊!!

对代码有进行了一下改进,增加了排序的模块;可能还存在着一下小bug,发现了再更新:减法还可以写的更简便一点。

<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>/*屏幕操作函数库*/
using namespace std;
struct node //结构体储存系数和指数
{
    float coef; //系数
    int expn;  //指数
};
typedef node polynomial; // 创建一个多项式的节点
struct Lnode// 储存数据,指针域
{
    polynomial data;
    Lnode *next;
};
typedef Lnode Link; // 链表的数据类型
void CreatPolyn(Link *L,int n) //创建多项式
{
   Link *q; //创建一个新的节点
   for(int i=1;i<=n;i++)
   {
       q=(Link*)malloc(sizeof(Link));
       q->next=NULL;
       printf("输入第%d项的系数和指数:\n",i);
       scanf("%f%d",&q->data.coef,&q->data.expn);
       L->next=q;
       L=L->next; //把节点链到多项式中
   }
}

void DestoryPolyn(Link *L)// 销毁多项式
{
    Link *p;
    p=L->next;
    while(p!=NULL)
    {
        L->next=p->next;
        free(p);//释放节点的内存
        p=L->next;
    }
    free(p);
}

void PrintPolyn(Link *L) //打印多项式
{
    Link *p;
    if(L==NULL||L->next==NULL) //多项式为空的情况
        cout<<"该一元多项式为空!"<<endl;
    else
        {
            p=L->next;
            while(p!=NULL)
         {
               if((p->data).coef>0)//多项式的系数大于0的五种情况
                 {
                    if((p->data).expn==0)
                    cout<<(p->data).coef;
                    else if((p->data).coef==1&&(p->data).expn==1)
                        cout<<"x";
                    else if((p->data).coef==1&&(p->data).expn!=1)
                        cout<<"x^"<<(p->data).expn;
                    else if((p->data).expn==1&&(p->data).coef!=1)
                        cout<<(p->data).coef<<"x";
                    else
                        cout<<(p->data).coef<<"x^"<<(p->data).expn;
                    }
                    if((p->data).coef<0)//多项式的系数小于0的五种情况
                        {
                        if((p->data).expn==0)
                            cout<<(p->data).coef;
                            else if((p->data).coef==-1&&(p->data).expn==1)
                                cout<<"-x";
                            else if((p->data).coef==-1&&(p->data).expn!=1)
                                cout<<"-x^"<<p->data.expn;
                            else if((p->data).expn==1)
                                cout<<(p->data).coef<<"x";
                            else
                            cout<<(p->data).coef<<"x^"<<(p->data).expn;
                        }
                    if(p->next!=NULL&&(p->next->data).coef>0&&p->data.coef!=0)
                        cout<<"+";
                        p=p->next;
            }
        }
   cout<<endl;
}

void SortPolyn(Link *L)//给多项式排序按递减顺序排序
{
    Link *p,*q,*r;//建立新节点
    p=L->next;
    if(p!=NULL)//链表不为空
    {
        r=p->next;
        p->next=NULL;
        p=r;
        while(p!=NULL)
        {
            r=p->next;
            q=L;
            while(q->next!=NULL&&q->next->data.expn>p->data.expn)//指数比较
                q=q->next;
            p->next=q->next;//如果q的指数大于p就继续遍历,不大于p就把p插到q后面
            q->next=p;
            p=r;
        }
    }
}

Link *AddPolyn(Link *L,Link *La,Link *Lb) //多项式的相加
{
    Link *p,*q,*s,*r;
    float x;
    p=La;
    q=Lb;
    r=L;
   while(q!=NULL&&p!=NULL)
    {
        if(p->data.expn==q->data.expn) //两个多项式的系数相等的情况
        {
            x=p->data.coef+q->data.coef;
            if(x!=0)
                {
                    s=(Link*)malloc(sizeof(Link));
                    s->data.coef=x;
                    s->data.expn=p->data.expn;
                    r->next=s;
                    r=s;
                }
                q=q->next;
                p=p->next;
        }
        else if(p->data.coef<q->data.coef) //第一个多项式的指数小于第二个多项式的指数
            {
                s=(Link *)malloc(sizeof(Link));
                s->data.coef=q->data.coef;
                s->data.expn=q->data.expn;
                r->next=s;
                r=s;
                q=q->next;
            }
            else {
                s=(Link*)malloc(sizeof(Link));
                s->data.coef=p->data.coef;
                s->data.expn=p->data.expn;
                r->next=s;
                r=s;
                p=p->next;
                }
        }
        while(p!=NULL) //第一个多项式的长度比第二个长,把剩余的部分链入L中
        {
            s=(Link *)malloc(sizeof(Link));
            s->data.coef=p->data.coef;
            s->data.expn=p->data.expn;
            r->next=s;
            r=s;
            p=p->next;
        }
        while(q!=NULL)
        {
            s=(Link *)malloc(sizeof(Link));
            s->data.coef=q->data.coef;
            s->data.expn=q->data.expn;
            r->next=s;
            r=s;
            q=q->next;
        }
        r->next=NULL;
        L=L->next;
  return L;
}

Link *SubstractPolyn(Link *L,Link *La,Link *Lb)//多项式相减
{
    Link *p,*q,*s,*r;
    float x;
    p=La;
    q=Lb;
    r=L;
   while(q!=NULL&&p!=NULL)
    {
        if(p->data.expn==q->data.expn)
        {
            x=p->data.coef-q->data.coef;
            if(x!=0)
                {
                    s=(Link*)malloc(sizeof(Link));
                    s->data.coef=x;
                    s->data.expn=p->data.expn;
                    r->next=s;
                    r=s;
                }
                q=q->next;
                p=p->next;
        }
        else if(p->data.coef<q->data.coef)
            {
                s=(Link *)malloc(sizeof(Link));
                s->data.coef=-q->data.coef;
                s->data.expn=q->data.expn;
                r->next=s;
                r=s;
                q=q->next;
            }
            else {
                s=(Link*)malloc(sizeof(Link));
                s->data.coef=p->data.coef;
                s->data.expn=p->data.expn;
                r->next=s;
                r=s;
                p=p->next;
                }
        }
        while(p!=NULL)
        {
            s=(Link *)malloc(sizeof(Link));
            s->data.coef=p->data.coef;
            s->data.expn=p->data.expn;
            r->next=s;
            r=s;
            p=p->next;
        }
        while(q!=NULL)
        {
            s=(Link *)malloc(sizeof(Link));
            s->data.coef=-q->data.coef;
            s->data.expn=q->data.expn;
            r->next=s;
            r=s;
            q=q->next;
        }
        r->next=NULL;
        L=L->next;
  return L;
}

void Clear()//清屏函数
{
    system("pause");//输入任意键继续
    system("cls");//清屏
}

void Quit()//退出函数
{
    printf("\n\n\n\n\n");
    printf("\t\t★★★★★★★★★★★★★★★★★★★★★\n");
    printf("\t\t★★★★★★★感谢您的使用★★★★★★★★\n");
    printf("\t\t★★★★★★★欢迎再次使用★★★★★★★★\n");
    printf("\t\t★★★★★★★★★谢谢★★★★★★★★★★\n");
    printf("\n\n\n\n\n\t\t\t\t\t\tBy Mr.wang\n");
    exit(0);
}

void Meun()//菜单
{
    printf("\n\n\n\n===========================一元多项式的计算===============================\n");
    printf("\t\t[1] 创建要运算的两个一元多项式\n");
    printf("\t\t[2] 显示两个一元多项式\n");
    printf("\t\t[3] 将两个一元多项式相加\n");
    printf("\t\t[4] 将两个一元多项式相减\n");
    printf("\t\t[5] 将多项式递减排序\n");
    printf("\t\t[6] 销毁所创建的二个多项式\n");
    printf("\t\t[7] 退出\n");
    printf("请输入您的选择:\n");
}

int main()
{
    Link *L,*La,*Lb;;
    int chioce,n,m;
    La=(Link*)malloc(sizeof(Link));
    La->next=NULL;
    Lb=(Link*)malloc(sizeof(Link));
    Lb->next=NULL;
    L=(Link *)malloc(sizeof(Link));
    L->next=NULL;
    while(1)
    {
        system("color 2E");/*改变控制台颜色*/
        Meun();
        scanf("%d",&chioce);
        switch(chioce)
        {
          case 1:
            system("cls");
            printf("输入第一个多项式的长度:\n");
            scanf("%d",&n);
            printf("创建第一个多项式A:\n");
            if(n==0)
            {
                printf("您的输入有误,请重新输入:\n");
                Clear();
                break;
            }
            CreatPolyn(La,n);
            system("cls");
            printf("输入第二个多项式的长度:\n");
            scanf("%d",&m);
            if(m==0)
            {
                 printf("您的输入有误,请重新输入:");
                 Clear();
                 break;
            }
            printf("创建第二个多项式B:\n");
            CreatPolyn(Lb,m);
            Clear();
            break;
          case 2:
            system("cls");
            if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            Clear();
            break;
          case 3:
            system("cls");
            if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("设相加的两个多项式为:\n");
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            printf("相加的结果为:\n");
            L=AddPolyn(L,La,Lb);
            SortPolyn(L);
            PrintPolyn(L);
            Clear();
            break;
          case 4:
              system("cls");
               if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("设相减的两个多项式为:\n");
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            printf("相减的结果为:\n");
            L=SubstractPolyn(L,La,Lb);
            SortPolyn(L);
            PrintPolyn(L);
            Clear();
            break;
          case 5:
            system("cls");
            if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("给多项式A排序:\n");
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("排序后的结果为:\n");
            SortPolyn(La);
            PrintPolyn(La);
            getch();
            system("cls");
            printf("给多项式B排序:\n");
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            printf("排序后的结果为:\n");
            SortPolyn(Lb);
            PrintPolyn(Lb);
            Clear();
            break;
          case 6:
             system("cls");
             if(La->next&&Lb->next)
             {
                 DestoryPolyn(La);
                 DestoryPolyn(Lb);
                 printf("多项式销毁成功!\n");
                 Clear();
             }
             else
             {
                 printf("多项式不存在,请重新输入:\n");
                 Clear();
             }
             break;
          case 7:
            system("cls");
            Quit();
            Clear();
            break;
          default :
            printf("您的输入有误,请重新输入:\n");
            Clear();
            break;
    }
    }
    return 0;
}




  

要加强数据结构和指针的训练,要达到熟练运用的程度!!!

更新了一下程序代码:

Link *SubstractPolyn(Link *L,Link *La,Link *Lb)//多项式相减
{
   Link *q,*p;
   q=Lb;
   p=Lb->next;
   while(p!=NULL)
   {
       p->data.coef*=-1;//把Lb的系数变为它的相反数
       p=p->next;
   }
   L=AddPolyn(L,La,q);
   return L;
}

Link* CreatPolyn(Link *L) //创建多项式
{
   Link *q,*p; //创建一个新的节点
   int flag=0,i=1;
   L=(Link*)malloc(sizeof(Link));
   L->next=NULL;
   p=L;
   while(flag!=1)
   {
       q=(Link*)malloc(sizeof(Link));
       q->next=NULL;
       printf("输入第%d项的系数和指数:\n",i++);
       scanf("%f%d",&q->data.coef,&q->data.expn);
       p->next=q;
       p=q; //把节点链到多项式中
       printf("多项式是否输入完毕?(0/1)输入1结束输入\n");  //输入0继续输入 输入1结束输入
       scanf("%d",&flag);
   }
   p->next=NULL;
   if(flag==1)
   {
      printf("多项式输入完毕!\n");
   }
   return L;
}
int main()
{
    Link *L,*La,*Lb;
    int chioce;
    while(1)
    {
        system("color 2E");/*改变控制台颜色*/
        Menu();
        scanf("%d",&chioce);
        switch(chioce)
        {
          case 1:
            system("cls");
            printf("创建第一个多项式A:\n");
            La=CreatPolyn(La);
            getch();
            system("cls");
            printf("创建第二个多项式B:\n");
            Lb=CreatPolyn(Lb);
            Clear();
            break;
          case 2:
            system("cls");
            if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            Clear();
            break;
          case 3:
            system("cls");
            if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("设相加的两个多项式为:\n");
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            printf("相加的结果为:\n");
            L=AddPolyn(L,La,Lb);
            SortPolyn(L);
            PrintPolyn(L);
            Clear();
            break;
          case 4:
              system("cls");
               if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("设相减的两个多项式为:\n");
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            printf("相减的结果为:\n");
            L=SubstractPolyn(L,La,Lb);
            SortPolyn(L);
            PrintPolyn(L);
            Clear();
            break;
          case 5:
            system("cls");
            if(La->next==NULL||Lb->next==NULL)
            {
                  printf("您的多项式创建有误,请重新选择:\n");
                  Clear();
                  break;
            }
            printf("给多项式A排序:\n");
            printf("多项式A为:\n");
            PrintPolyn(La);
            printf("排序后的结果为:\n");
            SortPolyn(La);
            PrintPolyn(La);
            getch();
            system("cls");
            printf("给多项式B排序:\n");
            printf("多项式B为:\n");
            PrintPolyn(Lb);
            printf("排序后的结果为:\n");
            SortPolyn(Lb);
            PrintPolyn(Lb);
            Clear();
            break;
          case 6:
             system("cls");
             if(La->next&&Lb->next)
             {
                 DestoryPolyn(La);
                 DestoryPolyn(Lb);
                 printf("多项式销毁成功!\n");
                 Clear();
             }
             else
             {
                 printf("多项式不存在,请重新输入:\n");
                 Clear();
             }
             break;
          case 7:
            system("cls");
            Quit();
            Clear();
            break;
          default :
            printf("您的输入有误,请重新输入:\n");
            Clear();
            break;
    }
    }
    return 0;
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构课程设计之一元多项式的计算 的相关文章

随机推荐

  • Linux版本号串记录(ubuntu系列)

    Linux version 4 4 0 112 generic buildd 64 lgw01 amd64 010 gcc version 5 4 0 20160609 Ubuntu 5 4 0 6ubuntu1 16 04 5 135 U
  • 死锁的四个必要条件

    死锁 在高并发中是一个常见的名词 产生的四个必要条件如下 xff1a 互斥条件 xff1a 一个资源同一时间能且只能被一个线程访问 xff1b 不可掠夺 xff1a 当资源被一个线程占用时 xff0c 其他线程不可抢夺该资源 xff1b 请
  • Sphinx index.rst

    假设我们有两个文本file1 rst和file2 rst他们的内容如下 file1 rst span class hljs header file1 title1 61 61 61 61 61 61 61 61 61 61 61 61 sp
  • Git - 图形化界面操作

    目录 1 新建仓库 2 代码提交 3 代码回滚 4 新建分支 5 合并分支 6 重置合并 7 分支变基 8 分支优选 Git 的图形化界面操作 xff0c 使用 Idea 进行演示 1 新建仓库 对于一个代码仓库 Create Git re
  • CMakeLists

    1 指定 cmake 的最小版本 cmake minimum required VERSION 3 4 1 2 设置项目名称 xff0c 它会引入两个变量 demo BINARY DIR 和 demo SOURCE DIR xff0c 同时
  • 七步实现STM32MP157多核协同工作(Cortex-A7与Cortex-M4通信)

    写在前面 xff1a STM32MP157是ST进军Linux的首款微处理器 xff0c 采用MCU 43 MPU的组合 xff0c 集成两颗主频微800MHz的Cortex A7应用处理器内核 xff08 支持开源linux操作系统 xf
  • 【实战】STM32 FreeRTOS移植系列教程4:FreeRTOS 软件定时器

    写在前面 xff1a 本文章为 STM32MP157开发教程之FreeRTOS操作系统篇 系列中的一篇 xff0c 笔者使用的开发平台为华清远见FS MP1A开发板 xff08 STM32MP157开发板 xff09 stm32mp157是
  • 【实战】STM32 FreeRTOS移植系列教程5:FreeRTOS消息队列

    写在前面 xff1a 本文章为 STM32MP157开发教程之FreeRTOS操作系统篇 系列中的一篇 xff0c 笔者使用的开发平台为华清远见FS MP1A开发板 xff08 STM32MP157开发板 xff09 stm32mp157是
  • 学习嵌入式linux为什么推荐stm32mp157开发板?

    stm32mp157是ST推出的一款双A7 43 M4多核异构处理器 xff0c 既可以学习linux xff0c 又可以学习stm32单片机开发 xff0c 还可以拓展物联网 人工智能方向技术学习 xff0c 并极大丰富linux应用场景
  • STM32 Linux开发板——教程+视频+项目+硬件

    STM32 Linux开发板 适合入门进阶学习的Linux开发板 xff1a 华清远见FS MP1A开发板 xff08 STM32MP157开发板 xff09 开发板介绍 FS MP1A开发板是华清远见自主研发的一款高品质 高性价比的Lin
  • 编程语言对比 面向对象

    C 43 43 面向对象 java面向对象 python面向对象 java中是public int a 61 10 C 43 43 中是 public int a 61 10 C 43 43 中有拷贝构造
  • 嵌入式linux物联网毕业设计项目智能语音识别基于stm32mp157开发板

    stm32mp157开发板FS MP1A是华清远见自主研发的一款高品质 高性价比的Linux 43 单片机二合一的嵌入式教学级开发板 开发板搭载ST的STM32MP157高性能微处理器 xff0c 集成2个Cortex A7核和1个Cort
  • CMake(一)

    CMake xff08 一 xff09 简述 在之前的文章中介绍了 qmake的使用 相比qmake xff0c CMake稍微复杂一点 xff0c 它使用CMakeList txt文件来定制整个编译流程 同时 xff0c CMake会根据
  • LTE网元功能

    LTE 网元功能 2015 03 30 22 33 31 分类 xff1a NetworkProtocols 举报 字号 订阅 下载LOFTER 我的照片书 主要网元功能 eNodeB Radio Resou
  • [C++] 32位C++程序,计算sizeof的值

    sizeof str 61 6 字符串数组 xff0c 大小是六个字节 加上 39 0 39 共六个 sizeof p 61 4 指针的内容就是一个指向目标地址的整数 xff0c 所以不管指向char int还是其他 xff0c 32位机指
  • 串口打印printf

    串口打印printf 1 配置串口2 添加代码3 使用MDK勾选Mircro LIB 1 配置串口 打开STM32CubeMX xff0c 创建工程 xff0c 配置串口 2 添加代码 重写fputc函数 xff0c 需要包含头文件 inc
  • 22.Ubuntu出现“由于没有公钥,无法验证下列签名”

    由于没有公钥 xff0c 无法验证下列签名 1 无公钥错误2 输入命令导入公钥3 注意 1 无公钥错误 使用sudo apt update时出现以下错误 xff1a 我图中的公钥就是 xff1a 3B4FE6ACC0B21F32 xff08
  • nyist 27 水池数目(dfs搜索)

    xfeff xfeff 水池数目 时间限制 xff1a 3000 ms 内存限制 xff1a 65535 KB 难度 xff1a 4 描述 南阳理工学院校园里有一些小河和一些湖泊 xff0c 现在 xff0c 我们把它们通一看成水池 xff
  • XTUOJ 1176 I Love Military Chess(模拟)

    xfeff xfeff I Love Military Chess Accepted 45 Submit 141Time Limit 1000 MS Memory Limit 65536 KB 题目描述 陆军棋 xff0c 又称陆战棋 xf
  • 数据结构课程设计之一元多项式的计算

    数据结构不是听会的 xff0c 也不是看会的 xff0c 是练会的 xff0c 对于写这么长的代码还是心有余也力不足啊 xff0c 对于指针的一些操作 xff0c 也还是不熟练 xff0c 总出现一些异常错误 xff0c 对于数据结构掌握还