一. SeqList.h头文件(所有函数声明及结构体定义)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct polyn
{
float coef; //一元多项式的系数
int expn; //一元多项式的指数
struct polyn* next;
}PolyNode, *PLinkList;
PLinkList CreatePolyn();
PolyNode* Reverse(PLinkList h);
PolyNode* MultiplyPolyn(PLinkList A, PLinkList B);
void OutPut(PLinkList h
二. SeqList.c(函数模块)
#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"
PLinkList CreatePolyn() //创建一元多项式,使一元多项式呈指数递减
{
PolyNode* p, * q, * s;
PolyNode* h = NULL;
int expn2;
float coef2;
h = (PLinkList)malloc(sizeof(PolyNode)); //动态生成一个头节点
if (!h)
{
return NULL;
}
h->coef = 0;
h->expn = 0;
h->next = NULL;
do
{
printf("输入系数coef(系数和指数都为0时,表示结束)");
scanf("%f", &coef2);
printf("输入指数exp(系数和指数都为0时,表示结束)");
scanf("%d", &expn2);
if ((long)coef2 == 0 && expn2 == 0)
break;
s = (PolyNode*)malloc(sizeof(PolyNode));
if (!s)
{
return NULL;
}
s->expn = expn2;
s->coef = coef2;
q = h->next; //指向链表的第一个节点,即表尾
p = h; //*p指向q的前驱结点
while (q && expn2 < q->expn)//将新输入的指数与q指向的结点指数比较
{
p = q;
q = q->next;
}
if (q == NULL || expn2 > q->expn)//*q指向要插入结点的位置,p指向要插入结点的前驱结点
{
p->next = s;//将s结点插入到链表中
s->next = q;
}
else
{
q->coef += coef2;//如果指数与链表中结点指数相同,则将系数相加即可
}
} while (1);
return h;
}
PolyNode* Reverse(PLinkList h)//将生成的链表逆置,使一元多项式呈指数递增形式
{
PolyNode* q, * r, * p = NULL;
q = h->next;
while (q)
{
r = q->next;//r指向链表的待处理结点
q->next = p;//将链表结点逆置
p = q;//p指向刚逆置后链表结点
q = r;//q指向下一准备逆置的结点
}
h->next = p;//将头结点的指针指向已经逆置后的链表
return h;
}
PolyNode* MultiplyPolyn(PLinkList A, PLinkList B)
{
PolyNode* pa, * pb, * pc, * u, * h;
int k, maxExp;
float coef;
h = (PLinkList)malloc(sizeof(PolyNode));//动态生成头结点
if (!h)
{
return NULL;
}
h->coef = 0.0;
h->expn = 0;
h->next = NULL;
if (A->next != NULL && B->next != NULL)
{
maxExp = A->next->expn + B->next->expn;//为两个链表指数的和的最大值
}
else
return h;
pc = h;
B = Reverse(B);//使多项式的乘积指数范围为0-maxExp
for (k = maxExp; k >= 0; k--)
{
pa = A->next;
while (pa != NULL && pa->expn > k)//从pa指向的多项式中指数小于k的结点开始查找
{
pa = pa->next;
}
pb = B->next;
while (pb != NULL && pa != NULL && pa->expn + pb->expn < k)//如果指数之和小于k,使pb移到下一个结点
pb = pb->next;
coef = 0.0;
while (pa != NULL && pb != NULL)
{
if (pa->expn + pb->expn == k)//如果在链表中找到对应的结点,即指数之和等于k,求相应的系数
{
coef += pa->coef * pb->coef;
pa = pa->next;
pb = pb->next;
}
else if (pa->expn + pb->expn > k)//如果指数之和大一k,使pa移到下一个节点
pa = pa->next;
else
pb = pb->next;//如果指数之和小于k,使pb移到下一个节点
}
if (coef != 0.0)//如果系数不为零,则生成新节点,并将系数和指数分别赋值给新节点,并将结点插入到链表中
{
u = (PolyNode*)malloc(sizeof(PolyNode));
u->coef = coef;
u->expn = k;
u->next = pc->next;
pc->next = u;
pc = u;
}
}
B = Reverse(B);//完成多项式乘积后,将B(x)呈指数递减形式
return h;
}
void OutPut(PLinkList h) // 输出一元多项式
{
PolyNode* p = h->next;
while (p)
{
printf("%1.1lf", p->coef);
if (p->expn)
{
printf("x^%d", p->expn);
}
if (p->next && p->next->coef > 0)
{
printf("+");
}
p = p->next;
}
}
三. test.c(测试程序)
#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"
int main()
{
PLinkList A, B, C;
A = CreatePolyn();
printf("A(x)=");
OutPut(A);
printf("\n");
B = CreatePolyn();
printf("B(x)=");
OutPut(B);
printf("\n");
C = MultiplyPolyn(A, B);
printf("C(x)=A(x)*B(x)=");
OutPut(C); //输出结果
printf("\n");
return 0;
}
运行结果:
小编制作不易,如果觉得对你有帮助的话,麻烦留下你一个小小的赞