首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

大家帮帮忙,一道C++/C小题错在哪里,该怎么处理

2012-02-25 
大家帮帮忙,一道C++/C小题错在哪里 一道数据结构题目 关于用链表实现多项式相加并输出显示:本人写的

大家帮帮忙,一道C++/C小题错在哪里
< <一道数据结构题目> > 关于用链表实现多项式相加并输出显示:
本人写的是用户按指数降幂输入多项式各项,并且按照指数降序排列输出多项式;   程序功能要求能够完成两个多项式的相加、相减,并将结果输出显示。
比如两个多项式
a:3*x^5+6*x^2+5
b:4*x^7-6*x^2+x
相加后结果应该输出:4*x^7+3*x^5+x+5
C和VC环境下均是编译没有错误,但是无法运行得到结果,请大家帮帮找一下错误,谢谢。
下面是我的程序:

#include <stdio.h>
#include <malloc.h>
#define   LEN   sizeof(struct   Polynomial)
struct   Polynomial
  {   float   coef;
int   expn;
struct   Polynomial   *   next;
  };
  int   n=0,sum=0;
  int   cmp(int   a,int   b)
  {
  int   flag;
  if(a <b)   flag=-1;
  else   if(a> b)
  flag=1;
  else   flag=0;
  return   flag;
  }
  struct   Polynomial   *   creat(void)
  {
  struct   Polynomial   *   head;
  struct   Polynomial   *   p1,*   p2;
  p1=p2=(struct   Polynomial   *)malloc(LEN);
  scanf( "%f,%d ",&p1-> coef,&p1-> expn);
  head=NULL;
  while(p1-> coef!=0)
  {
  n++;
  if(n==1)   head=p1;
  else   p2-> next=p1;
  p2=p1;
  p1=(struct   Polynomial   *)malloc(LEN);
  scanf( "%f,%d ",&p1-> coef,&p1-> expn);
  }
  p2-> next=NULL;
  return(head);
  }


  struct   Polynomial   *   add(struct   Polynomial   *ah,struct   Polynomial   *bh)
  {
  struct   Polynomial   *pa1,*pa2,*pb1,*pb2,*p0,*head;
  float   sumcoef;
  pa1=ah;
  head=pb1=bh;
  pa2=pa1-> next;
  pb2=pb1-> next;
  while(pa2&&pb2)
    {
 
    switch(cmp(pa2-> expn,pb2-> expn))
{
case   -1:
pb2=pb2-> next;break;
case   0   :sumcoef=pa2-> coef+pb2-> coef;
if(sumcoef!=0.0){
pb2-> coef=sumcoef;
pa2=pa2-> next;
pb2=pb2-> next;
}
else   {pa2=pa2-> next;
pb1-> next=pb2-> next;
pb2=pb2-> next;}
break;
case   1:
p0=pa2-> next;
pa2-> next=pb2;
pb1-> next=pa2;
pa2=p0;
pb2=pb2-> next;
break;
}
    }
  while(pa2   &&   !pb2)
  pb2-> next=pa2;
  return(head);
  }
  void   display(struct   Polynomial   *   head)
  {
  struct   Polynomial   *   p;
  printf( "The   combinated   Polynomial   is:\n ");
  p=head;
  {
  if(p==NULL)
    printf( "0 ");/*如果链表为空,输出0*/
  else
    while(p-> next!=NULL)/*否则,当其下一个结点不为空时*/
      {
        {
          if(p-> expn==0)
            {
if(p-> coef> 0)
printf( "%f+ ",p-> coef);
else
printf( "\b%f+ ",p-> coef);/*否则,退一格(消除前面的+号),输出系数*/
            }
            else
              if(p-> expn==1)/*否则,如果指数为1*/
              {


if(p-> coef> 0)/*如果系数大于0*/
{
if(p-> coef==1)/*如果系数等于1*/
printf( "x+ ");/*输出x+*/
else
printf( "%f*x+ ",p-> coef);/*否则,输出相应的系数*/
}
else
{
if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x+ ");/*退一格,输出-x*/
else
printf( "\b*x+ ",p-> coef);/*否则,退一格,输出相应的系数*/
}
              }
              else/*否则,指数大于1*/
              if(p-> coef> 0)/*如果系数大于0*/
              {
if(p-> coef==1)/*如果系数等于1*/
printf( "x^%d+ ",p-> expn);
else
printf( "%f*x^%d+ ",p-> coef,p-> expn);
              }
              else  
              if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x^%d+ ",p-> expn);
else
printf( "\b%f*x^%d+ ",p-> coef,p-> expn);
        }
        p=p-> next;
      }

  /*下面输出最后一个结点*/
        {
          if(p-> expn==0)
            {
if(p-> coef> 0)
printf( "%f ",p-> coef);
else
printf( "\b%f ",p-> coef);/*否则,退一格(消除前面的+号),输出系数*/
            }
            else
              if(p-> expn==1)/*否则,如果指数为1*/
              {
if(p-> coef> 0)/*如果系数大于0*/
{
if(p-> coef==1)/*如果系数等于1*/
printf( "x ");/*输出x*/
else
printf( "%f*x ",p-> coef);/*否则,输出相应的系数*/
}
else
{
if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x ");/*退一格,输出-x*/
else
printf( "\b*x ",p-> coef);/*否则,退一格,输出相应的系数*/
}
              }
              else/*否则,指数大于1*/
              if(p-> coef> 0)/*如果系数大于0*/
              {
if(p-> coef==1)/*如果系数等于1*/
printf( "x^%d ",p-> expn);
else
printf( "%f*x^%d ",p-> coef,p-> expn);
              }
              else  
              if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x^%d ",p-> expn);
else
printf( "\b%f*x^%d ",p-> coef,p-> expn);
        }
}
}
  void   main()
  {
    struct   Polynomial   *pahead,*pbhead,*abhead;

    printf( "Input   list   Pa:\n ");
    pahead=creat();
    sum=sum+n;
    printf( "Input   list   Pb:\n ");
    pbhead=creat();
    sum=sum+n;
    abhead=add(pahead,pbhead);
    display(abhead);
    }


