《数据结构-实验2-多项式求和.doc》由会员分享,可在线阅读,更多相关《数据结构-实验2-多项式求和.doc(7页珍藏版)》请在三一办公上搜索。
1、 1、 实验目的(1) 掌握线性表的顺序存储结构和链式存储结构;(2) 掌握线性表插入、删除等根本运算;(3) 掌握线性表的典型运用多项式求和。2、 实验容编程实现多项式的求和运算:(1) 顺序存储结构的实现例如,:f(x)=8x6+5x5-10x4+32x2-x+10,g(x)=7x5+10x4-20x3-10x2+x,求和结果:f(x)+g(x)=8x6+12x5-20x3+22x2+10。顺序表的定义类型如下:#define MAXLEN 100typedef struct int dataMAXLEN;Int last;SeqList;(2) 链式存储结构的实现例如,:f(x)=100
2、x100+5x50-30x10 +10,g(x)=150x90-5x50+40x20-20x10+3x,求和结果:f(x)+g(x)=100x100+150x90+40x20-10x10+3x+10。3、 实验要求(1) 利用CC+语言完成程序设计。(2) 上机调试通过实验程序。(3) 输入数据,检验程序运行结果。(4) 给出具体的算法分析,包括时间复杂度和空间复杂度等。(5) 撰写实验报告把输入实验数据与运行结果用抓图的形式粘贴到实验报告上。4、 实验步骤与源程序 实验步骤我先从具体的问题中抽象出适当的数学模型,然后设计出相应的算法,对于用顺序存储结构实现多项式求和而言,需要设计3个main
3、函数调用的子函数,分别实现创立多项式,多项式相加和显示多项式;对于用链式存储结构实现多项式求和,也同样需要3个这样的子函数,最后,编写程序,并调试程序,得出实验结果。 源代码顺序存储结构:#include#define MAXLEN 100typedef struct int dataMAXLEN; int last; SeqList;void add_List(SeqList A, SeqList B, SeqList *C) int i;C-last=A.lastB.last? A.last:B.last;for(i=0;ilast;i+) C-datai=A.datai+B.datai;
4、void show_list(SeqList C) int i; for(i=C.last;i=1;i-) if(C.datai) printf(%dx%d)+,C.datai,i); printf(%dx%d)n,C.data0,0);void create_list(SeqList *D) int n,i; printf(tt请输入多项式X的最高次数:);scanf(%d,&n);for(int k=99;k=0;k-) D-datak=0;printf(tt请输入多项式X的次数由大到小输入系数,缺少项用0补齐n); for(i=n;i=0;i-)printf(tt输入X%d项的系数: ,
5、i); scanf(%d,&D-datai); D-last=n;void main() SeqList A,B,C; printf(tt创立多项式f(x):n); create_list(&A); printf(ttf(x)=); show_list(A); printf(tt创立多项式g(x):n); create_list(&B); printf(ttg(x)=); show_list(B); printf(tt多项式f(x)和g(x)的和: ); add_List (A,B,&C);printf(nttf(x)+g(x)=); show_list(C);链式存储结构:#include#
6、include#includetypedef struct linknode float coef; int expn; struct linknode *next; Node;void create_link_list(Node *L) Node *p,*q; int n=1; float x=1; q=L; printf(n请按多项式指数由大到小输入系数和指数:n); printf(提示: 系数和指数间用空格间隔,每组数据之间用回车间隔(系数和指数为0时完毕输入)n); while(fabs(x)0.000001 ) scanf(%f %d,&x,&n); if(fabs(x)0.0000
7、1) p=(Node *) malloc(sizeof(Node); p-coef=x; p-expn=n; p-next=NULL; q-next=p ; q=p; void show_link_list(Node *L) Node *p; p=L-next;while(p&p-next ) printf(%.1fx%d) + ,p-coef,p-expn); p=p-next; printf(%.1fx%d) ,p-coef,p-expn);printf(n);void mergelist(Node *La,Node *Lb,Node *Lc) / 多项式合并 Node *pa,*pb,*
8、pc; Node *q1,*q2; Lc=La;pc=Lc; pa=La-next;pb=Lb-next; while(pa & pb) if(pa-expn pb-expn) pc-next=pa;pc=pa;pa=pa-next; else if(pa-expn expn) pc-next=pb;pc=pb;pb=pb-next; else if(fabs(pa-coef+pb-coef)next; pb=pb-next; free(q1); free(q2); else q1=pb;pa-coef=pa-coef+pb-coef; pc-next=pa; pc=pa; pa=pa-nex
9、t; pb=pb-next; free(q1); if(pa) pc-next=pa; else pc-next=pb;void main() Node *LA,*LB,*LC;LA=(Node *)malloc(sizeof(Node); LA-next=NULL;LB=(Node *)malloc(sizeof(Node); LB-next=NULL; LC=LA; create_link_list( LA); printf(f(x) = );show_link_list(LA);create_link_list( LB);printf(g(x) = );show_link_list(LB
10、);mergelist(LA,LB,LC);printf(nf(x)+g(x)= );show_link_list(LC);5、 测试数据与实验结果可以抓图粘贴顺序存储结构的实现调试结果如下图:链式存储结构的实现调试结果如下图:6、 结果分析与实验体会本次实验是参考了例程序,经过自己的改写,从而实现要求。先做简单的输出,一步步的再做其它格式的设置。而且,在具体操作中我对顺序存储结构和链式存储结构的优点和缺点有了更深刻的体会,顺序存储结构的算法较为简单,但是在输入的过程中有很大的局限性,必须从大到小依次且连续的输入多项式次数,所以,它只适合最高次数较小的多项式求和,而链式存储结构设计的算法那么更灵活,输入时,不需要次数在数值上连续,所以,它更具有普遍性、实用性。再从算法效率的角度来评价,顺序存储结构在做次数大小跨度大的多项式求和时,会浪费很多的存储空间,而链式存储结构那么可以充分利用,不会浪费,即其空间复杂度较小。最后,我想说,通过调试程序,我不光学会编程了的根本步骤、根本算法,也使自己更有耐心去做好每一件事情。7 / 7