一元多多项式的加法
1.先创建链表,存储多项式
2.输出多项式
3.两个多项式相加
4.输出多项式
*/
# include <stdio.h>
# include <malloc.h>
typedef struct dxs //多项式节点
{
float coe; //系数
int exp; //指数
struct dxs * pNext; //指针域
}DXS, * PDXS;
PDXS creat_dxs(); //创建多项式
void traverse(PDXS pHead); //遍历多项式链表
PDXS add(PDXS Da, PDXS Db); //多项式求和
int main(void)
{
//用链表结构,创建两个多项式
PDXS Da = creat_dxs();
traverse(Da);
PDXS Db = creat_dxs();
traverse(Db);
//求两个多项式的加法
PDXS Dj = add(Da, Db);
traverse(Dj);
return 0;
}
PDXS creat_dxs()
{
PDXS pHead = (PDXS)malloc(sizeof(DXS)); //创建头结点
pHead->pNext = NULL; //尾指针
PDXS pTail = pHead;
PDXS pNew = NULL;
int len;
float c;
int e;
int i;
printf("输入多项式的项数:len = ");
scanf("%d", &len);
for(i = 0; i < len; i++)
{
printf("分别输入第%d项的系数c、指数e:", i+1);
scanf("%f%d", &c, &e);
pNew = (PDXS)malloc(sizeof(DXS));
//多项式项,系数、指数
pNew->coe = c;
pNew->exp = e;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
}
return pHead;
}
//遍历链表
void traverse(PDXS pHead)
{
PDXS p = pHead->pNext; //首节点
while(p != NULL)
{
printf("(%.2f %d), ", p->coe, p->exp);
p = p->pNext;
}
printf("\n");
}
//多项式相加
PDXS add(PDXS Da, PDXS Db)
{
PDXS Dj = (PDXS)malloc(sizeof(DXS)); //和的头结点
Dj->pNext = NULL;
PDXS pTail = Dj; //和的尾节点
PDXS Dah = Da->pNext; //指向多项式的首节点
PDXS Dbh = Db->pNext;
//循环遍历多项式A,B
while(Dah && Dbh)
{
//比较当前两节点的指数
//当前 A项节点指数 < B项节点指数
if(Dah->exp < Dbh->exp)
{
pTail->pNext = Dah; //将此A项加入和链表中
pTail = Dah;
Dah = Dah->pNext; //A多项式向后遍历
}
//当前 A项节点指数 < B项节点指数
else if(Dah->exp > Dbh->exp)
{
pTail->pNext = Dbh; //将此B项加入和链表中
pTail = Dbh;
Dbh = Dbh->pNext; // //B多项式向后遍历
}
//如果两节点的指数相等
else
{
//当前指数的系数和不为0
//A项中保存系数和,把此A项加入和链表中
if(0 != (Dah->coe + Dbh->coe))
{
Dah->coe = Dah->coe + Dbh->coe;
pTail->pNext = Dah;
pTail = Dah;
}
//A,B都向后遍历
Dah = Dah->pNext;
Dbh = Dbh->pNext;
}
}
//插入剩余段
if(Dah != NULL)
{
pTail->pNext = Dah;
}
if(Dbh != NULL)
{
pTail->pNext = Dbh;
}
return Dj;
}