参考文章:https://blog.csdn.net/liuyunjay66/article/details/10526749
自己敲了一遍,先mark一下,以后理解可能会更深一点。
亮点在于对第二个多项式进行了逆反。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
float coe;//系数
int exp; //指数
struct node* next;
}listNode;
listNode *createList(int n);//创建链表
int printList(listNode* head);//打印链表
int inverseList(listNode* head);//逆反链表
listNode* multi(listNode* head_a, listNode* head_b);//链表相乘
int main()
{
printf("------降幂多项式相乘------\n");
int n;
printf("请输入A(x)的项数:");
scanf("%d", &n);
listNode* head_a = createList(n);
printf("A(x)=");
printList(head_a);
printf("请输入B(x)的项数:");
scanf("%d", &n);
listNode* head_b = createList(n);
printf("B(x)=");
printList(head_b);
listNode* head_c = multi(head_a, head_b);
printf("C(x) = A(x) * B(x) = ");
printList(head_c);
return 0;
}
listNode *createList(int n)
{
listNode *head = (listNode*)malloc(sizeof(listNode));
listNode *p;//新结点
listNode *pre = head;//当前结点
float coe;
int exp;
if (head == NULL)
{
printf("头结点开辟失败\n");
exit(1);
}
head->next = NULL;
int i = 0;
for (i = 0; i < n; i++)
{
if ((p = (listNode*)malloc(sizeof(listNode))) == NULL)
{
printf("新结点开辟失败\n");
exit(1);
}
printf("请输入第%d个系数和指数:", i + 1);
scanf("%f %d", &coe, &exp);
p->coe = coe;
p->exp = exp;
p->next = NULL;
pre->next = p;
pre = p;//插入结点
}
return head;
}
int inverseList(listNode *head)
{
listNode* p = head->next, * q;//p为当前结点,q为下一结点
head->next = NULL;
while (p)
{
q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
return 0;
}
int printList(listNode* head)
{
listNode* p = head->next;
while (p->next != NULL)
{
printf("%1.1f*X^%d+", p->coe, p->exp);
p = p->next;
}
printf("%1.1f*X^%d\n", p->coe, p->exp);
return 0;
}
listNode* multi(listNode* head_a, listNode* head_b)
{
listNode* head_c, * pa = head_a, * pb = head_b, * pc, * newnode;
int exp_max;//指数之和最大值
if (pa->next != NULL && pb->next != NULL)
exp_max = pa->next->exp + pb->next->exp;//求出最大指数和
else
return NULL;
head_c = (listNode*)malloc(sizeof(listNode));
if (head_c == NULL)
{
printf("链表c开辟失败\n");
exit(1);
}
head_c->coe = 0.0;
head_c->exp = 0;
head_c->next = NULL;
pc = head_c;
inverseList(head_b);//链表b逆反
float COE = 0.0;//系数和
int k = 0;
for (k = exp_max; k >= 0; k--)
{
pa = head_a->next;
while (pa != NULL && pa->exp > k)
pa = pa->next;
pb = head_b->next;
while (pa != NULL && pb != NULL && pa->exp + pb->exp < k)
pb = pb->next;
//此时pa+pb的exp<=k
while (pa != NULL && pb != NULL)//找到同指数的和相加
{
if (pa->exp + pb->exp == k)
{
COE += pa->coe * pb->coe;
pa = pa->next;
pb = pb->next;
}
else
{
if (pa->exp + pb->exp < k)
pb = pb->next;
else
pa = pa->next;
}
}
if (COE != 0.0)//有系数,则将此结点插入链表c中
{
if ((newnode = (listNode*)malloc(sizeof(listNode))) == NULL)
{
printf("链表c结点开辟失败");
exit(1);
}
newnode->coe = COE;
newnode->exp = k;
newnode->next = NULL;
pc->next = newnode;
pc = newnode;
COE = 0.0;
}
}
inverseList(head_b);
return head_c;
}