#include <stdio.h>
#include <stdlib.h>
typedef struct Polynode
{
int coef;
int exp;
struct Polynode *next;
}Polynode, *Polylist;
// 初始化多项式
bool InitPoly(Polylist *Poly) // 二级指针
{
*Poly = (Polylist)malloc(sizeof(Polynode)); //产生头结点,并使L指向此头节点
if (!(*Poly)) // 存储分配失败
return false;
(*Poly)->next = NULL;
return true;
}
void PrintPoly(Polylist poly)
{
Polynode *p;
p = poly->next;
printf("%d", p->coef);
printf(" %d", p->exp);
p = p->next;
while (p != NULL)
{
printf(" %d", p->coef);
printf(" %d", p->exp);
p = p->next;
}
printf("\n");
}
void PolyDerivation(Polylist poly)
{
Polynode *p, *temp;
p = poly->next;
temp = NULL;
while (p&&p->exp)
{
p->coef *= p->exp;
p->exp--;
temp = p;
p = p->next;
}
// 处理常数项
if (p)
{
if (temp) // 常数项前一项不为0
{
free(p);
temp->next = NULL;
}
else
{
// 只有常数项
p->coef = 0;
}
}
}
void CreateFromTail(Polylist L)
{
Polynode *r, *s;
int c,e;
char ch;
r = L; // r指向链表的当前表尾,其初值指向头节点
while (1)
{
scanf("%d %d", &c,&e);
ch = getchar();
s = (Polynode*)malloc(sizeof(Polynode)); // 建立新结点s
s->coef = c;
s->exp = e;
r->next = s;
r = s;
if (ch == '\n')
{
r->next = NULL;
break;
}
}
}
int main()
{
Polylist Polya;
InitPoly(&Polya);
CreateFromTail(Polya);
PolyDerivation(Polya);
PrintPoly(Polya);
}
关键是常数项的处理