下面的程序运行会出错,但是调试没有错。为什么?
二项式的加法
#include<stdio.h>
#include"malloc.h"
#define NULL 0
#define OK 1
#define ERROR 0
typedef struct mulpolyn
{
float coef;
int exp;
struct mulpolyn *next;
}mulpolyn;
mulpolyn *Gethead(mulpolyn *a);
int cmp(int a,int b);
void Append(mulpolyn *a,mulpolyn *b);
mulpolyn *creatpolyn();
void Addpolyn(mulpolyn *Pa ,mulpolyn *Pb);
void putout(mulpolyn *a);
void Setcurelem(mulpolyn *a,float e);
mulpolyn *Gethead(mulpolyn *a)//取链表的头结点
{
mulpolyn *head = NULL;
mulpolyn *q = NULL;
q = (mulpolyn *)malloc(sizeof(mulpolyn));
q = a;
if(q==NULL)
{
printf("the memory is less!!");
}
if(head==NULL)
{
head = q;
}
else
{
q->next=head;
head=q;
}
return head;
}
int cmp(int a,int b)//比较指数值大小
{
if(a>b)
return 1;
else
if(a<b)
return -1;
else return 0;
}
void Append(mulpolyn *a,mulpolyn *b)//
{
mulpolyn *p = NULL;
p = (mulpolyn *)malloc(sizeof(mulpolyn));
p = a;
for(;p->next!=NULL;p++);
p->next = b;
a = p;
}
mulpolyn *creatpolyn()//产生多项式链表
{
mulpolyn *head, *r, *s;
float n;
int m;
head= ( mulpolyn *)malloc(sizeof( mulpolyn));//建立一个头结点
printf("\n\n***请按照指数值由小到大的次序输入!***\n\n");
printf("输入多项式的第一项的系数:");
scanf("%f",&n);
printf("输入多项式的第一项的指数值(指数值为0结束):");
scanf("%d",&m);
r = head;
int x = 2;
while(m)
{
s = (mulpolyn *)malloc(sizeof(mulpolyn));
s->coef = n;
s->exp = m;
r->next = s;//把s链接到r的后面
r = s;
printf("输入多项式的第%x项的系数:",x);
scanf("%f",&n);
printf("输入多项式的第%x项的指数值(指数值为0结束):",x);
scanf("%d",&m);
x++;
}
r->next = NULL;
head = head->next;
return head;
}
void Setcurelem(mulpolyn *a,float e)
{
a->coef = e;
}
void Addpolyn(mulpolyn *Pa ,mulpolyn *Pb)
{
//多项式加法:Pa = Pa + Pb,利用两个多项式的结点构成"和多项式"。
float sum;
mulpolyn *qa = NULL,*qb = NULL,*a = NULL,*b = NULL;
qa = Gethead(Pa);
qb = Gethead(Pb);
//qa和qb分别指向Pa和Pb中当前结点
while((qa!=NULL)&&(qb!=NULL))//qa和qb均非空
{
switch(cmp(qa->exp,qb->exp))
{
case -1://多项式中PA中当前结点的指数最小
qa = qa->next;
break;
case 0://两者的指数值相等
sum = qa->coef + qb->coef;
if(sum!=0)//修改多项式PA中当前结点的系数值
{
Setcurelem(qa,sum);
}
else//删除多项式PA中当前结点
{
free(qa);
}
qa = qa->next;
qb = qb->next;
break;
case 1://多项式PB中当前结点的指数值最小
qb = qb->next;
break;
}
}
if(qb!=NULL)
Append(Pa,qb);//链接Pb中剩余的结点
// free(qb);
}
void putout(mulpolyn *a)
{
mulpolyn *p = NULL;
p = a;
printf("%.2fx^%d",p->coef,p->exp);
for(p = p->next;p!=NULL;p = p->next)
{
printf(" + %.2fx^%d",p->coef,p->exp);
}
}
void main()
{
printf("\t\t *||****************************||* \n");
printf("\t\t ***|| ||*** \n");
printf("\t\t *****|| 一元二次多项式的求和运算 ||*****\n");
printf("\t\t ***|| ||*** \n");
printf("\t\t *||****************************||* \n\n");
printf("\n\t\t\t\t\t ---- 2008211130 林晓琳 \n");
mulpolyn *Pa,*Pb,*head_a,*head_b;
printf("\n请输入第一个多项式:");
Pa = creatpolyn();
head_a = Gethead(Pa);
printf("\n第一个多项式F1(x)=");
putout(head_a);
printf("\n\n\n\n请输入第二个多项式:");
Pb = creatpolyn();
head_b = Gethead(Pb);
printf("\n第二个多项式为F2(x)=:");
putout(head_b);
Addpolyn(Pa,Pb);
printf("\n\n\n\n多项式的和为F3(x)=F1(x)+F2(x)=");
putout(Pa);
printf("\n");
}