数据结构不是听会的,也不是看会的,是练会的,对于写这么长的代码还是心有余也力不足啊,对于指针的一些操作,也还是不熟练,总出现一些异常错误,对于数据结构掌握还是不够啊,还是要多练,这个课程设计做的还是有点粗糙,还有待改进啊!!
对代码有进行了一下改进,增加了排序的模块;可能还存在着一下小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; }