当前位置: 代码迷 >> C语言 >> [原创]多页式相加
  详细解决方案

[原创]多页式相加

热度:376   发布时间:2004-11-07 11:48:00.0
[原创]多页式相加

#include<stdlib.h> typedef int datatype;

typedef struct node {float coef; /*多项式系数*/ int expn; /*多项式指数*/ struct node *next; }listnode;

typedef listnode *linklist;

/*---------创建带头结点的多项式链表--------*/ linklist creat() { linklist head,s,p,pre,r; float coef; int expn; head=(linklist)malloc(sizeof(listnode)); /*表头结点*/ head->next=NULL; scanf("%f",&coef); scanf("%d",&expn); while (coef!=0) /*用0作为结束标记*/ {s=(linklist)malloc(sizeof(listnode)); /*生成新结点*/ s->coef=coef; s->expn=expn; s->next=NULL; pre=head; /*插入到有序的多项式链表中去*/ p=head->next; while (p && p->expn <expn) { pre=p; p=p->next; } s->next=p; pre->next=s; scanf("%f",&coef); /*读下一项*/ scanf("%d",&expn); } return head; }

void print(linklist head) /*输出多项式链表*/ { linklist p; p=head->next; while (p) { printf("%f",p->coef); printf("%4d ",p->expn); p=p->next; } }

/*-------------多项式相加----------------*/ linklist add(linklist a,linklist b) { linklist p,q,head;

p=head=b; b=b->next; q=a->next; a->next=NULL; free(a); a=q; while(a&&p) { if(b->expn<a->expn) { p=b; b=b->next; } else if(b->expn==a->expn) { if((b->coef+a->coef)!=0) { b->coef=b->coef+a->coef; q=a->next; a->next=NULL; free(a); a=q; p=b; b=b->next; } else{ q=a->next; free(a); a=q; p->next=b->next; free(b); b=p->next; }

} else { q=a->next; p->next=a; a->next=b; p=a; a=q; } }

if(!(b->next)) b->next=a; return head; }

/*----主程序------*/ main() { linklist a,b,c; a=creat(); /*创建多项式链表a*/ print(a); printf("\n"); b=creat(); /*创建多项式链表b*/ print(b); printf("\n"); c=add(a,b); /* 计算多项式a+b */ print(c); }

[此贴子已经被作者于2004-11-07 12:07:21编辑过]

搜索更多相关的解决方案: 相加  

----------------解决方案--------------------------------------------------------

这好!


----------------解决方案--------------------------------------------------------

相乘的话,应该如何实现呢??


----------------解决方案--------------------------------------------------------

我这个也是多项式运算(加减)

#include<stdio.h> /*********************************************************************************/ /* 定义多项式的链表的节点类型 */ typedef struct pnode { float coef; /*系数*/ int exp; /*指数*/ struct pnode *next; } polynode;

char s; /*判断字符*/

/***********************************************************************************/ /* 多项式输入函数 */ polynode *creat() {float coef1; int exp1; polynode *s,*head,*q; head=(polynode*)malloc(sizeof(polynode)); head->coef=0; head->exp=-1; /*设多项式链表的头节点的为coef=0,exp=-1*/ q=head; scanf("%f",&coef1);scanf("%d",&exp1); /*输入多项式的头一项*/ printf("next\n"); while(coef1!=0) /*当再次输入coef1=0时,表示多项式输入结束*/ { s=(polynode*)malloc(sizeof(polynode)); /*生成多项式节点*/ s->coef=coef1; /*输入的系数和指数赋值给 s 节点*/ s->exp=exp1; q->next=s; /* q的下一节点是 s 节点*/ q=s; /*使指针q 总是指向最后一个节点*/ q->next=head; /*形成循环链表*/ scanf("%f",&coef1);scanf("%d",&exp1);printf("next\n"); /*输入多项式的系数和指数*/ } return head; /*返回头节点*/ } /************************************************************************************/

