我这个也是多项式运算(加减)
#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();
};
}
/***********************************************************************************/