#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
typedef struct _POLYNODE{
float coef;//系数
int exp;//指数
struct _POLYNODE *next;
}polynode,*polyptr;
void createPoly(polynode **P, char ch[]);//建立多项式链表
polyptr polyAdd(polynode *A,polynode *B);//多项式加
polyptr polyMinus(polynode *A,polynode *B);//减
polyptr polyMulti(polynode *A,polynode *B);//乘
polyptr polyDiv(polynode *A,polynode *B);//除
void order(polynode **P);//排序
void display(polynode *P);//展示多项式
void destroy(polynode **P);//销毁多项式
void menu();//命令菜单
int isPut(char ch[]);
//菜单
void menu(){
printf("1.输入多项式./n"
"2.多项式相加./n"
"3.多项式相减./n"
"4.多项式相乘./n"
"5.多项式相除./n"
"6.显示多项式./n"
"7.销毁多项式./n"
"8.退出./n");
}
//判断菜单选择
int IsChoice(int choice){
if(0 < choice && 9 > choice)
return 1;
else
return 0;
}
int isPut(char ch[])
{
int i,j = 1;
for(i = 0; ch[i] != '/0'; i++)
{
if(0 == j && '^' == ch[i])
return 0;
if('^' == ch[i] && 1 == j)
j = 0;
if(('+' ==ch[i] || '-' == ch[i] || '*' == ch[i] || '/' ==
ch[i]) && 0 == j)
j = 1;
if('x' != ch[i] && 'X' != ch[i] && '^' != ch[i] && '+' !=
ch[i] && '-' != ch[i] && '*' != ch[i] && '/' != ch[i] && !
isdigit(ch[i]))
return 0;
else
{
if('+' ==ch[0] || '*' == ch[0] || '/' == ch[0] || '^' ==
ch[0])
return 0;
if('/0' == ch[i+1] && ('+' ==ch[0] || '*' == ch[0] || '/'
== ch[0] || '^' == ch[0]))
return 0;
// 上面是判断字符串首尾是否合格 下面是中间部分
if(0 != i && ch[i+1] != '/0' )
{
if(('X' == ch[i] || 'x' == ch[i]) && !isdigit(ch[i-1])
&& '+' != ch[i-1] && '-' != ch[i-1] && '*' != ch[i-1] && '/'
!= ch[i-1])
return 0;
if(('X' == ch[i] || 'x' == ch[i]) && '^' != ch[i+1] &&
'+' != ch[i+1] && '-' != ch[i+1] && '*' != ch[i+1] && '/' !=
ch[i+1])
return 0;
if(('+' == ch[i] || '-' == ch[i] || '*' == ch[i] || '/'
== ch[i]) && !isdigit(ch[i-1]) && 'X' != ch[i-1] && 'x' !=
ch[i-1] && !isdigit(ch[i+1]) && 'X' != ch[i+1] && 'x' != ch
[i+1])
return 0;
if('^' == ch[i] && 'X' != ch[i-1] && 'x' != ch[i-1])
return 0;
if('^' == ch[i] && !isdigit(ch[i+1]))
return 0;
}
}
}
return 1;
}
void createPoly(polynode **P, char ch[])
{//写到这里
char *t = ch;
int i = 0, j = 1;
int iscoef = 1,isminus = 1;
polyptr Q,L;
if('-' == ch[0])
{
isminus = -1;
t++;
}
while('/0' != *t)
{
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = 1;
Q->exp = 0;
Q->next = NULL;//申请节点,初始化参数为1.
if(-1 == isminus)
{
Q->coef *= isminus;
isminus = 1;
}
while('+' != *t && '-' != *t && '*' != *t && '/' != *t &&
'/0' != *t)
{
if('x' != *t && 'X' != *t)
{
while(isdigit(*t))
{
i =((int)*t - 48) + i*10;
t++;
j *= i;
}//抽取数字
if(1 == iscoef && 0 != i)
{
Q->coef *= i;
}
if(0 == iscoef)
{
Q->exp += i;
iscoef = 1;
}
*t;
}
else
{
iscoef = 0;
t++;
if('^' == *t)
t++;
else
Q->exp = 1;
}
i = 0;
}//while 遍历到加减乘除,则退出循环,到下一新的节点
printf("系数:%f,指数:%d/n",Q->coef,Q->exp);
iscoef = 1;
if('/0' != *t)
{
if('-' == *t)
isminus = -1;
t++;
}
if(0 == j)
{
Q->coef = 0;
j = 1;
}
if(NULL == *P)
{
*P = Q;
}
else
{
L->next = Q;
}
L = Q;
}//while遍历整个字符串
}
polyptr polyAdd(polynode *A,polynode *B)
{
polyptr P = A, Q,L;
polyptr COPYA = NULL,COPYB = NULL;
if(NULL == A || NULL == B)
{
return NULL;
printf("多项式未被建立./n");
}
while(NULL != P)
{//复制A
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = P->coef;
Q->exp = P->exp;
Q->next = NULL;
if(NULL == COPYA)
COPYA = Q;
else
L->next = Q;
L = Q;
P = P->next;
}
P = B;
while(NULL != P)
{//复制B
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = P->coef;
Q->exp = P->exp;
Q->next = NULL;
if(NULL == COPYB)
COPYB = Q;
else
L->next = Q;
L = Q;
P = P->next;
}
L->next = COPYA;//把COPYA,COPYB两个多项式连接起来,整理一下 就OK了.
order(©B);
// order(©B);
// printf("相加结果为:");
// display(COPYB);
return COPYB;
// destroy(©B);
}
polyptr polyMinus(polynode *A,polynode *B)
{//相减和相加差不多
polyptr P = A, Q,L;
polyptr COPYA = NULL,COPYB = NULL;
if(NULL == A || NULL == B){
return NULL;
printf("多项式未被建立./n");
}
while(NULL != P)
{//复制A
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = P->coef;
Q->exp = P->exp;
Q->next = NULL;
if(NULL == COPYA)
COPYA = Q;
else
L->next = Q;
L = Q;
P = P->next;
}
P = B;
while(NULL != P)
{//复制B
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = -(P->coef);
Q->exp = P->exp;
Q->next = NULL;
if(NULL == COPYB)
COPYB = Q;
else
L->next = Q;
L = Q;
P = P->next;
}
L->next = COPYA;//把COPYA,COPYB两个多项式连接起来,整理一下 就OK了.
order(©B);
// order(©B);
// printf("相减结果为:");
// display(COPYB);
return COPYB;
// destroy(©B);
}
polyptr polyMulti(polynode *A,polynode *B)
{
polyptr Pa = A,Pb = B, Q,L;
polyptr COPYAB = NULL;
if(NULL == A || NULL == B)
{
return NULL;
printf("多项式未被建立./n");
}
while(NULL != Pa)
{//复制A
while(NULL != Pb)
{
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = Pa->coef * Pb->coef;
Q->exp = Pa->exp + Pb->exp;//
Q->next = NULL;
if(NULL == COPYAB)
COPYAB = Q;
else
L->next = Q;
L = Q;
Pb = Pb->next;
}
Pa=Pa->next;
}
order(©AB);
// printf("相乘结果为:");
// display(COPYAB);
return COPYAB;
// destroy(©AB);
}
polyptr polyDiv(polynode *A,polynode *B)
{
polyptr P = A,result=NULL,p_r=NULL, QivNum,Q,L;
polyptr COPYA = NULL,COPYB = NULL;
if(NULL == A || NULL == B)
{
return NULL;
printf("多项式未被建立./n");
}
while(NULL != P)
{//复制A
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = P->coef;
Q->exp = P->exp;
Q->next = NULL;
if(NULL == COPYA)
COPYA = Q;
else
L->next = Q;
L = Q;
P = P->next;
}
P = B;
while(NULL != P)
{//复制B
Q = (polyptr)malloc(sizeof(polynode));
Q->coef = (P->coef);
Q->exp = P->exp;
Q->next = NULL;
if(NULL == COPYB)
COPYB = Q;
else
L->next = Q;
L = Q;
P = P->next;
}
order(©A);
order(©B);
while(COPYA->coef !=0 && COPYA->exp > -5)
{
QivNum = (polyptr)malloc(sizeof(polynode));
QivNum->next=NULL;
QivNum->coef = COPYA->coef/COPYB->coef;
QivNum->exp = COPYA->exp-COPYB->exp;
if(result ==NULL)
result=QivNum;
else
p_r->next=QivNum;
p_r=QivNum;
//result = polyMulti(QivNum,COPYB);
COPYA = polyMinus(COPYA,polyMulti(QivNum,COPYB));
}
// printf("相除结果为:");
// display(result);
return result;
// destroy(©AB);
}
void display(polynode *P)
{
//考虑情况有系数为1,指数为1,0,一般数;系数为系数不为1,指数为 1,0,一般数;
//系数为负数,指数为1,0,一般数,主要考虑中间符号问题.
polynode *p=P;
if(NULL == P){
printf("多项式为空./n");
return ;
}
if(1 == P->coef){
if(0 == P->exp)
printf("1");
else if(1 == P->exp) printf("x");
else printf("x^%d",P->exp);
}
else{
if(0 == P->exp)
printf("%.1f",P->coef);
else if(1 == P->exp) printf("%.1fx",P->coef);
else
printf("%.1fx^%d",P->coef,P->exp);
}
P = P->next;
while(NULL != P){
if(0 < P->coef){
if(1 == P->coef){
if(0 == P->exp)
printf("+1");
else if(1 == P->exp) printf("+x");
else printf("+x^%d",P->exp);
}
else{
if(0 == P->exp)
printf("+%.1f",P->coef);
else if(1 == P->exp) printf("+%.1fx",P->coef);
else
printf("+%.1fx^%d",P->coef,P->exp);
}
}
else{
if(-1 == P->coef){
if(0 == P->exp)
printf("-1");
else if(1 == P->exp) printf("-x");
else printf("-x^%d",P->exp);
}
else{
if(0 == P->exp)
printf("%.1f",P->coef);
else if(1 == P->exp) printf("%.1fx",P->coef);
else
printf("%.1fx^%d",P->coef,P->exp);
}
}
P = P->next;
}
printf("/n");
}
void destroy(polynode **P)
{
polyptr Q = *P;
if(NULL == *P)
return ;
while(*P != NULL)
{
Q = *P;
*P = (*P)->next;
delete Q;
}
}
void order(polynode **P){
//首先 系数为零的要清掉,其次指数从高到低排序,再者系数相同的 要合并.
polyptr prev,curr,OUT,INcurr;//前一节点和当前节点
float temp;
//出去第一节点系数为0的项
while(NULL != *P){
if(0 != (*P)->coef)
break;
else
{
if(NULL == (*P)->next)
return;
curr = *P;
(*P) = (*P)->next;
delete curr;
}
}
if(NULL == *P || NULL == (*P)->next)//如果只剩1项或空,则不 需要整理,退出函数
return;
//冒泡排序
OUT = INcurr = *P;
while(NULL != OUT->next)
{//外循环
while(NULL != INcurr->next)
{//内循环
prev = INcurr;
INcurr = INcurr->next;
if(prev->exp < INcurr->exp)
{
temp = prev->coef;
prev->coef = INcurr->coef;
INcurr->coef = temp;//交换系数
temp = prev->exp;
prev->exp = INcurr->exp;
INcurr->exp = temp;//交换指数
}
}
OUT = OUT->next;
INcurr = *P;
}
//去除0项
prev = curr = *P;
curr = curr->next;
while(NULL != curr)
{
if(0 == curr->coef)
{
prev->next = curr->next;
delete curr;
curr = prev->next;
}
else
{
prev = curr;
curr = curr->next;
}
}
//合并同类项
OUT = INcurr = *P;
while(NULL != OUT->next)
{
while(NULL != INcurr->next)
{
prev = INcurr;
INcurr = INcurr->next;
if(INcurr->exp == OUT->exp)
{
OUT->coef += INcurr->coef;
prev->next = INcurr->next;
delete INcurr;
INcurr = prev;
}
}
INcurr = OUT = OUT->next;
if(NULL == OUT)
return;
}
}
void main()
{
int choice;
// int i;
char ch[100];
polynode *polyA,*polyB,*result;
polyA = polyB = NULL;
menu();
scanf("%d",&choice);
while(!IsChoice(choice))
{
menu();
printf("输入错误,重新输入./n");
scanf("%d",&choice);
}
while(8 != choice)
{
switch(choice)
{
case 1:
if(NULL != polyA || NULL != polyB)
{
destroy(&polyA);
destroy(&polyB);
printf("原多项式被销毁./n");
}
printf("输入多项式A:/n");
scanf("%s",&ch);
printf("/n%s/n",&ch); /
while(!isPut(ch)){
printf("输入错误!重新输./n");
scanf("%s",&ch);
}
createPoly(&polyA,ch);//建立多项式A链表
display(polyA);//
printf("输入多项式B:/n");
scanf("%s",&ch);
while(!isPut(ch)){
printf("输入错误!重新输./n");
scanf("%s",&ch);
}
createPoly(&polyB,ch);//建立多项式B链表
order(&polyB);
order(&polyA);//整理排序多项式
printf("建立多项式成功!多项式:/nA为:");
display(polyA);
printf("B为:");
display(polyB);
break;
case 2:
result=polyAdd(polyA,polyB);
printf("相加结果为:");
display(result);
//destroy(&result);
break;
case 3:
result=polyMinus(polyA,polyB);
printf("相减结果为:");
display(result);
//destroy(&result);
break;
case 4:
result=polyMulti(polyA,polyB);
printf("相乘结果为:");
display(result);
//destroy(&result);
break;
case 5:
result=polyDiv(polyA,polyB);
printf("相除结果为:");
display(result);
//destroy(&result);
break;
case 6:
printf("------显示多项式------/nA :");
display(polyA);
printf("B :");
display(polyB);
break;
case 7:
destroy(&polyA);
destroy(&polyB);
printf("此多项式已被清空./n");
break;
default:
return ;
}
choice = 0;
menu();
scanf("%d",&choice);
while(!IsChoice(choice) || 0 == choice)
{
menu();
printf("输入错误,重新输入./n");
scanf("%d",&choice);
}
}
}