// PolynMultiplyPolyn.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include<stdlib.h>
#include<stdio.h>
typedef struct polyn
{
int expn;
float coef;
struct polyn * next;
}PolyNode, * PLinkList;
PLinkList CreatePoly();
void OutPut(PLinkList h);
PolyNode * Reverse(PLinkList h);
PLinkList MultiplyPolyn(PLinkList A, PLinkList B);
int main()
{
PLinkList A, B, C;
//创建A,B两个一元多项式
printf("创建A多项式\n");
A = CreatePoly();
OutPut(A);//显示A
printf("创建B多项式\n");
B = CreatePoly();
OutPut(B);//显示B
C = MultiplyPolyn(A, B);
printf("多项式相乘结果:\n");
OutPut(C);
}
//创建
PLinkList CreatePoly()
{
PLinkList h;
PolyNode *s,*p;
h = (PLinkList)malloc(sizeof(PolyNode));//分配头节点
if (!h)
return NULL;
h->next = NULL;
p = h;
//手动输入每项的系数和指数来创建链表
while (1)
{
s = (PLinkList)malloc(sizeof(PolyNode));
if (!s)
return NULL;
printf("输入系数,当系数和指数都为零时结束:\n");
scanf_s("%f", &(s->coef));
printf("输入指数,当系数和指数都为零时结束:\n");
scanf_s("%d", &(s->expn));
//将S插入
s->next = p->next;
p->next = s;
p = p->next;
if (s->coef == 0 && s->expn == 0)//当系数和指数都为零时结束
break;
}
return h;
}
void OutPut(PLinkList h)
{
PolyNode *p;
p = h->next;
printf("y = ");
while (p)
{
printf("%1.1f", p->coef);
if (p->expn)
printf("x^%d", p->expn);
if (p->next && p->next->coef > 0)
{
printf("+");
}
p = p->next;
}
printf("\n");
}
PolyNode * Reverse(PLinkList h)//将单链表翻转
{
PolyNode *p, *q, *r;
p = NULL;
q = h->next;
while (q)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
h->next = p;
return h;
}
//多项式相乘
PLinkList MultiplyPolyn(PLinkList A, PLinkList B)
{
//获取expn最大,A降序,B升序
PolyNode * pa,*pb,*pc;
int expnMax;
expnMax = (A->next->expn)+(B->next->expn);
int k = expnMax;
float coef1; //存储系数
//创建新链表
PLinkList C;
//初始化头节点
C = (PLinkList)malloc(sizeof(PolyNode));
C->next = NULL;
pc = C;
//逆置B
B = Reverse(B);
while (k>=0)
{
pa = A->next;
//每次从头开始
while (pa != NULL && pa->expn > k)
pa = pa->next;
pb = B->next;
while (pa != NULL && pb != NULL && pa->expn+pb->expn < k)
{
pb = pb->next;
}
coef1 = 0;
while (pa != NULL && pb != NULL)
{
if (pa->expn + pb->expn == k)
{
coef1 += pa->coef*pb->coef;
pa = pa->next;
pb = pb->next;
}
else if (pa->expn + pb->expn < k)
{
pb = pb->next;
}
else
pa = pa->next;
}
//添加节点
if (coef1 != 0)
{
PolyNode *s = (PLinkList)malloc(sizeof(PolyNode));
s->coef = coef1;
s->expn = k;
s->next = NULL;
pc->next = s;
pc = pc->next;
}
k--;
}
return C;
}
链表---两个一元多项式相乘
最新推荐文章于 2023-09-23 19:46:02 发布