有需求者可自提
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node {
int coef;
int exp;
struct Node* next;
}Node,*LinkList;
typedef struct Head {
LinkList head;
}Head;
void Insert(LinkList Head, int coef, int exp) //一元多项式按降序插入
{
LinkList p, p1, p2 = NULL;
p1 = Head;
while (p1 && (p1->exp == 999 || p1->exp > exp))
{
p2 = p1;
p1 = p1->next;
}
if (p1!=NULL&&p1->exp==exp)
{
p1->coef = p1->coef + coef;
}
else
{
p = (LinkList)malloc(sizeof(Node));
p->coef = coef;
p->exp = exp;
p->next = NULL;
p2->next = p;
p->next = p1;
}
}
void Init(LinkList Head) //带表头节点的一元多项式的初始化
{
int coef, exp,n,k=1;
printf("请输入一元多项式一共有多少项: ");
scanf_s("%d", &n);
printf("请输入一元多项式中第%d个x的系数: ",k);
scanf_s("%d", &coef);
printf("请输入一元多项式中第%d个x的次方: ",k);
scanf_s("%d", &exp);
Insert(Head, coef, exp);
n--;
k++;
while (n--)
{
printf("请输入一元多项式中第%d个x的系数: ",k);
scanf_s("%d", &coef);
printf("请输入一元多项式中第%d个x的次方: ",k);
scanf_s("%d", &exp);
k++;
Insert(Head, coef, exp);
}
}
void Sort(LinkList Head) //一元多项式按降序排列
{
LinkList H;
H = Head;
LinkList p;
p = H->next;
H->next = NULL;
while (p)
{
Insert(H, p->coef, p->exp);
p = p->next;
}
}
void Print(LinkList Head) // 打印一元多项式
{
printf("此多项式如下:\n");
LinkList p1;
p1 = Head->next;
int num = 0;
while (p1)
{
if (num == 0 && p1->coef > 0)
{
printf("%dx^%d", p1->coef, p1->exp);
}
else
{
if (p1->exp == 0 && p1->coef > 0)
{
printf("+%d", p1->coef);
}
else if (p1->exp == 0 && p1->coef < 0)
{
printf(" %d", p1->coef);
}
else
{
if (p1->coef > 0 && p1->coef != 1 && p1->exp != 1)
{
printf("+%dx^%d", p1->coef, p1->exp);
}
else if (p1->coef > 0 && p1->coef != 1 && p1->exp == 1)
{
printf("+%dx", p1->coef);
}
else if (p1->coef < 0 && p1->coef != -1 && p1->exp != 1)
{
printf("%dx^%d", p1->coef, p1->exp);
}
else if (p1->coef < 0 && p1->coef != 1 && p1->exp == 1)
{
printf("%dx", p1->coef);
}
else if (p1->coef == 1)
{
if (p1->exp == 1)
{
printf("+x");
}
else
{
printf("+x^%d", p1->exp);
}
}
else if (p1->coef == -1)
{
if (p1->exp == 1)
{
printf("-x");
}
else
{
printf("-x^%d", p1->exp);
}
}
}
}
num++;
p1 = p1->next;
}
printf("\n打印完成!\n\n");
}
void Add(LinkList Head3,LinkList Head1, LinkList Head2)
{
LinkList p1,p2,p3=NULL;
p1 = Head1->next;
int coef, exp;
while (p1)
{
p2 = Head2->next;
while (p2)
{
p3 = NULL;
if (p1->exp == p2->exp)
{
printf("aaaa");
coef = p1->coef + p2->coef;
exp = p1->exp;
Insert(Head3, coef,exp);
break;
}
p3 = p2;
p2 = p2->next;
if (p3->next == NULL)
{
coef = p1->coef;
exp = p1->exp;
Insert(Head3, coef, exp);
}
}
p1 = p1->next;
}
p3 = NULL;
p2 = Head2->next;
LinkList L,L1=NULL;
L = Head3->next;
while(p2)
{
p3 = NULL;
L = Head3->next;
while (L)
{
if (L->exp == p2->exp)
{
break;
}
p3 = L;
L=L->next;
if (p3->next == NULL)
{
coef = p2->coef;
exp = p2->exp;
Insert(Head3, coef, exp);
}
}
p2 = p2->next;
}
}
void multiply(LinkList Head4, LinkList Head1, LinkList Head2)
{
LinkList p1,p2;
p1 = Head1->next;
int coef, exp;
while (p1)
{
p2 = Head2->next;
while (p2)
{
coef = p1->coef * p2->coef;
exp = p1->exp + p2->exp;
Insert(Head4, coef, exp);
p2 = p2->next;
}
p1 = p1->next;
}
}
void Release(LinkList Head) //一元多项式的撤销
{
LinkList p1, p2=NULL;
p1 = Head;
while (p1)
{
p2 = p1;
p1 = p1->next;
free(p2);
}
printf("链表撤销成功!");
}
int main()
{
int coef, exp,judge;
printf("请开始准备第一个多项式:\n");
LinkList Head1;
Head1 = (LinkList)malloc(sizeof(Node));
Head1->coef = 999;
Head1->exp = 999;
Head1->next = NULL;
Init(Head1);
Sort(Head1);
Print(Head1);
printf("请开始准备第二个多项式:\n");
LinkList Head2;
Head2 = (LinkList)malloc(sizeof(Node));
Head2->coef = 999;
Head2->exp = 999;
Head2->next = NULL;
Init(Head2);
Sort(Head2);
Print(Head2);
printf("两个多项式相加为:\n");
LinkList Head3;
Head3 = (LinkList)malloc(sizeof(Node));
Head3->coef = 999;
Head3->exp = 999;
Head3->next = NULL;
Add(Head3,Head1, Head2);
Sort(Head3);
Print(Head3);
printf("两个多项式相乘为:\n");
LinkList Head4;
Head4 = (LinkList)malloc(sizeof(Node));
Head4->coef = 999;
Head4->exp = 999;
Head4->next = NULL;
multiply(Head4, Head1, Head2);
Sort(Head4);
Print(Head4);
Release(Head1);
Release(Head2);
Release(Head3);
return 0;
}
代码运行结果如下: