标题:求大神解决一小问题!明早课题答辩突然发现的小毛病!在线等。急求!
只看楼主
底层代码狗
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-11-29
结帖率:0
已结贴  问题点数:20 回复次数:1 
求大神解决一小问题!明早课题答辩突然发现的小毛病!在线等。急求!
在进行多项式相加减时,项数出了问题,始终为0.我输出的先是多项式的项数  然后是整个多项式

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

typedef struct Polynomial{
 float coef;  //系数
 int expn;    //指数
 struct Polynomial *next;
}*Polyn,Polynomial; //Polyn为结点指针类型
void Insert(Polyn p,Polyn h){
 if(p->coef==0) free(p); //系数为0的话释放结点
 else{
 Polyn q1,q2;
 q1=h;q2=h->next;//h为头结点
 while(q2&&p->expn<q2->expn){ //查找插入位置
 q1=q2;
 q2=q2->next;
 }
 if(q2&&p->expn==q2->expn){ //将指数相同相合并
 q2->coef+=p->coef;
 free(p);
 if(!q2->coef){ //系数为0的话释放结点
 q1->next=q2->next;
 free(q2);
 }
 }
 else{ //指数为新时将结点插入
 p->next=q2;
 q1->next=p;
 }
 }
}//Insert
Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式
 int i;
 Polyn p;

 p=head=(Polyn)malloc(sizeof(struct Polynomial));
 head->next=NULL;//首先创立一元多项式应为空
 for(i=0;i<m;i++){
 p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
 head->expn=m;
 printf("请输入第%d项的系数与指数:",i+1);
 scanf("%f %d",&p->coef,&p->expn);
 getchar();
 Insert(p,head); //调用Insert函数插入结点
 }
 return head;
}//CreatePolyn
void DestroyPolyn(Polyn p){//销毁多项式p
 Polyn q1,q2;
 q1=p->next;
 q2=q1->next;
 while(q1->next){
 free(q1);
 q1=q2;//指针后移
 q2=q2->next;
 }
}
void PrintPolyn(Polyn head){
 Polyn q=head->next;
 printf ("%d ",head->expn);//头指针的指数是多项式的项数
 int flag=1;//项数计数器
 if(!q) { //若多项式为空,输出0
 putchar('0');
 printf("\n");
 return;
 }
 while (q){
 if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
 if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况
 printf("%g",q->coef);
 if(q->expn==1) putchar('X');
 else if(q->expn) printf("X^%d",q->expn);
 }
 else{
 if(q->coef==1){
 if(!q->expn) putchar('1');
 else if(q->expn==1) putchar('X');
 else printf("X^%d",q->expn);
 }
 if(q->coef==-1){
 if(!q->expn) printf("-1");
 else if(q->expn==1) printf("-X");
 else printf("-X^%d",q->expn);
 }
 }
 q=q->next;
 flag++;
 }//while
 printf("\n");
}//PrintPolyn
int compare(Polyn a,Polyn b){
 if(a&&b){
 if(!b||a->expn>b->expn) return 1;
 else if(!a||a->expn<b->expn) return -1;
 else return 0;
 }
 else if(!a&&b) return -1;//a多项式已空,但b多项式非空
 else return 1;//b多项式已空,但a多项式非空
}//compare
Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
 Polyn qa=pa->next;
 Polyn qb=pb->next;
 Polyn headc,hc,qc;
 hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
 hc->next=NULL;
 headc=hc;
 while(qa||qb){
 qc=(Polyn)malloc(sizeof(struct Polynomial));
 switch(compare(qa,qb)){
 case 1:
 {
 qc->coef=qa->coef;
 qc->expn=qa->expn;
 qa=qa->next;
 break;
 }
 case 0:
 {
 qc->coef=qa->coef+qb->coef;
 qc->expn=qa->expn;
 qa=qa->next;
 qb=qb->next;
 break;
 }
 case -1:
 {
 qc->coef=qb->coef;
 qc->expn=qb->expn;
 qb=qb->next;
 break;
 }
 }//switch
 if(qc->coef!=0){
 qc->next=hc->next;
 hc->next=qc;
 hc=qc;
 }
 else free(qc);//当相加系数为0时,释放该结点
 }//while
 return headc;
}//AddPolyn
Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a-b,返回其头指针
 Polyn h=pb;
 Polyn p=pb->next;
 Polyn pd;
 while(p){ //将pb的系数取反
 p->coef*=-1;
 p=p->next;
 }
 pd=AddPolyn(pa,h);
 for(p=h->next;p;p=p->next) //恢复pb的系数
 p->coef*=-1;
 return pd;
}//SubtractPolyn
float ValuePolyn(Polyn head,float x){//输入x值,计算并返回多项式的值
 Polyn p;
 int i;
 float sum=0,t;
 for(p=head->next;p;p=p->next){
 t=1;
 for(i=p->expn;i!=0;){
 if(i<0){t/=x;i++;}//指数小于0,进行除法
 else{t*=x;i--;}//指数大于0,进行乘法
 }
 sum+=p->coef*t;
 }
 return sum;
}//ValuePolyn

int main(){
 int m,n,flag=0;
 float x;
 Polyn pa=0,pb=0,pc,pd;//定义各式的头指针,pa与pb在使用前付初值NULL
 printf("请输入a的项数:");
 scanf("%d",&m);
 pa=CreatePolyn(pa,m);//建立多项式a
 printf("请输入b的项数:");
 scanf("%d",&n);
 pb=CreatePolyn(pb,n);//建立多项式b
 //输出菜单
 printf("   *******************************************************\n");
    printf("   *                   多项式操作程序                    *\n");
 printf("   *                                                     *\n");
 printf("   *       1:输出多项式a和b          2:建立多项式a+b     *\n");
 printf("   *                                                     *\n");
 printf("   *       3: 建立多项式a-b          4:计算多项式a在x处的值*\n");
 printf("   *                                                     *\n");
 printf("   *       5: 退出                                       *\n");
printf("   *                                                     *\n");
    printf("   *******************************************************\n");

 for(;;flag=0){
 printf("执行操作");
 scanf("%d",&flag);
 if(flag==1){
 printf("多项式a:");PrintPolyn(pa);
 printf("多项式b:");PrintPolyn(pb);continue;
 }
 if(flag==2){
 pc=AddPolyn(pa,pb);
 printf("多项式a+b:");PrintPolyn(pc);
 DestroyPolyn(pc);continue;
 }
 if(flag==3){
 pd=SubtractPolyn(pa,pb);
 printf("多项式a-b:");PrintPolyn(pd);
 DestroyPolyn(pd);continue;
 }
 if(flag==4){
 printf("输入x的值:x=");
 scanf("%f",&x);
 printf("多项式a的值%g\n",ValuePolyn(pa,x));continue;
 }
 if(flag==5) break;
 if(flag<1||flag>5) printf("Error!!!\n");continue;
 }//for
 DestroyPolyn(pa);
 DestroyPolyn(pb);
 return 0;
}
搜索更多相关主题的帖子: 多项式 next printf flag pb 
2018-11-29 18:30
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
得分:20 
答辩估计是跟不上了!
2年后,你看到你的代码,不知道想不想一句句读下去!

我这两天有事,没怎么来论坛,其他大神没回复,估计是跟我一样的想法

看起来太累!

咱打代码的时候,打缩进和打空格,有那么费劲吗?

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-30 10:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-491676-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.087550 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved