编写将两个多项式相加的函数。不要毁坏输入数据。如果这两个多项式分别有M项和N项,那么你的程序的复杂度是多少。
#include <stdio.h>
#include <stdlib.h>
struct poly_list;
typedef struct poly_list *Poly;
typedef struct poly_list *Position;
struct poly_list
{
int coef;
int Exp;
Position next;
};
//create
Poly Create()
{
Poly p=malloc(sizeof(struct poly_list));
p->coef=-1;
p->Exp=-1;
p->next=NULL;
return p;
}
//insert
void Insert(int coeff,int exponent,Poly p_root)
{
Position p=p_root;
while(p->next!=NULL)
{
p=p->next;
}
Position p_tem=malloc(sizeof(struct poly_list));
p_tem->coef=coeff;
p_tem->Exp=exponent;
p_tem->next=p->next;
p->next=p_tem;
}
void traverse(Poly p_root)
{
if(p_root->next==NULL)
printf("error ,the list is empty\n");
else
{
Position p_tem=p_root->next;
while(p_tem!=NULL)
{
printf("(%d,%d)\n",p_tem->coef,p_tem->Exp);
p_tem=p_tem->next;
}
}
}
Poly Add(Poly p_1,Poly p_2)
{
if(p_1->next==NULL&&p_2->next!=NULL)
return p_2;
if(p_1->next!=NULL&&p_2->next==NULL)
return p_1;
if(p_1->next==NULL&&p_2->next==NULL)
return NULL;
if(p_1->next!=NULL&&p_2->next!=NULL)
{
Poly p_3=Create();
Position p1_tem=p_1->next;
Position p2_tem=p_2->next;
int p1_exp;
int p2_exp;
while(p1_tem!=NULL)
{
p1_exp=p1_tem->Exp;
while(p2_tem!=NULL)
{
p2_exp=p2_tem->Exp;
if(p1_exp==p2_exp)
{
Insert(p1_tem->coef+p2_tem->coef,p1_exp,p_3);
p2_tem=p2_tem->next;
p1_tem=p1_tem->next;
break;
}
if(p1_exp<p2_exp)
{
Insert(p2_tem->coef,p2_exp,p_3);
p2_tem=p2_tem->next;
}
if(p1_exp>p2_exp)
{
Insert(p1_tem->coef,p1_exp,p_3);
p1_tem=p1_tem->next;
break;
}
}
if(p2_tem==NULL)
break;
}
while(p1_tem!=NULL)
{
Insert(p1_tem->coef,p1_exp,p_3);
p1_tem=p1_tem->next;
}
while(p2_tem!=NULL)
{
Insert(p2_tem->coef,p2_tem->Exp,p_3);
p2_tem=p2_tem->next;
}
return p_3;
}
}
int main()
{
Poly p_root1=Create();
Insert(10,1000,p_root1);
Insert(5,14,p_root1);
Insert(1,0,p_root1);
Poly p_root2=Create();
Insert(3,1990,p_root2);
Insert(-2,1492,p_root2);
Insert(11,1,p_root2);
Insert(5,0,p_root2);
Poly p_root3=Add(p_root1,p_root2);
traverse(p_root3);
return 0;
}
复杂度为O(m+n);
习题二(栈)待续。。。