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

来源:互联网 发布:原生js点击隐藏 编辑:程序博客网 时间:2024/06/10 09:30

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

对代码有进行了一下改进,增加了排序的模块;可能还存在着一下小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;}




3 0