小鱼儿の多项式运算
最近在学数据结构自己就写了一下。。和书上基本不一样,,因为前面自己写了一个比较ADT的顺序表所以就用它了。。
但我根本就没有用到顺序表的特点,我不想用书那种顺序表的那种处理方法。。太占内存了。。。
其实这种用链表处理更好。。。用顺序表导致代码好长啊。。。还是写了很多重复代码,,还需要不断提高。。。。
核心代码
程序代码:#include "poly.h"
int InitPoly(int n,PPolyHead *head)
{
int i;
if(n<=0)
return 0;
*head=(PPolyHead)malloc(sizeof(PolyHead));
(*head)->n=0;
i=list_seq_create(n,&((*head)->head));
if(i)
return 1;
else
return 0;
}
void Polyinfo(int n,PPolyHead head)
{
int t=n;
Poly poly;
while(t>0)
{
printf("请输入你的系数");
scanf("%f",&poly.coef);
puts("请输入指数");
scanf("%d",&poly.exp);
list_seq_add(&poly,head->head);
head->n++;
t--;
}
PolyMerge(head);//从开始就把相同指数的处理掉
}
void PolyShow(PPolyHead head)
{
int num=0;
if(!head)
return;
while(num<head->head->num)
{
printf("指数:%d\t",head->head->element[num].exp);
printf("系数:%f\n",head->head->element[num].coef);
num++;
}
}
PPolyHead PolyAdd(PPolyHead head1,PPolyHead head2)
{
int i,j,k;
int flag=0;
DATETYPE temp;
PPolyHead head;
InitPoly(head1->n+head2->n,&head);//用空间换时间。
if(!head1||!head2)
return NULL;
for(i=0;i<head1->head->num;i++)
{
for(j=0;j<head2->head->num;j++)
{
if(head1->head->element[i].exp==head2->head->element[j].exp)
{
//some_time++;
//head->head->element[i].coef=head1->head->element[i].coef+head2->head->element[i].coef;
//head->head->element[i].exp=head1->head->element[i].exp;
temp.coef=head1->head->element[i].coef+head2->head->element[j].coef;
temp.exp=head1->head->element[i].exp;
list_seq_add(&temp,head->head);
flag=1;
}
}
if(!flag)
{
temp.coef=head1->head->element[i].coef;
temp.exp=head1->head->element[i].exp;
list_seq_add(&temp,head->head);
}
flag=0;
}
k=i;
for(i=0;i<head2->head->num;i++)
{
for(j=0;j<k;j++)
if(head2->head->element[i].exp==head->head->element[j].exp)
{
flag=1;
}
if(!flag)
{
temp.coef=head2->head->element[i].coef;
temp.exp=head2->head->element[i].exp;
list_seq_add(&temp,head->head);
}
flag=0;
}
return head;
}
PPolyHead PolySub(PPolyHead head1,PPolyHead head2)
{
int i,j,k;
int flag=0;
DATETYPE temp;
PPolyHead head;
InitPoly(head1->n+head2->n,&head);//用空间换时间。
if(!head1||!head2)
return NULL;
for(i=0;i<head1->head->num;i++)
{
for(j=0;j<head2->head->num;j++)
{
if(head1->head->element[i].exp==head2->head->element[j].exp)
{
temp.coef=head1->head->element[i].coef-head2->head->element[j].coef;
temp.exp=head1->head->element[i].exp;
list_seq_add(&temp,head->head);
flag=1;
}
}
if(!flag)
{
temp.coef=head1->head->element[i].coef;
temp.exp=head1->head->element[i].exp;
list_seq_add(&temp,head->head);
}
flag=0;
}
k=i;
for(i=0;i<head2->head->num;i++)
{
for(j=0;j<k;j++)
if(head2->head->element[i].exp==head->head->element[j].exp)
{
flag=1;
}
if(!flag)
{
temp.coef=-head2->head->element[i].coef;
temp.exp=head2->head->element[i].exp;
list_seq_add(&temp,head->head);
}
flag=0;
}
return head;
}
PPolyHead PolyMulti(PPolyHead head1,PPolyHead head2)
{
if(!head1||!head2)
return NULL;
int i,j;
DATETYPE temp;
PPolyHead head;
InitPoly(head1->head->num*head2->head->num,&head);
for(i=0;i<head1->head->num;i++)
{
for(j=0;j<head2->head->num;j++)
{
temp.exp=head1->head->element[i].exp+head2->head->element[j].exp;
temp.coef=(head1->head->element[i].coef)*(head2->head->element[j].coef);
list_seq_add(&temp,head->head);
}
}
PolyMerge(head);
return head;
}
void PolyMerge(PPolyHead head1)
{
if(!head1)
return;
int n,i;
for(n=0;n<head1->head->num;n++)
{
for(i=n+1;i<head1->head->num;i++)
{
if(head1->head->element[n].exp==head1->head->element[i].exp)
{
head1->head->element[n].coef+=head1->head->element[i].coef;
list_seq_delet(i+1,head1->head);//注意list_seq_delet(loction)是位置不是下标.
i--;
}
}
}
}
vc6工程








