数据结构课程设计之一元多项式的计算
来源:互联网 发布:原生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
- 数据结构课程设计之一元多项式的计算
- 数据结构之一元多项式
- 数据结构之一元多项式相加
- 数据结构之一元多项式相乘
- C语言数据结构之一元多项式的求导
- 数据结构实验之一元多项式相加
- 3.数据结构--线性表之一元多项式的加法与乘法运算
- java数据结构之单链表应用之一元多项式求和
- 数据结构课程设计一元多项式的相加和相乘
- C++版数据结构课程设计(一元多项式)
- 数据结构课程设计一元稀疏多项式计算器
- 数据结构之一元多项式运算操作5-(加,减,乘,化简)
- 数据结构(11)线性表之一元多项式表示及相加
- 线性表之一元多项式求和
- 链表之一元多项式加法
- 数据结构-多项式计算(栈实现)
- 数据结构之链表一元多项式的计算
- 数据结构与算法-实验1-多项式的计算:合并同类项、升幂排序、多项式加法、减法、乘法
- 你的变量究竟存储在什么地方 && 全局内存
- 异常的分类
- vs2010查看类的布局
- free 命令详解
- ROS 机器人操作系统
- 数据结构课程设计之一元多项式的计算
- tinyos imote2 平台安装及测试
- no talloc stackframe at ../source3/param/loadparm.c
- 名人名言励志
- 【备忘】Windows的命令行下设置网络代理
- Mysql中操作日期和时间
- 为什么
- Fedora 19/20 编译安装 Epics base 、extension、edm
- Apache和tomcat实现负载均衡和集群