#include "main.h"
void ReadTwoPoly(Poly** addhead1, Poly** addhead2)
{
int i,k,m,j,termweishu,delta,interval;
char judge;
char a[40], temp[40];
char* p;
Poly* s, *t;
Part* u, *v;
for(i=1; i<=2; i++)
{
printf("请输入多项式: ");
scanf("%s", temp);
if(JudgeFirstJian(temp)==1) { strcpy(a,temp); p=a; } //若首位是-,a不用空头元素
else { strcpy(a+1,temp); a[0]='+'; p=a; }
t=(Poly*)malloc(sizeof(Poly)); //空头结点
s=t;
if(i==1) *addhead1=t;
if(i==2) *addhead2=t;
while(1) //制造链
{
t=(Poly*)malloc(sizeof(Poly)); //建立新节点,默认总项指数为0,之后加
t->exp=0;
while(1)//一个新节点赋值开始,赋值后离开此循环
{
if( IsSign(*p) )
{//找到标志符号,开始赋值给当前结点
if( *(p+1)>='0'&&*(p+1)<='9' )
{//若p后方是数字
//总项系数赋值
t->coef = atoi(p);
termweishu = Findwei(atoi(p+1));
if( IsLetter( *(p+termweishu+1) ) )
/*1.1*/ {//总项系数后有字母 该项不是常数
v = (Part*)malloc(sizeof(Part));
u = t->self = v;
//以循环方式读入该项各部分
interval=0;
while(1)
{
v = (Part*)malloc(sizeof(Part));
v->letter = *(p+termweishu+1 +interval);//给该部分赋字母
if( *(p+termweishu+2 +interval)=='^' )
{//该部分字母后有^ 该部分指数不为1
v->exp = atoi(p+termweishu+3 +interval); t->exp += v->exp;
u->next = v; u=v;
if( IsSign( *(p+termweishu+2+Findwei(v->exp)+1 +interval) ) )
{//该部分后为标志符号 不存在下一部分
break;
}
}
if( IsLetter( *(p+termweishu+2 +interval) ) )
{//该部分字母后为字母 该部分指数为1 存在下一部分
v->exp=1; t->exp += v->exp;
u->next = v; u=v;
}
if( IsSign( *(p+termweishu+2 +interval) ) )
{//该部分字母后为标识符 该部分指数为1 无下一部分
v->exp = 1; t->exp += v->exp;
u->next = v; u=v;
break;
}
if( v->exp == 1) delta = 1;
else delta = Findwei(v->exp)+2;
interval += delta;
}//该项各部分读完
v->next = NULL;
t->self = (t->self)->next; //消除空头结点干扰(空头结点没free)
break;
}
if( IsSign(*(p+termweishu+1)) )
/*1.2*/ {//总项系数后是标志符号 该项是常数 总项指数为0
t->exp = 0;
t->self = NULL;
//该项各部分读完
break;
}
}
if( IsLetter( *(p+1) ) )
{//若p后方是字母 总项系数为1
//总项系数赋值
if( *p=='-') t->coef = -1;
else t->coef = 1;
termweishu = 0; //【此时1省略,termweishu是0以便计算】
if( IsLetter( *(p+termweishu+1) ) )
/*2.1 */ {//总项系数1后有字母 该项不是常数
v = (Part*)malloc(sizeof(Part));
u = t->self = v;
//以循环方式读入该项各部分
interval=0;
while(1)
{
v = (Part*)malloc(sizeof(Part));
v->letter = *(p+termweishu+1 +interval);//给该部分赋字母
if( *(p+termweishu+2 +interval)=='^' )
{//该部分字母后有^ 该部分指数不为1
v->exp = atoi(p+termweishu+3 +interval); t->exp += v->exp;
u->next = v; u=v;
if( IsSign( *(p+termweishu+2+Findwei(v->exp)+1 +interval) ) )
{//该部分后为标志符号 不存在下一部分
break;
}
}
if( IsLetter( *(p+termweishu+2 +interval) ) )
{//该部分字母后为字母 该部分指数为1 存在下一部分
v->exp=1; t->exp += v->exp;
u->next = v; u=v;
}
if( IsSign( *(p+termweishu+2 +interval) ) )
{//该部分字母后为标识符 该部分指数为1 无下一部分
v->exp = 1; t->exp += v->exp;
u->next = v; u=v;
break;
}
if( v->exp == 1) delta = 1;
else delta = Findwei(v->exp)+2;
interval += delta;
}//该项各部分读完
v->next = NULL;
t->self = (t->self)->next; //消除空头结点干扰(空头结点没free)
break;
}
if( IsSign(*(p+termweishu+1)) )
/*2.2 */ {//总项系数1后是标志符号 该项是常数 总项指数为0
t->exp = 0;
t->self = NULL;
break;
}
}
}
//当前不是标志符号 继续寻找标志符号以便开始给当前结点赋值
p++;
if(*p=='\0') goto out;
}
//新节点赋值结束
s->next = t; s=t; //新节点连接结束 (此时p在已赋值的标识符处)
p++;
}
//链制造完成
out:
s->next = NULL; //链制造完成,head存在空头结点
}
return ;
}