当前位置:文档之家› 数据结构课程设计报告-一元多项式加减乘计算

数据结构课程设计报告-一元多项式加减乘计算

《数据结构》课程设计多项式计算班级:学号:姓名:指导老师:多项式计算1、问题描述能够按照指数降序排列建立多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出。

2、设计思路这个程序的关键是多项式的创建和排列,以及相乘时系数相乘和指数相加、相加时相同指数的系数相加、相减时相同指数的系数相减。

由于多项式拥有指数和系数(假设基数已定),所以可以定义一个包含指数系数的结构体,用单链表存储多项式的数据,所以结构体包含next指针。

数据插入时比较两数的指数,按照降序排序,从表头的next 开始,直至找到合适的位置,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。

输入完数据后选择计算方式(相乘、相加、相减),多项式运算时要循环遍历整个多项式,多项式的每一组数据都要和另一个多项式整组数据相运算(每一个运算值都存储到新建的“多项式”链表中),直到两个多项式都遍历完结束。

3、数据结构设计在模拟多项式对象时,为了简化处理,只取最核心的两个数据:多项式的系数和指数。

前面提到,要用单链表操作,所以要加上个next指针,再由该结构体定义一个结点类型和指针类型。

具体数据结构定义如下:typedefstruct node{int xs; /*系数*/int zs; ﻩ/*指数*/struct node* next; /*next指针*/}Dnode,* Dnodelist;4、功能函数设计(1)链表初始化函数Creat_node()带有头结点的头指针指向空(NULL)。

(2)多项式数据的创建函数Creat_Dmeth()ﻩ当链表初始化成功后,开始创建多项式。

分别循环输入两个多项式的系数和指数,其中要用到插入函数。

ﻩ(3)数据的插入函数Insert_node()ﻩ当创建多项式时,要用到此函数,即利用插入的方式将多项式的数据连接起来。

再输入一组数据后,程序自动调用此函数,插入时也进行着排序,从表头的next开始,一一比较指数大小,直到大于或等于当前指向的数据或遍历完所有数据时停止,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。

(4)多项式的显示函数Show()ﻩ从多项式表头的next开始,直到指向空(NULL),将系数与指数一一显示。

(5)选择运算方式的函数select()三种选择:1为相乘,2为相加,3为相减;每一种选择调用相应的运算函数。

ﻩ(6)多项式的运算函数:新建链表存储计算后的多项式ﻩ1、多项式相乘Mulresult()创建两个指针分别指向两个多项式表头的next,使用两个whil e函数嵌套循环,遍历每一组数据,每遍历一次都将两组数据的系数相乘,指数相加,再利用插入函数将系数与指数存储到新建多项式的链表中。

2、多项式相加Addresult()ﻩ创建两个指针分别指向两个多项式表头的next,分别使用两个whi le函数独自循环,遍历各自的每一组数据,每遍历一次都将系数与指数存储到新建多项式的链表中。

因为存储时利用到插入函数,而插入函数中有相同指数的系数相加功能,所以直接将两个多项式的数据依次插入到新的多项式中即可完成多项式相加。

ﻩ3、多项式相减Subresult()创建两个指针分别指向两个多项式表头的next,以两个指针同时不为空为条件循环遍历,如果当前多项式1的指数小于多项式2,则将当前多项式2的系数置负,指数不变,存入新建多项式中,指向多项式2的指针指向下一个;如果如果当前多项式1的指数大于多项式2,则将当前多项式1的系数指数不变,存入新建多项式中,指向多项式1的指针指向下一个;否则将多项式1的系数减去2的系数后存入新建多项式中,指数不变存入,再将两个指针同时指向下一个。

结束循环后判断是哪一个多项式遍历完了,将未遍历完的多项式剩下的数据全部插入到新建多项式中。

(7)主函数main()ﻩ创建两个多项式的链表并且初始化,分别调用相应的多项式创建函数,创建成功后选择运算方式,再将运算结果输出显示。