[解决办法]
今天闲的无聊,帮你看了以下,程序错误的地方很多,如果真要改你的整个设计都要改了。
为了保持你的原意,这里只修改了主要部分:
顺便说一下,你以前的程序有严重的内存泄露,一个是在creat()中,每调用一次creat()就会有一个节点的内存泄露;还有在add()中,在case 0:的情况下也会发生一个或两个节点的内存泄露,显然在这种情况下当两个项指数相等时两个项应该合并,这意味着其中一个节点的内存必须释放掉;又当两个项指数和系数都相等时两个项应该消去,这意味着两个节点的内存都必须释放掉。display()写的太复杂了,不过好像没大的问题,所以这个函数没有帮你改


--------------------------------------------
#include <stdio.h>
#include <malloc.h>
#include <math.h>

#define BOOL int
#define TRUE 1
#define FALSE 0
#define LEN sizeof(struct tagPolynomial)

typedef struct tagPolynomial
{
float coef;
int expn;
struct tagPolynomial *next;
}Polynomial;

int cmp(int a, int b)
{
if (a > b)
return 1;
if (a < b)
return -1;
return 0;
}

Polynomial* creat()
{
Polynomial *head = (Polynomial*)malloc(LEN);
Polynomial *p1, *p2;
BOOL firstNode = TRUE;
float coef;
int expn;

while(TRUE)
{
scanf( "%f,%d ", &coef, &expn);
if (coef == 0.0)
break;

p1 = (Polynomial*)malloc(LEN);
p1-> coef = coef;
p1-> expn = expn;
if(firstNode) {
head-> next = p1;
firstNode = FALSE;
} else {
p2-> next = p1;
}
p2 = p1;
}
p2-> next = NULL;
return head;
}

