实际上一元多项式的数据结构仍然是一条单链表,不过是此时的每个结点代表多项式的每一项,结点的数据域被细分成了系数域
和指数域
。而多项式相加的操作本质上还是有序单链表的归并操作
。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{//项的类型(数据域)
float coef;//系数
int expn;//指数
} Data;
typedef struct node {//链表(一元多项式)类型
Data data;//数据域
struct node* next;//指针域
} node, *Polynomial;//结点,头指针
void InitList(Polynomial &P);//初始化链表
int LocateElem(Polynomial P, Data d);//返回第1个值为e的元素的位序,否则返回0
void insertNodeT(Polynomial &L, Data d);//插入节点(尾插法,先进先出)
void CreatePolyn(Polynomial &P, int m);//输入m项的系数和指数,建立表示一元多项式的有序链表P
void PrintPolyn(Polynomial P);//打印一元多项式
void AddPolyn(Polynomial &Pa, Polynomial &Pb, Polynomial &Pc);//多项式相加
int main(){
Polynomial P1, P2, P3;
CreatePolyn(P1, 3);
CreatePolyn(P2, 3);
PrintPolyn(P1);
PrintPolyn(P2);
AddPolyn(P1, P2, P3);
PrintPolyn(P3);
}
void InitList(Polynomial &P){
P = (Polynomial)malloc(sizeof(node));
P->next = NULL;
}
int LocateElem(Polynomial P, Data d){
int i = 0;
while (P)
if (d.expn != P->data.expn){
++i;
P = P->next;
}
else return i;
return 0;
}
void insertNodeT(Polynomial &P, Data d){
node *q, *p = P;
while (p->next)
p = p->next;
q = (node*)malloc(sizeof(node));
q->data = d;
q->next = p->next;
p->next = q;
}
void CreatePolyn(Polynomial &P, int m){
InitList(P);
P->data.coef = 0.0; P->data.expn = -1;//设置头结点的数据元素
Data d;
for (int i = 1; i <= m; i++){//依次输入m个非零项
scanf("%f,%d", &d.coef, &d.expn);
if (!LocateElem(P, d))
insertNodeT(P, d);//采用尾插法插入链表
}
}
void PrintPolyn(Polynomial P){
P = P->next;
printf("f(x)=");
while (P->next){
printf("%.1fx^%d+", P->data.coef, P->data.expn);
P = P->next;
}
printf("%.1fx^%d\n", P->data.coef, P->data.expn);
}
void AddPolyn(Polynomial &Pa, Polynomial &Pb, Polynomial &Pc){
node *a = Pa->next;//从Pa的首元结点开始比较
node *b = Pb->next;//从Pb的首元结点开始比较
Pc = (Polynomial)malloc(sizeof(node));//额外增加了一个头结点Pc的空间开销
node *c = Pc;//可以看作Pc的尾指针
while (a && b){//a,b指向的空间都不为空,则进行比较
if (a->data.expn < b->data.expn){//当a指向结点项的指数小于b的时,将a指向结点插入Pc
c->next = a;
c = a;
a = a->next;//a指向Pa链的下一个结点
}
else if(a->data.expn > b->data.expn){//当a指向结点项的指数大于b的时,将b指向结点插入Pc
c->next = b;
c = b;
b = b->next;//b指向Pb链的下一个结点
}
else{//a-data.expn == b->data.expn时
a->data.coef += b->data.coef;//加和系数到a上
c->next = a;
c = a;
a = a->next;//a指向Pa链的下一个结点
node *p = b;
b = b->next;//b指向Pb链的下一个结点
free(p);//释放该b结点
p = NULL;
}
}
if (!a)//Pa链已全部插入,尾指针c指向剩余Pb链
c->next = b;
else //Pb链已全部插入,尾指针c指向剩余Pa链
c->next = a;
}
输出: