算法思路:
1.指针p1和p2初始化,分别指向Pa,Pb首元节点;
2.p3指向多项式当前节点,初值为Pa头节点;
3.指针p1,p2均未到达相应表尾时,则循环比较p1和p2所指节点对应的指数值(p3-
>expn与p2->expn),有下列3种情况:
①当p1->expn等于p2->expn时,则将两个节点中的系数相加,若和不为0,则修改p1节点的系数值,同时删除p
2所指节点,若和为0,则删除pl和p2所指节点;
②当p1->expn小于p2->expn时,则应摘取p1所指节点插入“和多项式” 链表中;
③当p1->expn大于p2->expn时,则应摘取p2所指节点插入“和多项式” 链表中。
4.将非空多项式的剩余段插入p3所指节点之后;
5.释放Pb的头节点。
构造链表
typedef struct PNode{
int coef; //系数
int expn; //指数
struct PNode *next;
}PNode,*Polynomial;
初始化链表
//初始化一个空链表
Polynomial SetNullLink_list(){
Polynomial head = (Polynomial)malloc(sizeof(PNode));
if(head !=NULL)
head->next = NULL;
else printf("failure") ;
return head;
}
多项式建立 (pre用于保存q的前驱 初值为头结点 ,q初始化,指向首元结点 )
//多项式的建立
void CreatePolyn(Polynomial &P,int n){
PNode *p,*s,*q,*pre;
p = (Polynomial)malloc(sizeof(PNode));//动态生成新节点
p->next = NULL;
for(int i=0;i<n;i++){
s = (Polynomial)malloc(sizeof(PNode));
printf("依次输入系数和指数:\n");
scanf("%d,%d",&(s->coef),&(s->expn));
if(s->coef || s->expn){
pre = P;//pre用于保存q的前驱 初值为头结点
q = P->next;//q初始化,指向首元结点
while(q&&q->expn<s->expn){
pre=q;//比较新结点系数,确定插入位置
q=q->next;
}
s->next = q;
pre->next = s;
}else{
printf("输入有误,系数和指数不可同时为零");
}
}printf("输入完成\n");
}
多项式加法
void AddPolyn(Polynomial &Pa,Polynomial &Pb){
PNode *p1,*p2,*p3,*r;
p1 = Pa->next;p2 = Pb->next;
p3 = Pa;
while (p1 && p2){
if(p1->expn == p2->expn){
int sum = p1->coef+p2->coef;
if(sum){
p1->coef = sum;
p3->next = p1;
p3 = p1;
p1 = p1->next;
r = p2; p2 = p2->next; free(r);
}
else{
r = p1; p1 = p1->next; free(r);
r = p2; p2 = p2->next; free(r);
}
}
else if(p1->expn<p2->expn){
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1?p1:p2;
free(Pb);
}
输出链表中的元素
void print(Polynomial head) {
PNode *p = head->next;
while(p){
if(p->next != NULL){
printf("(%d,%d)\t",p->coef,p->expn);
}
else{
printf("(%d,%d)\t",p->coef,p->expn);
}
p = p->next;
}
}
销毁链表
void DestoryLink_List(Polynomial head) {
PNode *pre = head, *p = pre->next;//pre保存p的前驱
while(p){
free(p);
pre = p;
p = p->next;
}
free(pre);
}
全部代码
#include <Stdio.h>
#include <stdlib.h>
typedef struct PNode{
int coef; //系数
int expn; //指数
struct PNode *next;
}PNode,*Polynomial;
//初始化一个空链表
Polynomial SetNullLink_list(){
Polynomial head = (Polynomial)malloc(sizeof(PNode));
if(head !=NULL)
head->next = NULL;
else printf("failure") ;
return head;
}
//多项式的建立
void CreatePolyn(Polynomial &P,int n){
PNode *p,*s,*q,*pre;
p = (Polynomial)malloc(sizeof(PNode));//动态生成新节点
p->next = NULL;
for(int i=0;i<n;i++){
s = (Polynomial)malloc(sizeof(PNode));
printf("依次输入系数和指数:\n");
scanf("%d,%d",&(s->coef),&(s->expn));
if(s->coef || s->expn){
pre = P;//pre用于保存q的前驱 初值为头结点
q = P->next;//q初始化,指向首元结点
while(q&&q->expn<s->expn){
pre=q;//比较新结点系数,确定插入位置
q=q->next;
}
s->next = q;
pre->next = s;
}else{
printf("输入有误,系数和指数不可同时为零");
}
}printf("输入完成\n");
}
//多项式加法
void AddPolyn(Polynomial &Pa,Polynomial &Pb){
PNode *p1,*p2,*p3,*r;
p1 = Pa->next;p2 = Pb->next;
p3 = Pa;
while (p1 && p2){
if(p1->expn == p2->expn){
int sum = p1->coef+p2->coef;
if(sum){
p1->coef = sum;
p3->next = p1;
p3 = p1;
p1 = p1->next;
r = p2; p2 = p2->next; free(r);
}
else{
r = p1; p1 = p1->next; free(r);
r = p2; p2 = p2->next; free(r);
}
}
else if(p1->expn<p2->expn){
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1?p1:p2;
free(Pb);
}
//输出链表中的元素
void print(Polynomial head) {
PNode *p = head->next;
while(p){
if(p->next != NULL){
printf("(%d,%d)\t",p->coef,p->expn);
}
else{
printf("(%d,%d)\t",p->coef,p->expn);
}
p = p->next;
}
}
//销毁链表
void DestoryLink_List(Polynomial head) {
PNode *pre = head, *p = pre->next;//pre保存p的前驱
while(p){
free(p);
pre = p;
p = p->next;
}
free(pre);
}
int main(){
Polynomial head1 = NULL,head2 = NULL;
head1 = SetNullLink_list();
head2 = SetNullLink_list();
CreatePolyn(head1,4);
CreatePolyn(head2,4);
AddPolyn(head1,head2);
print(head1);
}