Polynomial* add(Polynomial *ah, Polynomial *bh)
{
Polynomial *pa, *pb_prev, *pb, *temp, *head;
float sumcoef;
pa = ah-> next;
pb = bh-> next;
head = pb_prev = bh;
while(pa && pb)
{

switch(cmp(pa-> expn, pb-> expn))
{
case -1:
pb_prev = pb;
pb = pb-> next;
break;
case 0 :
sumcoef = pa-> coef + pb-> coef;
if(abs(sumcoef) < 0.000001) {//判断浮点数是否为0最好别直接判断
pb_prev-> next = pb-> next;
temp = pb;
pb = pb-> next;
free(temp);
} else {
pb-> coef = sumcoef;
}
temp = pa;
pa = pa-> next;
free(temp);
break;
case 1:
temp = pa-> next;
pa-> next = pb;
pb_prev-> next = pa;
pb_prev = pa;
pa = temp;
break;
}
}
if(!pb)
pb_prev-> next = pa;
return head;
}


void display(Polynomial *head)
{
Polynomial * p;
printf( "The combinated Polynomial is:\n ");
p = head-> next;
{
if(p==NULL)
printf( "0 ");/*如果链表为空,输出0*/
else
while(p-> next!=NULL)/*否则,当其下一个结点不为空时*/
{
{
if(p-> expn==0)
{
if(p-> coef> 0)
printf( "%.2f+ ",p-> coef);
else
printf( "\b%.2f+ ",p-> coef);/*否则,退一格(消除前面的+号),输出系数*/
}
else
if(p-> expn==1)/*否则,如果指数为1*/
{
if(p-> coef> 0)/*如果系数大于0*/
{
if(p-> coef==1)/*如果系数等于1*/
printf( "x+ ");/*输出x+*/
else
printf( "%.2f*x+ ",p-> coef);/*否则,输出相应的系数*/
}
else
{
if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x+ ");/*退一格,输出-x*/
else
printf( "\b*x+ ",p-> coef);/*否则,退一格,输出相应的系数*/
}
}
else/*否则,指数大于1*/
if(p-> coef> 0)/*如果系数大于0*/
{
if(p-> coef==1)/*如果系数等于1*/
printf( "x^%d+ ",p-> expn);
else
printf( "%.2f*x^%d+ ",p-> coef,p-> expn);
}
else
if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x^%d+ ",p-> expn);
else
printf( "\b%.2f*x^%d+ ",p-> coef,p-> expn);


}
p=p-> next;
}

/*下面输出最后一个结点*/
{
if(p-> expn==0)
{
if(p-> coef> 0)
printf( "%.2f ",p-> coef);
else
printf( "\b%.2f ",p-> coef);/*否则,退一格(消除前面的+号),输出系数*/
}
else
if(p-> expn==1)/*否则,如果指数为1*/
{
if(p-> coef> 0)/*如果系数大于0*/
{
if(p-> coef==1)/*如果系数等于1*/
printf( "x ");/*输出x*/
else
printf( "%.2f*x ",p-> coef);/*否则,输出相应的系数*/
}
else
{
if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x ");/*退一格,输出-x*/
else
printf( "\b*x ",p-> coef);/*否则,退一格,输出相应的系数*/
}
}
else/*否则,指数大于1*/
if(p-> coef> 0)/*如果系数大于0*/
{
if(p-> coef==1)/*如果系数等于1*/
printf( "x^%d ",p-> expn);
else
printf( "%.2f*x^%d ",p-> coef,p-> expn);
}
else
if(p-> coef==-1)/*否则,如果系数等于-1*/
printf( "\b-x^%d ",p-> expn);
else
printf( "\b%.2f*x^%d ",p-> coef,p-> expn);
}
}
}

int main()
{
Polynomial *pahead, *pbhead, *abhead;

printf( "Input list Pa:\n ");
pahead = creat();
display(pahead);
printf( "\nInput list Pb:\n ");
pbhead = creat();
display(pbhead);
abhead = add(pahead,pbhead);
display(abhead);

return 0;
}

热点排行