数据结构中的链表的最基础的问题。一元二次多项式的简单的加法和乘法。模块化的思想。记住即可。其中个人感觉需要注意的点有以下。
- 对于同一个指针的malloc函数请勿多次重复使用
- 调试的时候尽量细化,分块调试,很重要
- 多联系,第一次敲所以手很生
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define maxn 100001
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial next;
};
void Attach(int c,int e,Polynomial *pRear)
{
//printf("-------------2---------------\n");
Polynomial p;
p=(Polynomial)malloc(sizeof(PolyNode));
p->coef=c;
p->expon=e;
p->next=NULL;
(*pRear)->next=p;
*pRear=p;
// printf("-------------22---------------\n");
}
Polynomial ReadPoly()
{
Polynomial p,temp,rear;
p=(Polynomial)malloc(sizeof(PolyNode));
p->next=NULL;
rear=p;
int c,e,n;
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&c,&e);
//printf("-------------5---------------\n");
Attach(c,e,&rear);
// printf("-------------4---------------\n");
}
temp=p;
p=p->next;
free(temp);
// printf("-------------end---------------\n");
return p;
}
Polynomial AddPolynomial(Polynomial p1,Polynomial p2)
{
Polynomial p3,rear,temp1,temp2,temp;
if(!p1)
return p2;
if(!p2)
return p1;
p3=(Polynomial)malloc(sizeof(PolyNode));
p3->next=NULL;
rear=p3;
temp1=p1;
temp2=p2;
while(temp1&&temp2)
{
if(temp1->expon>temp2->expon)
{
if(temp1->coef!=0)
Attach(temp1->coef,temp1->expon,&rear);
temp1=temp1->next;
}
else if(temp2->expon>temp1->expon)
{
if(temp2->coef!=0)
Attach(temp2->coef,temp2->expon,&rear);
temp2=temp2->next;
}
else
{
if(temp1->coef+temp2->coef!=0)
Attach(temp1->coef+temp2->coef,temp1->expon,&rear);
temp1=temp1->next;
temp2=temp2->next;
}
}
if(temp1)
{
while(temp1)
{
Attach(temp1->coef,temp1->expon,&rear);
temp1=temp1->next;
}
}
else if(temp2)
{
while(temp2)
{
Attach(temp2->coef,temp2->expon,&rear);
temp2=temp2->next;
}
}
temp=p3;
p3=p3->next;
free(temp);
//printf("-------------1---------------\n");
return p3;
}
Polynomial MultiOneterm(Polynomial p1,Polynomial p2)//p2是单个节点好了
{
if((!p1)||(!p2)||(p1->coef==0)||(p2->coef==0))
return NULL;
Polynomial p,temp,rear,temp1,temp2;
int c,e;
p=(Polynomial)malloc(sizeof(PolyNode));
p->next=NULL;
rear=p;
temp1=p1;
temp2=p2;
while(temp1)
{
c=temp1->coef*temp2->coef;
e=temp1->expon+temp2->expon;
Attach(c,e,&rear);
temp1=temp1->next;
}
temp=p;
p=p->next;
free(temp);
return p;
}
void PrintPoly(Polynomial P);
Polynomial MultiPolynomial(Polynomial p1,Polynomial p2)
{
if((!p1)||(!p2))
return NULL;
Polynomial temp2,p3,p4;
// p3=(Polynomial)malloc(sizeof(PolyNode));
// p3->next=NULL;
p3=NULL;
//rear=p3;
//temp1=p1;
temp2=p2;
while(temp2)
{
p4=MultiOneterm(p1,temp2);
p3=AddPolynomial(p3,p4);
temp2=temp2->next;
}
return p3;
}
void PrintPoly(Polynomial p)
{
if(!p)
printf("0 0\n");
else
{
int flag=0;
while(p)
{
if(flag==0)
{
flag=1;
printf("%d %d",p->coef,p->expon);
p=p->next;
}
else
{
printf(" ");
printf("%d %d",p->coef,p->expon);
p=p->next;
}
}
printf("\n");
}
// printf("-------------printend---------------\n");
}
int main()
{
Polynomial p1,p2,p3,p4;
p1=ReadPoly();
p2=ReadPoly();
//printf("-------------3---------------\n");
p4=MultiPolynomial(p1,p2);
PrintPoly(p4);
p3=AddPolynomial(p1,p2);
PrintPoly(p3);
return 0;
}
/*
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
*/