一元稀疏多项式课程设计Word格式.docx
《一元稀疏多项式课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式课程设计Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,……,n}
基本操作:
InitList(&
L)
操作结果:
构造一个空的线性表L。
DestroyList(&
初始条件:
线性表L已存在。
操作结果:
销毁线性表L。
ClearList(&
将L重置为空表。
ListEmpty(L)
若L为空表,则返回TRUE,否则返回FALSE。
ListLength(L)
返回L中数据元素个数。
GetElem(L,i,&
e)
线性表L已存在,1≤i≤ListLength(L)。
用e返回L中第i数据个元素的值。
LocateElem(L,e,compare())
线性表L已存在,compare()是数据元素判定函数。
返回L中第1个与e满足关系compare()的数据元素的位序。
若这样的数据元素不存在,则返回值为0。
PriorElem(L,cur_e,&
pre_e)
若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
NextElem(L,cur_e,&
next_e)
若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。
ListInsert(&
L,i,e)
线性表L已存在,1≤i≤ListLength(L)+1。
在L中第i个位置之前插入新的数据元素e,L的长度加1。
ListDelete(&
L,i,&
线性表L已存在且非空,1≤i≤ListLength(L)。
删除L的第i个数据元素,并用e返回其值,L的长度减1。
ListTraverse(L,visit())
初始条件:
依次对L的每个数据元素调用函数visit()。
一旦visit()失败,则操作失败。
}ADTList
2.主程序的流程;
开始运行
输入要升幂输出的多项式
输出
选择输入
减法
加法
建立两个多项式,分别输出并计算
输出差多项式
输出和多项式
3.各程序模块之间的层次(调用)关系。
main()
subpolyn
addpolyn
printpolyn
createpolyn
主函数调用其他各个函数,实现所需功能。
4.3详细设计
内容包括:
1.实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;
typedefstructlnode
{
structlnode*next;
floatcoef;
intexpn;
}lnode,*linklist;
voidcreatepolyn(linklist*L)
voidprintpolyn(linklist*L)
voidaddpolyn(linklistLa,linklistLb,linklistLc)
voidsubpolyn(linklistLa,linklistLb,linklistLc)
2.对主程序和其它主要函数伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);
/*主函数*/
voidmain()
{intx;
linklistHead,Head_a,Head_b,Head_c;
linklist*L,*La,*Lb;
L=&
Head;
La=&
Head_a;
Lb=&
Head_b;
createpolyn(L);
printpolyn(L);
printf(“\n”);
printf("
求加法请输入1,减法输入2,按回车确认\n"
);
//菜单项
scanf("
%d"
&
x);
if(x==1)
{createpolyn(La);
printpolyn(La);
createpolyn(Lb);
printpolyn(Lb);
Head_c=Head_a;
addpolyn(Head_a,Head_b,Head_c);
}
elseif(x==2)
subpolyn(Head_a,Head_b,Head_c);
}
3.函数的调用关系图。
4.4测试与分析
4.4.1测试
4.4.2分析
1.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
多项式的建立,与链式表一致,只是每个结点中多了一个数据域,而多项式的运算,则与链表的合并相似。
指数相同的项,对应系数相加(或相减),若其和不为0,则构成多项式的一项,对于两个一元多项式中所有指数不相同的项,则分别复制到和多项式中。
和多项式链表中的结点无需另生成,而从两个多项式的链表中摘取。
运算规则如下:
假设指针qa和qb分别指向两个多项式中当前进行比较的某个结点,有下列三种情况:
①qa所指的结点的指数<
qb所指结点的指数,则应摘取qa所指结点插入到和多项式中;
②qa所指的结点的指数>
qb所指结点的指数,则应摘取qb所指结点插入到和多项式中;
③qa所指的结点的指数=qb所指结点的指数,则将两个结点的系数相加,若和不为0,则修改qa所指结点的系数,同时释放qb结点,否则删除qa结点,并释放qa,qb结点。
2.算法的时间复杂度和空间复杂度的分析,改进设想。
4.5附录
源程序:
#include"
stdio.h"
malloc.h"
//结点指针域
//多项式系数
//多项式指数
intn;
//定义全局变量n用以存储多项式的项数
/*创建多项式*/
inti;
linklistP;
(*L)=(linklist)malloc(sizeof(lnode));
(*L)->
next=NULL;
if(!
{
printf("
创建链表失败\n"
exit(0);
请输入一元多项式的项数n=:
"
n);
if(n)
请输入多项式的的元素:
for(i=0;
i<
n;
++i)//逆序建立链表存储多项式
{
P=(linklist)malloc(sizeof(lnode));
P)
%f,%d"
(P->
coef),&
expn));
P->
next=(*L)->
next;
next=P;
/*输出函数*/
{linklistP,a[100],t;
inti,j;
输入的多项式为%d,"
n);
//输出多项式的项数
P=(*L)->
i++)//建立结点数组,存储多项式的各项
{a[i]=P;
P=P->
for(i=1;
i++)//对数组作起泡排序,实现多项式的升幂排序
{for(j=0;
j<
n-i;
j++)
if(a[j]->
expn>
a[j+1]->
expn)
{t=a[j];
a[j]=a[j+1];
a[j+1]=t;
i++)//输出多项式各项
%.2f,%d,"
a[i]->
coef,a[i]->
expn);
\n"
n-1;
i++)//修改数组中各个结点的指针
a[i]->
next=a[i+1];
a[n-1]->
for(i=n-1;
i>
=0;
i--)//输出后再把数组元素逆序返回链表
{P=a[i];
}
/*加法*/
linklistQa,Qb,Qc,P;
Qc=Lc;
Qa=La->
Qb=Lb->
while(Qa&
&
Qb)
if(Qa->
expn<
Qb->
expn)//如果Qa的指数小于Qb的,则把Qa插入到和多项式中
{
Qc->
next=Qa;
Qc=Qa;
Qa=Qa->
}
elseif(Qa->
expn==Qb->
expn)//如果Qa的指数等于Qb的,则把Qa的系数变为Qa加Qb的并插入和多项式中
{Qa->
coef+=Qb->
coef;
if(Qa->
coef)
Qb=Qb->
else
{Qa=Qa->
else//如果Qa的指数大于Qb的,则把Qb插入到和多项式中
{Qc->
next=Qb;
Qc=Qb;
Qb=Qb->
while(Qa)//把Qa和Qb中剩余项插入
Qc->
Qc=Qa;
Qa=Qa->
while(Qb)
free(Lb);
//释放Lb链表
多项式的和为"
P=Lc->
while(P)
%.2f,%d"
P->
coef,P->
P=P->
}
/*减法*/
expn)//如果Qa的指数等于Qb的,则把Qa的系数变为Qa减Qb的并插入多项式中
coef-=Qb->
else
{Qb->
coef=-(Qb->
coef);
Qb->
多项式的差为"
5总结与展望
经过这次课程设计,更加深刻的理解了链式表的建立和相关操作。
多项式的建立,与链式表一致,只是每个结点中多了一个数据域,可以直接借鉴以前试验的代码并适当修改即可,而对于多项式的升幂排序,则是通过起泡排序完成的。
对于加法,与链表的合并类似,重点在于系数的运算和指针的指向,这里经过了很长时间的修改才得以完成,而减法,最初的想法是把被减项的系数变为它的相反数再相加两个多项式,但实际中发现较难实现,于是改变思想,把两者的系数直接相减。
此外,还需要考虑特殊情况,比如系数相加或相减后为0的情况,最初没有考虑进去,后来测试时发现并修改。
从这次设计中,我认识到了,在对问题的处理过程中,首先应该把该问题转化为数学问题,并找到与之相适应的算法和存储结构,在实际操作中,应先对问题解决的方法进行仔细而全面的思考,找出较容易实现的,最后再进行实际操作,比如此次在减法的实现时就因为方法的不当而走了不少弯路。
另外,在程序的调试过程中,应该善于发现存在的问题,遇到错误不能畏惧,要耐心找到错误的地方并加以修正。
通过此次设计,我认识到了自己的不足和缺陷,以后的学习中,我会多多实践,而不是流于书本知识的掌握,更加注重实践和理论的结合,并从实践中发现和完善自己的不足,使自己在实际编程过程中更加娴熟与得心应手。
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版)[M].清华大学出版社,2007年
[2]谭浩强.C程序设计(第三版)[M].清华大学出版社,2007年
成绩评定
成绩教师签字