三、详细设计
#include \"stdio.h\" #include \"malloc.h\" typedef struct lnode {
float coef; //系数 int expn; //指数 struct lnode *next; }*linklist,lnode;
void insert(linklist p,linklist h){
if(p->coef==0) free(p); //系数为0的话释放结点 else{
linklist q1,q2; q1=h;q2=h->next;
while(q2&&p->expn 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; } } } linklist creat(linklist head,int xiangshu) { int i; linklist p; p=head=(linklist)malloc(sizeof(struct lnode)); head->next=NULL; for(i=0;i int compare(linklist a,linklist b) { if(a&&b) { if(!b||a->expn>b->expn) return 1; else if(!a||a->expn } else if(!a&&b) return -1; else return 1; } linklist add(linklist pa,linklist pb){//求解并建立多项式a+b,返回其头指针 linklist qa=pa->next; linklist qb=pb->next; linklist headc,hc,qc; hc=(linklist)malloc(sizeof(struct lnode));//建立头结点 hc->next=NULL; headc=hc; while(qa||qb){ qc=(linklist)malloc(sizeof(struct lnode)); 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 linklist subtract(linklist pa,linklist pb) { linklist pd; linklist p=pb->next; linklist h=pb; while(p) { pb->coef*=-1; p=p->next; } pd=add(pa,pb); for(p=h->next;p;p=p->next) pb->coef*=-1; return pd; } void print(linklist p){ linklist q=p->next; int flag=1;//项数计数器 if(!q) { //若多项式为空,输出0 putchar('0'); printf(\"\\n\"); return; } while (q){ if(q->coef>0&&flag!=1) printf(\"+\"); //系数大于0且不是第一项 if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况 printf(\"%g\ if(q->expn==1) printf(\"X\"); else if(q->expn) printf(\"X^%d\ } else{ if(q->coef==1){ if(!q->expn) printf(\"1\"); else if(q->expn==1) printf(\"X\"); else printf(\"X^%d\ } if(q->coef==-1){ if(!q->expn) printf(\"-1\"); else if(q->expn==1) printf(\"-X\"); else printf(\"-X^%d\ } } q=q->next; flag++; }//while printf(\"\\n\"); }//PrintPolyn void destroy(linklist pp) { linklist p1=pp->next; linklist p2=p1->next; while(p1->next) { free(p1); p1=p2; p2=p2->next; } } void main() { int m,n,choose=0; linklist pa=0,pb=0,pc,pd,pe,pf; printf(\"请输入多项式a的项数:\"); scanf(\"%d\ pa=creat(pa,m); printf(\"请输入多项式b的项数:\"); scanf(\"%d\ pb=creat(pb,n); printf(\"*************************************\\n\"); printf(\"\1.输出多项式a和b\\n\2.建立多项式a+b\\n\3.建立多项式a-b\\n\4.停止\\n\"); printf(\"*************************************\\n\"); for(;;choose=0) { printf(\"执行操作:\"); scanf(\"%d\ if(choose==1) { printf(\"多项式a:\"); print(pa); printf(\"多项式b:\"); print(pb); continue; } if(choose==2) { pc=add(pa,pb); printf(\"a+b:\");print(pc); destroy(pc); continue; } if(choose==3) { pd=subtract(pa,pb); printf(\"a-b:\");print(pd); destroy(pd); continue; } if(choose==4) break; } } 四、调试分析 1、由于对链表的头节点没能进行很好的处理,开始时输出的多项式有很多错误。 2、对算法没有事先设计好,导致算法紊乱无法输出结果,并且出现多次比较大的错误。 3、运用有序链表对多项式进行运算,加强了对链表的熟练操作。 五、用户手册: 首先需要输入a和b的两个多项式,第一次输入的是a多项式,第二次输入的是b多项式,然后根据程序给出的提示进行选择,最后达到多项式计算的目的。 六、测试结果: 因篇幅问题不能全部显示,请点此查看更多更全内容