#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node{
float data;//系数
int index;//指数
struct Node *next;//指针->指向下一个节点
}Dnode;
void add_Dnode_item(Dnode *L, float c, int e);
void PolyoAdd(Dnode *L1, Dnode *L2);//多项式L1与L2对应项相加得到L3
void Display(Dnode *L); // 输出多项式
int main(){
float c;
int e,k;
Dnode *LA = (Dnode *)malloc(sizeof(Dnode));
LA->next = NULL;
Dnode *LB = (Dnode *)malloc(sizeof(Dnode));
LB->next = NULL;
printf("建立多项式A(输入的第一个数为系数,第二个数为指数,以0 0结束循环):\n");
do{
scanf("%f %d", &c, &e); //获取系数及幂次
if (c != 0) {
add_Dnode_item(LA, c, e);
}
} while (c != 0);
printf("成功建立多项式A\n");
Display(LA);
printf("\n建立多项式B输入的第一个数为系数,第二个数为指数,以0 0结束循环:\n");
do
{
scanf("%f%d", &c, &e); //获取系数及幂次
if (c != 0)
add_Dnode_item(LB, c, e);
} while (c != 0);
printf("成功建立多项式B\n");
Display(LB);
getchar();
PolyoAdd(LA, LB);
}
// 输出多项式
void Display(Dnode *L){
Dnode *p;
p = L->next;
if (p != NULL){
printf("多项式为\t");
if (p->index==0)
printf("%0.2f", p->data);
else
printf("%0.2f*x^%d", p->data, p->index);
p = p->next;
while (p != NULL){
if (p->data > 0)
printf("+%0.2f*x^%d", p->data, p->index);
else
printf("%0.2f*x^%d", p->data, p->index);
p = p->next;
}
printf("\n");
}
else
printf("无数据!\n");
}
//插入
void add_Dnode_item(Dnode *L, float c, int e){
// 将项(c,e)插入到以L为头指针的一元多项式链表中
// 插入后的一元多项式链表是按指数从小到大有序
Dnode *pre = L , *p = L->next , *q ;
float x;
while (p != NULL && p->index < e){
pre = p;
p = p->next;
}
if (p == NULL) { // 已到链表最后,开辟新结点,插入到最后
q = (Dnode *)malloc(sizeof(Dnode));
q->data = c;
q->index = e;
q->next = p;
pre->next = q;
}
else if (p->index == e){ // 有同类项
x = p->data + c;
if (x==0){ // 合并后系数为0,删除该结点
pre->next = p->next;
free(p);
p = pre->next;
}
else p->data = x; // 合并后系数不为0,修改系数
}
else{ // 没有同类项 ,开辟新结点,直接插入
q = (Dnode *)malloc(sizeof(Dnode));
q->data = c;
q->index = e;
q->next = p;
pre->next = q;
}
}
//多项式L1与L2对应项相加得到L3
void PolyoAdd(Dnode *L1, Dnode *L2){
Dnode *p2, *p1;
float c;
int e;
Dnode *L3 = (Dnode *)malloc(sizeof(Dnode));
L3->next = NULL;
p1 = L1->next;
p2 = L2->next;
while (p1!= NULL){
c = p1->data;
e = p1->index;
if (c != 0)
add_Dnode_item(L3, c, e);
p1 = p1->next;
}
while (p2 != NULL){
c = p2->data;
e = p2->index;
if (c != 0)
add_Dnode_item(L3, c, e);
p2 = p2->next;
}
getchar();
printf("相加后");
Display(L3);
}