数据结构不是听会的,也不是看会的,是练会的,对于写这么长的代码还是心有余也力不足啊,对于指针的一些操作,也还是不熟练,总出现一些异常错误,对于数据结构掌握还是不够啊,还是要多练,这个课程设计做的还是有点粗糙,还有待改进啊!!
对代码有进行了一下改进,增加了排序的模块;可能还存在着一下小bug,发现了再更新:减法还可以写的更简便一点。
#include
#include
#include
#include /*屏幕操作函数库*/
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<<"该一元多项式为空!"<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^"<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<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.coefdata.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.coefdata.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;
}