5、程序代码#include<stdio.h>#include<stdlib.h>typedef structnode{int xs;int zs;structnode * next;}Dnode,*Dnodelist; /*定义结构体*/DnodelistCreat_node(void) /*链表初始化*/{Dnodelist D;ﻩD=(Dnodelist)malloc(sizeof(Dnode));ﻩif(D)ﻩD->next=NULL;ﻩreturn D;}int Insert_node(Dnodelist D,int xs,int zs) /*插入函数*/{ﻩDnodelist p;ﻩDnodelist q;Dnodelist r;ﻩp=D;while(p->next){ﻩﻩr=p;ﻩﻩp=p->next;if(zs==p->zs) /*指数相等,系数直接相加,结束*/ﻩ{ﻩp->xs=p->xs+xs;ﻩﻩreturn 1;ﻩ}ﻩelse if(zs>p->zs) /*指数大于当前数据的,将数据插入当前数据之前,结束*/ﻩﻩ{ﻩﻩq=Creat_node();ﻩﻩﻩq->xs=xs;ﻩﻩﻩq->zs=zs;ﻩﻩr->next=q;ﻩq->next=p;return 1;ﻩ}ﻩ}/*while(p->next)*/q=Creat_node(); /*要插入的数据指数最小,直接插入至链表最后*/ﻩq->xs=xs;ﻩq->zs=zs;q->next=p->next;ﻩp->next=q;ﻩreturn 1;ﻩfree(p);free(q);ﻩfree(r);}Dnodelist Creat_Dmeth(int length)/*创建多项式*/{ﻩint i,m,n;ﻩDnodelist D;D=Creat_node();ﻩfor(i=0;i<length;i++) /*以三组数据为例*/{ﻩﻩscanf("%d,%d",&m,&n);Insert_node(D,m,n);/*调用插入函数,将输入的系数指数插入链表*/}ﻩreturn D;}Dnodelist Mulresult(Dnodelist D1,Dnodelist D2) /*多项式相乘*/{Dnodelist D;ﻩDnodelist p,q;ﻩint x,z;ﻩD=Creat_node();ﻩp=D1->next;ﻩq=D2->next;ﻩwhile(q)ﻩ{ﻩwhile(p){ﻩﻩx=p->xs*q->xs; /*系数相乘,指数相加*/z=p->zs+q->zs;ﻩﻩInsert_node(D,x,z);ﻩp=p->next;ﻩ}ﻩp=D1->next;ﻩq=q->next;}ﻩreturn D;}Dnodelist Addresult(Dnodelist D1,DnodelistD2) /*多项式相加*/{Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();ﻩp=D1->next;q=D2->next;ﻩwhile(q)ﻩ{ﻩﻩx=q->xs;ﻩz=q->zs;Insert_node(D,x,z);ﻩﻩq=q->next;}ﻩwhile(p)ﻩ{x=p->xs;ﻩz=p->zs;ﻩﻩInsert_node(D,x,z);ﻩp=p->next; /*直接插入数据,利用插入函数可完成该功能*/}return D;}DnodelistSubresult(DnodelistD1,Dnodelist D2)/*多项式相减*/{ﻩDnodelist D;Dnodelist p,q;intx,z;ﻩD=Creat_node();ﻩp=D1->next;q=D2->next;ﻩwhile(p&&q){if((p->zs)<(q->zs)) /*指数小(1的数据在2中不存在),直接插入*/ﻩ{ﻩx=-(q->xs); /*由于是式1减式2,所以系数置负*/ﻩﻩz=q->zs;ﻩﻩInsert_node(D,x,z);ﻩﻩq=q->next;ﻩ}ﻩelse if((p->zs)>(q->zs)) /*指数大(2的数据在1中不存在),直接插入*/ﻩ{ﻩx=p->xs;ﻩz=p->zs;ﻩﻩInsert_node(D,x,z);ﻩﻩp=p->next;ﻩ}ﻩelse /*指数相同的先将系数相减,再插入*/ﻩ{ﻩﻩﻩz=q->zs;ﻩx=(p->xs)-(q->xs);ﻩInsert_node(D,x,z);ﻩp=p->next;ﻩﻩq=q->next;ﻩ}}/*while(p&&q)*/while(p){ﻩx=p->xs;z=p->zs;ﻩInsert_node(D,x,z);ﻩp=p->next;}ﻩwhile(q)ﻩ{ﻩﻩx=-(q->zs);ﻩz=q->zs;ﻩInsert_node(D,x,z);ﻩq=q->next;} /*将未遍历完的数据直接插入*/ﻩreturn D;}Dnodelist select(Dnodelist D1,Dnodelist D2) /*选择函数*/{Dnodelist D;ints;printf("请选择:\n1:相乘\n2:相加\n3:相减\n");scanf("%d",&s);ﻩswitch(s){case 1: D=Mulresult(D1,D2); /*调用相乘函数*/ﻩﻩprintf("相乘结果(系数,指数):\n");ﻩbreak;ﻩcase 2: D=Addresult(D1,D2); /*调用相加函数*/ ﻩﻩﻩprintf("相加结果(系数,指数):\n");break;case 3: D=Subresult(D1,D2);/*调用相减函数*/ﻩﻩprintf("相减结果(系数,指数):\n");break;default:ﻩprintf("无此选项\n");ﻩbreak;ﻩ}return D;}void Show(Dnodelist D) /*显示(输出)函数*/{ﻩDnodelist r;r=D->next;ﻩwhile(r)ﻩ{ﻩprintf("(%d,%d)+",r->xs,r->zs);ﻩr=r->next;ﻩ}printf("\n");}void main(){ﻩDnodelist D1,D2,D;int length;D1=Creat_node();ﻩD2=Creat_node(); /*D1为多项式1,D2为多项式2,初始化*/printf("输入多项式1的组数:\n”);scanf(“%d”,&length);printf("输入多项式1系数,指数:(%d组)\n",length);ﻩD1=Creat_Dmeth(length); /*创建多项式1*/ printf("输入多项式2的组数:\n”);scanf(“%d”,&length);printf("输入多项式2系数,指数:(%d组)\n",length);ﻩD2=Creat_Dmeth(length);/*创建多项式2*/ﻩD=select(D1,D2); /*选择运算方式*/ Show(D); /*输出显示*/getch();}6、运行与测试程序运行时,先提示第一个多项式的组数,确定组数后才可输入相应的数据,之后是多项式2;输入完数据后,程序提示选择运算方式。

相关主题