/************************************************************************************/ /* 进行多项式的加减运算 */ polynode *POLY(A,B) /*A,B是两个多项式,函数返回A,B运算后的多项式头节点*/ polynode *A,*B; { int i,j,k; polynode *ptr,*q,*q1,*q2; float x; q1=A;q2=B; q=(polynode*)malloc(sizeof(polynode)); /*生成运算后多项式的头节点*/ q->coef=0; /*将多项式链表头节点 赋值为 coef=,exp=-1*/ q->exp=-1;q->next=q; ptr=q; /*ptr 指向多项式头节点*/ q1=q1->next; /*q1 指向A的头节点*/ q2=q2->next; /*q2指向B的头节点*/ while((q1!=A)&&(q2!=B)) { /*从低指数到高指数逐项运算*/ if (q1->exp==q2->exp) /*指数相同的项*/ { if(s=='+') x=q1->coef+q2->coef; /*如果是加法运算,系数相加*/ if(s=='-') x=q1->coef-q2->coef; /*如果是减法运算,系数相减*/ if(x!=0) /*求得的系数非零*/ {q->next=(polynode*)malloc(sizeof(polynode)); /*生成多项式的节点*/ q=q->next; q->coef=x;q->exp=q1->exp; } q1=q1->next; /*q1 指向A的下一个节点*/ q2=q2->next; /*q2 指向B的下一个节点*/ } else { q->next =(polynode*)malloc(sizeof(polynode)); /*生成多项式的节点*/ q=q->next; if (q1->exp > q2->exp) /*A多项式当前项的指数是否大于B的*/ { if(s=='+') q->coef=q2->coef; /*如果是加法运算,B多项式当前项系数直接给C多项式*/ if(s=='-') q->coef=-q2->coef; /*如果是减法运算,B多项式当前项系数取反直接给C多项式*/ q->exp=q2->exp; q2=q2->next; /*q2指向B多项式的下一项*/ } else /*B多项式当前项的指数大于A的*/ { q->coef=q1->coef; /*A多项式当前项的值复制到 运算后的多项式*/ q->exp=q1->exp; q1=q1->next; /*q1指向 A多项式的下一项*/ } } } /*A,B中有一个多项式处理完*/ while(q1!=A) /*A多项式中剩余项复制到运算后多项式中*/ { q->next=(polynode*)malloc(sizeof(polynode)); q=q->next; q->coef=q1->coef; q->exp=q1->exp; q1=q1->next; }

while(q2!=B) /*B多项式中剩余项复制到运算后多项式中*/ { q->next=(polynode*)malloc(sizeof(polynode)); q=q->next; if(s=='+') q->coef=q2->coef; /*如果是加法运算,B多项式当前项系数直接给C多项式*/ if(s=='-') q->coef=0-(q2->coef); /*如果是减法运算,B多项式当前项系数取反直接给C多项式*/ q->exp=q2->exp; q2=q2->next; } q->next=ptr; /*形成循环链表*/ return ptr; /*返回运算后链表的头节点*/ } /***********************************************************************/

/***********************************************************************/ /* 打印多项式运算的结果 */ void printc(c) polynode *c; {polynode *q; float coef3; int exp3; int n=1; q=c->next; if(q==c) {printf("0\n");}; while(q!=c) /*当打印到最后一个节点结束后循环结束*/ {coef3=q->coef; exp3=q->exp; if(n==1) printf("%f*X(%d)",coef3,exp3); /*第一个多项式节点直接打印*/ else { if(coef3>0) printf("+%f*X(%d)",coef3,exp3); /*后面的多项式节点系数如果是正的,打印时前面加+号*/ else printf("%f*X(%d)",coef3,exp3); /*后面的多项式节点系数如果是负的,直接打印时*/ } q=q->next; /*q指向下一个节点*/ n=0; } printf("\n"); } /************************************************************************/

/************************************************************************/ /* 主函数 */ main() { polynode *A,*B,*C; void printc(polynode *c); polynode *creatA(); polynode *creatB(); polynode *POLYADD(polynode *A,polynode *B); polynode *POLYSUB(polynode *A,polynode *B); /*函数说明*/ printf("\ns= 'A' ,please input poly A\n"); /*输入A时,提示输入多项式A*/ printf("\ns= 'B' ,please input poly B\n"); /*输入B时,提示输入多项式B*/ printf("\ns='+' ,doing poly add\n"); /*输入 + 时,提示进行 多项式加运算 */ printf("\ns='-' ,doing poly sub\n"); /*输入 - 时,提示进行 多项式加运算 */ printf("\ns='O' OR 'o' ,stop the program \n "); /*输入o或O时,结束程序*/ printf("\nplease input s:"); /*提示输入程序实行内容*/ s=getchar(); while(!((s=='O')||(s=='o'))) /*当输入o或O时,跳出循环*/ { switch(s) {case'A': {printf("\nplease input poly A :\n"); A=creat();printf("\nover input A\n");printf("\nplease input s:");break;} case'B': {printf("\nplease input poly B :\n"); B=creat();printf("\nover input B\n");printf("\nplease input s:");break;} case'+': {printf("\ndoing poly add \n"); printf("\nthe result is :\n\n"); C=POLY(A,B); printc(C); printf("\n finish add\n"); printf("\nplease input s:"); break; } case'-': {printf("\ndoing poly sub\n"); printf("\nthe result is :\n\n"); C=POLY(A,B); printc(C); printf("\n finish sub\n"); printf("\nplease input s:"); break; } default: printf("\nerror,please input the right character \n"); printf("\nplease input s:"); } while(getchar()!='\n'); s=getchar(); }; } /***********************************************************************************/


----------------解决方案--------------------------------------------------------
呵呵,
看上去,你的更像程序,但这么长有优势吗?还有小小,不好意思,马上就要考试了,没时间写了
----------------解决方案--------------------------------------------------------
  相关解决方案