问题描述:
建立多项式,输入各项的系数和指数,用有头结点的单向链表表示一元多项式,并能够进行基本运算(加、减、乘、求导……)
算法逻辑:
通过输入每一项的系数和指数,用尾插法建立有n个结点=n个项的单向链表(有头结点),以输入系数为0为结束标志,输入时按指数从小到大排序;
输出一遍多项式以验证;
两个多项式相加:依次比较pa和pb各个节点的指数,指数相等则系数相加,不等,则将指数较小的节点放入求和链表,最后将剩余的链表续在最后。
/*多项式运算:创立、输出、加、减、乘、求导....
因为增删多,用带头结点的单链表
*/
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -2
//自定义结构体类型(结点)
typedef struct Polynomial {
int coef; //系数
int expn; //指数
struct Polynomial *next;
} Polynomial;
void CreatePolyList (Polynomial **);
void PrintPolyList (Polynomial *);
void AddPolyList (Polynomial **, Polynomial **, Polynomial **);
int main(){
Polynomial * pa = NULL;
CreatePolyList(&pa);
printf("-------打印多项式如下-------\n");
PrintPolyList(pa);
printf("\n");
Polynomial * pb = NULL;
CreatePolyList(&pb);
printf("-------打印多项式如下-------\n");
PrintPolyList(pb);
printf("\n");
Polynomial * pc = NULL;
AddPolyList (&pa, &pb, &pc);
printf("-------打印多项式如下-------\n");
PrintPolyList(pc);
return 0;
}
//建立多项式
void CreatePolyList (Polynomial **Head) {
//尾插法需要3个指针
Polynomial *New, *rear;
int a, n;
*Head = (Polynomial *) malloc (sizeof (Polynomial)); //开辟头结点
rear = *Head;
//因为系数不为0是判断多项式是否结束的条件,所以先录入一个,再开始循环判断
scanf ("%d,%d",&a,&n);
printf("a=%d,n=%d\n",a,n);
while (a != 0) {
New = (Polynomial *) malloc (sizeof (Polynomial)); //开辟新结点
New -> coef = a;
New -> expn = n;
//尾结点的next指针需要置空,New -> next = NULL非常重要,如果没有则无限循环
New -> next = NULL;
rear -> next = New; //尾插法
rear = New;
scanf ("%d,%d",&a,&n);
printf("a=%d,n=%d\n",a,n);
}
}
//输出多项式
void PrintPolyList (Polynomial *p) {
Polynomial * q = p -> next;
if (!q) {
printf ("0\n");
return;
}
//分情况讨论:指数为0;指数为1,指数为>=2的数,以及需要加+的情况
while (q) {
if (q->coef == 1) {
if (q->expn == 0) printf ("1");
else if (q->expn == 1) printf ("X");
else if (q->expn >= 1) printf ("X^%d",q->expn);
}
else if (q->coef == -1){
if (q->expn == 0) printf ("-1");
else if (q->expn == 1) printf ("-X");
else if (q->expn >= 1) printf ("-X^%d",q->expn);
}
else if ((q->coef !=1) && (q->coef !=-1)) {
printf ("%d",q->coef);
if (q->expn == 1) printf ("X");
else if (q->expn >= 1) printf ("X^%d",q->expn);
}
//需要输入+的情况
if (q -> next!=0 && q->coef >0)
putchar('+');
q = q -> next;
}
printf ("\n");
}
//多项式相加
void AddPolyList (Polynomial ** pa, Polynomial ** pb, Polynomial ** pc) {
Polynomial * p1 = (*pa)-> next;
Polynomial * p2 = (*pb)-> next;
Polynomial * rear, * pNew;
rear = (Polynomial *) malloc (sizeof (Polynomial)); //链表padd存放链表A和B的和
rear -> next = NULL; //头结点指针域置空
*pc = rear;
/*依次比较pa和pb各个节点的指数,指数相等则系数相加,
不等,则将指数较小的节点放入 和链表 中 */
while (p1!=NULL && p2!=NULL) {
pNew = (Polynomial *) malloc (sizeof (Polynomial));
if (p1->expn == p2->expn) {
pNew -> coef = p1->coef + p2->coef;
pNew -> expn = p1->expn;
p1 = p1-> next;
p2 = p2-> next;
} else if (p1->expn <= p2->expn) {
pNew -> coef = p1->coef;
pNew -> expn = p1->expn;
p1 = p1-> next;
} else if (p1->expn >= p2->expn) {
pNew -> coef = p2->coef;
pNew -> expn = p2->expn;
p2 = p2-> next;
}
//新结点放入新链表中
if (pNew->coef != 0) {
pNew -> next = NULL;
rear -> next = pNew;
rear = pNew;
}
else free (pNew);
}
if (p1 != NULL) {
// pNew = (Polynomial *) malloc (sizeof (Polynomial));
rear -> next = p1;
}
if (p2 != NULL) {
// pNew = (Polynomial *) malloc (sizeof (Polynomial));
rear -> next = p2;
}
}