您的当前位置:首页正文

一元稀疏多项式

2021-03-19 来源:好走旅游网


三、详细设计

#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->expnexpn){ //查找插入位置 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; } } }

linklist creat(linklist head,int xiangshu) { int i; linklist p;

p=head=(linklist)malloc(sizeof(struct lnode)); head->next=NULL; for(i=0;ip=(linklist)malloc(sizeof(lnode)); printf(\"请输入第%d项的系数和次数:\ scanf(\"%f %d\ insert(p,head); } return head; }

int compare(linklist a,linklist b) { if(a&&b) {

if(!b||a->expn>b->expn) return 1; else

if(!a||a->expnexpn) return -1; else return 0;

} 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多项式,然后根据程序给出的提示进行选择,最后达到多项式计算的目的。

六、测试结果:

因篇幅问题不能全部显示,请点此查看更多更全内容