下面的程序运行会出错,但是调试没有错。为什么?

phearfly 2009-10-27 08:09:24
二项式的加法



#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");

}


...全文
68 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
hlwang_1984 2009-10-27
  • 打赏
  • 举报
回复
你的主要错误在void Addpolyn(mulpolyn *Pa ,mulpolyn *Pb) 函数中,我对这个函数做了一点修改,修改代码如下:

#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();
mulpolyn* 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;
}


mulpolyn* Addpolyn(mulpolyn *Pa ,mulpolyn *Pb)
{
float sum;
mulpolyn *head,*pcur, *qa = NULL,*qb = NULL,*a = NULL,*b = NULL;

qa = Gethead(Pa);
qb = Gethead(Pb);
pcur=NULL;
head=NULL;
while((qa!=NULL)&&(qb!=NULL))//qa和qb均非空
{

switch(cmp(qa->exp,qb->exp))
{

case -1://多项式中PA中当前结点的指数最小
if(pcur==NULL)
{
head=qb;
pcur=qb;
qb=qb->next;
}
else
{
pcur->next=qb;
pcur=pcur->next;
qb=qb->next;
}
//qa = qa->next;
break;

case 0://两者的指数值相等
sum=qa->coef+qb->coef;
Setcurelem(qa,sum);
mulpolyn* temp;
temp=qb;
qb=qb->next;
free(qb);
if(pcur==NULL)
{
head=qa;
pcur=qa;
qa=qa->next;
}
else
{
pcur->next=qa;
pcur=pcur->next;
qa=qa->next;
}

//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中当前结点的指数值最小
if(pcur==NULL)
{
head=qa;
pcur=qa;
qa=qa->next;
}
else
{
pcur->next=qa;
pcur=pcur->next;
qa=qa->next;
}

//qb = qb->next;
break;
}
}


if(qb!=NULL)
Append(Pa,qb);//链接Pb中剩余的结点
}
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);
}

}

int 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);
Pa=Addpolyn(Pa,Pb);
printf("\n\n\n\n多项式的和为F3(x)=F1(x)+F2(x)=");
putout(Pa);
printf("\n");
return 0;
}

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