数据结构课程设计帅文档格式.docx
《数据结构课程设计帅文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计帅文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
![数据结构课程设计帅文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/877eda14-e6fd-4c15-8639-04170b7b0b4c/877eda14-e6fd-4c15-8639-04170b7b0b4c1.gif)
输出函数输出多项式,voidPrint(PolynP)
销毁多项式函数释放内存,voidDestroy(Polynp)
主函数,voidmain()
2、主程序的流程基函数调用说明
(1)typedefstructPolynomial
{
floatcoef;
intexpn;
structPolynomial*next;
}*Polyn,Polynomial;
在这个结构体变量中coef表示每一项前的系数,expn表示每一项的指数,polyn为结点指针类型,属于抽象数据类型通常由用户自行定义,Polynomial表示的是结构体中的数据对象名。
(2)当用户输入两个一元多项式的系数和指数后,建立链表,存储这两个多项式,主要说明如下:
PolynCreatePolyn(Polynhead,intm)建立一个头指针为head、项数为m的一元多项式
p=head=(Polyn)malloc(sizeof(structPolynomial));
为输入的多项式申请足够的存储空间
p=(Polyn)malloc(sizeof(structPolynomial));
建立新结点以接收数据
Insert(p,head);
调用Insert函数插入结点
这就建立一元多项式的关键步骤
(3)由于多项式的系数和指数都是随即输入的,所以根据要求需要对多项式按指数进行降幂排序。
在这个程序模块中,使用链表,根据对指数大小的比较,对各种情况进行处理,此处由于反复使用指针对各个结点进行定位,找到合适的位置再利用void
Insert(Polyn
p,Polyn
h)进行插入操作。
(4)加、减、乘、除、的算法实现:
在该程序中,最关键的一步是实现四则运算和输出,由于加减算法原则是一样,减法可通过系数为负的加法实现;
对于乘除算法的大致流程都是:
首先建立多项式a*b,a/b,然后使用链表存储所求出的乘积,商和余数。
这就实现了多项式计算模块的主要功能。
(5)另一个子函数是输出函数
PrintPolyn();
输出最终的结果,算法是将最后计算合并的链表逐个结点依次输出,便得到整链表,也就是最后的计算式计算结果。
由于考虑各个结点的指数情况不同,分别进行了判断处理。
四、程序新点
通过多次写程序,发现程序在控制台运行时总是黑色的,本次写程序就想着改变一下,于是经过查资料利用system("
ColorE0"
);
函数可以解决,这里“E0”,E是控制台背景颜色,0是控制台输出字体颜色。
五、设计中遇到的问题及解决办法
首先是,由于此次课程设计里使用指针使用比较多,自己在指针多的时候易脑子混乱出错,对于此问题我是采取比较笨的办法在稿纸上写明白后开始进行代码编写。
其次是,在写除法模块时比较复杂,自己通过查资料最后成功写出除法模块功能。
最后是,前期分析不足开始急于写代码,中途出现各种问题,算是给自己以后设计时的一个经验吧。
六、测试(程序截图)
1.数据输入及主菜单
2.加法和减法模块
3.乘法和除法模块
七、总结
通过本次应用C语言设计一元多项式基本计算程序,使我更加巩固了C语言程序设计的知识,以前对指针这一点使用是比较模糊,现在通过此次课程设计对指针理解的比较深刻了。
而且对于数据结构的相关算法和函数的调用方面知识的加深。
本次的课程设计,一方面提高了自己独立思考处理问题的能力;
另一方面使自己再设计开发程序方面有了一定的小经验和想法,对自己以后学习其他语言程序设计奠定了一定的基础。
八、指导老师评语及成绩
附录:
(课程设计代码)
#include<
stdio.h>
malloc.h>
stdlib.h>
typedefstructPolynomial
{
}*Polyn,Polynomial;
//Polyn为结点指针类型
voidInsert(Polynp,Polynh)
{
if(p->
coef==0)free(p);
//系数为0的话释放结点
else
Polynq1,q2;
q1=h;
q2=h->
next;
while(q2&
&
p->
expn<
q2->
expn)//查找插入位置
{q1=q2;
q2=q2->
}
if(q2&
expn==q2->
expn)//将指数相同相合并
{
q2->
coef+=p->
coef;
free(p);
if(!
coef)//系数为0的话释放结点
{q1->
next=q2->
free(q2);
}
{p->
next=q2;
q1->
next=p;
}//指数为新时将结点插入
}
//建立一个头指针为head、项数为m的一元多项式
PolynCreate(Polynhead,intm)
inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));
head->
next=NULL;
for(i=0;
i<
m;
i++)
p=(Polyn)malloc(sizeof(structPolynomial));
//建立新结点以接收数据
printf("
请输入第%d项的系数与指数:
"
i+1);
scanf("
%f%d"
&
coef,&
expn);
Insert(p,head);
//调用Insert函数插入结点
returnhead;
//销毁多项式p
voidDestroy(Polynp)
q1=p->
q2=q1->
while(q1->
next)
free(q1);
q1=q2;
//指针后移
//输出多项式p
intPrint(PolynP)
Polynq=P->
intflag=1;
//项数计数器
q)//若多项式为空,输出0
putchar('
0'
\n"
return;
while(q)
if(q->
coef>
0&
flag!
=1)putchar('
+'
//系数大于0且不是第一项
coef!
=1&
q->
=-1)//系数非1或-1的普通情况
%g"
q->
coef);
expn==1)putchar('
X'
elseif(q->
expn)printf("
X^%d"
coef==1)
expn)putchar('
1'
elseprintf("
coef==-1)
-1"
expn==1)printf("
-X"
-X^%d"
q=q->
flag++;
intcompare(Polyna,Polynb)
if(a&
b)
b||a->
expn>
b->
expn)return1;
elseif(!
a||a->
expn)return-1;
elsereturn0;
a&
b)return-1;
//a多项式已空,但b多项式非空
elsereturn1;
//b多项式已空,但a多项式非空
//求解并建立多项式a+b,返回其头指针
PolynAdd(Polynpa,Polynpb)
Polynqa=pa->
Polynqb=pb->
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));
//建立头结点
hc->
headc=hc;
while(qa||qb){
qc=(Polyn)malloc(sizeof(structPolynomial));
switch(compare(qa,qb))
case1:
qc->
coef=qa->
expn=qa->
expn;
qa=qa->
break;
case0:
coef+qb->
qb=qb->
case-1:
coef=qb->
expn=qb->
if(qc->
=0)
next=hc->
next=qc;
hc=qc;
elsefree(qc);
//当相加系数为0时,释放该结点
returnheadc;
//求解并建立多项式a-b,返回其头指针
PolynSubtract(Polynpa,Polynpb)
Polynh=pb;
Polynp=pb->
Polynpd;
while(p)//将pb的系数取反
coef*=-1;
p=p->
pd=Add(pa,h);
for(p=h->
p;
p=p->
next)//恢复pb的系数
p->
returnpd;
//求解并建立多项式a*b,返回其头指针
PolynMultiply(Polynpa,Polynpb)
Polynhf,pf;
hf=(Polyn)malloc(sizeof(structPolynomial));
hf->
for(;
qa;
qa=qa->
for(qb=pb->
qb;
qb=qb->
pf=(Polyn)malloc(sizeof(structPolynomial));
pf->
coef*qb->
expn+qb->
Insert(pf,hf);
//调用Insert函数以合并指数相同的项
returnhf;
//求解并建立多项式a/b,返回其头指针
voidDevice(Polynpa,Polynpb)
Polynhf,pf,temp1,temp2;
//建立头结点,存储商
//建立头结点,存储余数
temp1=(Polyn)malloc(sizeof(structPolynomial));
temp1->
temp2=(Polyn)malloc(sizeof(structPolynomial));
temp2->
temp1=Add(temp1,pa);
while(qa!
=NULL&
qa->
=qb->
expn)
next=(Polyn)malloc(sizeof(structPolynomial));
next->
coef=(qa->
coef)/(qb->
expn=(qa->
expn)-(qb->
Insert(temp2->
next,hf);
pa=Subtract(pa,Multiply(pb,temp2));
qa=pa->
pf=Subtract(temp1,Multiply(hf,pb));
pb=temp1;
商是:
Print(hf);
余数是:
Print(pf);
voidmain()
intchoose=1;
intm,n,flag=0;
system("
Polynpa=0,pb=0,pc,pd,pf;
//定义各式的头指针,pa与pb在使用前付初值NULL
请输入A(x)的项数:
%d"
m);
pa=Create(pa,m);
//建立多项式A
请输入B(x)的项数:
n);
pb=Create(pb,n);
//建立多项式B
**********************************************\n"
*多项式操作菜单*\n"
\t\t1.输出操作\n"
\t\t2.加法操作\n"
\t\t3.减法操作\n"
\t\t4.乘法操作\n"
\t\t5.除法操作\n"
\t\t6.退出操作\n"
while(choose)
执行操作:
flag);
switch(flag)
多项式A(x):
Print(pa);
多项式B(x):
Print(pb);
case2:
pc=Add(pa,pb);
多项式A(x)+B(x):
Print(pc);
Destroy(pc);
break;
case3:
pd=Subtract(pa,pb);
多项式A(x)-B(x):
Print(pd);
Destroy(pd);
case4:
pf=Multiply(pa,pb);
多项式A(x)*B(x):
Destroy(pf);
case5:
Device(pa,pb);
case6:
exit(0);
Destroy(pa);
Destroy(pb);