小鱼儿の多项式运算
最近在学数据结构自己就写了一下。。和书上基本不一样,,因为前面自己写了一个比较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工程
polystudy.rar
(224.13 KB)