数据结构课程设计——一元稀疏多项式
![数据结构课程设计——一元稀疏多项式](https://img.360docs.net/img4e/02cjw6y5jq8gf2gc5c1i-e1.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书
设计题目:数据结构课程设计专业:班级:
设计人:
一、 需求分析
1. 演示程序以用户和计算机的对话方式执行,即在计算机终端上
显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。 2. 程序执行的命令包括:
1) 创建一元多项式1; 2) 创建一元多项式2; 3) 输出一元多项式
4) 计算多项式1和多项式2的和; 5) 计算多项式1和多项式2的差
注意:输出形式为整数序列n,c1,e1,c2,e2,…,cn,en ,其中n 是多项式的项数,ci 和ei 分别是第I 项的系数和指数,序列指指数降序排列
3.测试数据
1) )
72111.3()1157()1.352(91198118+++-=+-+-+x x x x x x x x ;
2) )1()()1(25435432+++=--++++++x x x x x x x x x x ; 3) 0)()(33=--++x x x x 4) )(0)(2332x x x x x x ++=+++
二、 概要设计
为实现上述程序功能,应以带头结点的单链表存储多项式
1. 多项式的抽象数据类型为:
ADT Polynmial{
数据对象:D={a i |ai ∈TermSet ,i=1,2,3,…,m ,TermSet 中的每一个元素包含一个表示系数的实数和表
示指数的整数}
数据关系:R1={a i-1,a i∈D,且a i-1中的指数 i的指数,i=2,3,…,n} 基本操作: CreatePolyn(&P,m) 操作结果:输入m项的系数和指数,建立一元多项式P DestroyPolyn(&P) 初始条件:一元多项式P已存在 操作结果:销毁一元多项式P printPolyn(P) 初始条件:一元多项式P已存在 操作结果:打印输出一元多项式P PolynLength(P) 初始条件:一元多项式P已存在 操作结果:返回一元多项式P的项数 AddPolyn(&Pa,&Pb) 初始条件:一元多项式Pa和Pb已存在 操作结果:完成多项式相加的运算 SubtractPolyn(&Pa,&Pb) 初始条件:一元多项式Pa和Pb已存在 操作结果:完成多项式相减的运算 }ADT Polynmial 2.本程序包含四个模块 1)主程序模块: Void main(){ 创建多项式a,b; 人机交互界面; 输入命令; 处理命令; 结束程序; } 2)多项式单元模块 3)结点结构单元模块 三、详细设计 1.多项式的存储结构: typedef struct Polynomial { double coef;//系数 int expn;//指数 struct Polynomial *next; }*Polyn,Polynomial; 2.多项式抽象数据类型的基本操作的伪代码 Polyn CreatePolyn(Polyn head,int m) { //建立一个头指针为head、项数为m的一元多项式 p=head=(Polyn)malloc(sizeof(struct Polynomial)); head->next=NULL; for(i=0; i { p=(Polyn)malloc(sizeof(struct Polynomial));//建立 新结点以接收数据 printf("请输入第%d项的系数与指数:",i+1); scanf("%lf %d",&p->coef,&p->expn); Insert(p,head); //调用Insert函数插入结点 } return head; } void DestroyPolyn(Polyn p) { //销毁多项式p q1=p->next; q2=q1->next; while(q1->next) { free(q1); q1=q2; q2=q2->next; } } void Insert(Polyn p,Polyn h) { if(p->coef==0) free(p);//系数为0的话释放结点 else { q1=h; q2=h->next; while(q2&&p->expn //查找插入位置 q1=q2; q2=q2->next; } if(q2&&p->expn==q2->expn) { //将指数相同相合并 q2->coef+=p->coef; free(p); if(!q2->coef) { //系数为0的话释放结点 q1->next=q2->next; free(q2); } } else { //指数为新时将结点插入 p->next=q2; q1->next=p; } } } void PrintPolyn(Polyn P) { Polyn q=P->next; int flag=0;//项数计数器 while(q) { flag++; q=q->next; } q=P->next; if(!q) { //若多项式为空,输出0 putchar('0'); printf("\n"); return; } printf("%d ",flag); while(q) { if(q->coef!=1&&q->coef!=-1) { printf("%g %d ",q->coef,q->expn); } else { if(q->coef==1) { printf("%g %d ",q->coef,q->expn); } if(q->coef==-1) { printf("%g %d ",q->coef,q->expn); } } q=q->next; } printf("\n"); } int compare(Polyn a,Polyn b) { if(a&&b) { if(!b||a->expn>b->expn) return 1; else if(!a||a->expn else return 0; } else if(!a&&b) return -1;//a多项式已空,但b多项式非 空 else return 1;//b多项式已空,但a多项式非空 } Polyn AddPolyn(Polyn pa,Polyn pb) //求解并建立多项式a+b,返回其头指针 { Polyn qa=pa->next; Polyn qb=pb->next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点 hc->next=NULL; headc=hc; while(qa||qb) { qc=(Polyn)malloc(sizeof(struct Polynomial)); switch(compare(qa,qb)) { case 1: { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; } case 0: { qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; } case -1: { qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; } } if(qc->coef!=0) { qc->next=hc->next; hc->next=qc; hc=qc; } else free(qc);//当相加系数为0时,释放该结点 } return headc; } Polyn SubtractPolyn(Polyn pa,Polyn pb) //求解并建立多项式a-b,返回其头指针 { Polyn h=pb; Polyn p=pb->next; Polyn pd; while(p) { //将pb的系数取反 p->coef*=-1; p=p->next; } pd=AddPolyn(pa,h); for(p=h->next; p; p=p->next) //恢复pb的系数 p->coef*=-1; return pd; } 3.主函数及其他函数的伪代码算法 Int main() { CreatPolyn(a); CreatPolyn(b); 交互界面菜单; Switch(choose) { Case a: printf(a); Case b: printf(b); Case c: printf(a+b); Case d: printf(a-b); Case e: exit; } } 四、测试结果 1.人机交互界面 2.测试结果显示 )72111.3()1157()1.352(91198118+++-=+-+-+x x x x x x x x )1()()1(25435432+++=--++++++x x x x x x x x x x 0)()(33=--++x x x x )(0)(2332x x x x x x ++=+++ 五、 总结反思 经过这段为期不久的课程设计,使我对于数据结构有了更深层次的理解,对于链表这种数据结构的认识也更加深刻了。 在这个过程中。我曾因为实践经验缺乏,错误过多失落过;也曾经仿真成功而热情高涨。我也感觉用心细心地做好一件事情的重要性,在这次课程设计中,体会到了做设计的严谨,更加加深了我对课程设计的兴趣。在此次课程设计过程中,遇到不懂的问题我会及时向老师,同学请教或者是在网上查询相关的资料,以更好地完成该项课题设计。 在实践结束后,深深地体会到实践对于工科专业的重要性。在学习数据结构的过程中总是觉得有些东西模棱两可,感觉到不能深一步的理解,也因为代码的冗长而缺乏耐心去完成每一个。通过这次课程设计,原本关于链表的模棱两可的东西逐渐变得清晰起来,以后一定加强动手实践的能力,多动手,多思考!