1、多项式运算与链表#include#include#include/首先要构造多项式的数据结构struct duoxiangshi char ch;/变量名 float coef;/系数 coefficient int expo; /指数 exponent struct duoxiangshi *next;/初始化一个链表duoxiangshi * initlink() duoxiangshi *p; p=(duoxiangshi*)malloc(sizeof(duoxiangshi); /如果申请内存空间失败 if(p=NULL) printf(申请空间失败); exit(0); p-next
2、=NULL; return p;/销毁整个链表void destroy_link(duoxiangshi *p) duoxiangshi *q; while(p!=NULL) q=p; p=p-next; free(q); /将多项式存入链表中duoxiangshi * creat_ploy(duoxiangshi *p) char c1; int i=0,n=0; duoxiangshi *p1; p=initlink(); printf(输入变量名:n); scanf(%s,c); printf(输入多项式项数n); scanf(%d,&n); for(i=0;icoef); printf
3、(输入变量的指数:n); scanf(%d,&p1-expo); p1-ch=c0; p1-next=p-next; p-next=p1; return p; /删除节点 返回剩下的链表首地址duoxiangshi * deletenode(duoxiangshi *h,duoxiangshi *maxp) duoxiangshi *t; t=h; /找到要删除的节点的前节点 while(t-next!=maxp) t=t-next; /删除节点 t-next=maxp-next; maxp-next=NULL; return h;/求表长 a用来记录长度void link_length(du
4、oxiangshi *p,int &a) while(p-next!=NULL) p=p-next; a+; /将链表中的多项式的指数的大小排序duoxiangshi *sort(duoxiangshi *h) int min;/用于保存指数最小的值 duoxiangshi *t=NULL,*minp=NULL,*head=NULL; if(h-next=NULL) printf(链表中不存在数据n); exit(0); /链表排序的思想和冒泡排序差不多,需要临时变量来存在当前最小值 while(h-next!=NULL) t=h-next;/临时指针 min=t-expo;/临时最小的指数值
5、 minp=t;/把当前t中的值作为最小 while(t-next!=NULL)/如果t后面有节点就需要比较 t=t-next;/向后移动一位 当前最小比较 if(t-expoexpo;/每次记录最小的 minp=t; h=deletenode(h,minp);/删除保存最小的指数的节点 返回剩余的 minp-next=head;/将每次的最小节点接在头结点之前 head=minp;/head重新回到该链开头 h-next=head;/把head接在头结点之后 return h;/显示多项式void display_poly(duoxiangshi *p) int a; p=sort(p);/
6、排序 while(p-next!=NULL) a=1; p=p-next; if(p-coefcoef, p-ch, p-expo); printf(n); /查找指数为index的节点duoxiangshi *locate_link(duoxiangshi *p, int index) p = p-next; while(p != NULL & p-expo != index) p = p-next; if(p = NULL) return NULL; else return p;/多一元多项式求导duoxiangshi *poly_qiudao(duoxiangshi *p) duoxia
7、ngshi *n,*q; q=p; if(p-next=NULL) printf(链表中没有数据n); exit(0); while(p-next!=NULL) p=p-next; if(p-expo=0|p-coef=0) q=deletenode(q,p); n=q;/保存删除无用节点的链表之后的头结点, 用于返回 /有可能删除后就没有数据了 if(q-next=NULL) printf(链表中没有数据n); exit(0); while(q-next!=NULL) q=q-next; /求导特点 q-coef=q-coef*q-expo; q-expo=q-expo-1; return
8、n;/创建多项式void creat(duoxiangshi *&p1,duoxiangshi *&p2) printf(创建第一个多项式n); p1=creat_ploy(p1); /创建多项式 printf(创建第二个多项式n); p2=creat_ploy(p2);/创建多项式 printf(第一个多项式 :n); display_poly(p1); printf(第二个多项式 :n); display_poly(p2);/多项式相加duoxiangshi * poly_add(duoxiangshi *head1,duoxiangshi *head2,char a) char ch1;
9、 duoxiangshi *p1,*p2,*p,*r; p1=head1; p2=head2; if(a=+) /只能是多项式的加法可以使用 system(cls); creat(p1,p2);/创建p1,p2 r=p1; while(r-next!=NULL) p1=r-next; r=deletenode(r,p1); /删除p1 p=locate_link(p2,p1-expo);/查找p2中是否有 系数等于p1-expn的节点,有就返回该点,否则返回NULL if(p!=NULL) p-coef=p-coef+p1-coef; else p1-next=p2-next; p2-next
10、=p1; if(a=+) printf(多项式相加后的结果是:n); display_poly(p2); printf(需要知道多项式求导后的结果吗?:Y/Nn); scanf(%s, ch); /继续创建 if(ch0 = Y | ch0 = y) p2=poly_qiudao(p2); display_poly(p2);/显示p2 destroy_link(p2); /销毁链表 /不继续进行 else destroy_link(p2); /销毁链表 getchar();/吃掉输入的字符,让屏幕显示停在运算结果上 return NULL; return p2; /多项式相减 可以重用多项式相
11、加 只是变了符号 void poly_sub(duoxiangshi *p1,duoxiangshi *p2) char ch1; duoxiangshi *n,*p; system(cls); /清屏 creat(p1,p2); p=p2; /将后面的多项式全部相当于乘以-1 while(p-next!=NULL) p=p-next; p-coef=-1*p-coef; printf(多项式的相减结果是:n); n=poly_add(p1,p2,-); display_poly(n); printf(需要知道多项式求导后的结果吗?:Y/Nn); scanf(%s, ch); if( ch0
12、= Y | ch0 = y) n = poly_qiudao(n); /求导 display_poly(n); destroy_link(n); /销毁 else destroy_link(n); getchar(); /多项式相乘的其中一个重用方法 duoxiangshi * poly_multiply(duoxiangshi *p,float coef,int index) / 传入系数和指数,分别与p的每个节点运算 最后返回该链 duoxiangshi *q,*n; n = (duoxiangshi *)malloc(sizeof(duoxiangshi); /作为头节点 n-next
13、= NULL; while(p-next!=NULL) p = p-next; q = (duoxiangshi *)malloc(sizeof(duoxiangshi); q-ch = p-ch; q-coef=coef*p-coef; q-expo=index+p-expo; q-next=n-next; n-next=q; return n; /多项式相乘 重用所用方法 void run_mul(duoxiangshi *p1,duoxiangshi *p2,int num) int i=0; char ch1; duoxiangshi *p,*q; /二维指针存每次poly_multi
14、ply()函数返回的链表 p=(duoxiangshi*)malloc(num*sizeof(duoxiangshi); /从p1的第一项开始依次乘以p2的每一项 while(p1-next!=NULL) p1=p1-next; pi+=poly_multiply(p2,p1-coef,p1-expo); q=poly_add(p0,p1,*); for(i=2;i= num1) /*根据链表*/ run_mul(p1, p2, num1); else run_mul(p2, p1, num2); /选择函数 int select() printf(输入任何字符进入主菜单n); getchar
15、();/读入字符 但不显示 system(cls); /*清屏*/ printf(选择多项式的操作nn); printf(#n); printf(1.多项式相加n); printf(2.多项式相减n); printf(3.多项式相乘n); printf(4. 退出n); printf(#n); int n=0; do printf(输入你的选择n); scanf(%d,&n); while(n4);/如果操作不对则一直循环 return n; int main() duoxiangshi *head1=NULL; duoxiangshi *head2=NULL; duoxiangshi *head3=NULL; /无限次死循环 for(;) switch(select() case 1: head3=poly_add(head1, head2, +); break; case 2: poly_sub(head1, head2); break; case 3: poly_mul(head1, head2); break; case 4: exit(0); /退出 return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1