数据结构课程设计_数据结构课程设计全
数据结构课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构课程设计全”。
南京航空航天大学金城学院
《数据结构》 课程设计报告
题目:一元多项式的加减乘法运算
班级: 20100232 学号: 2010023220 姓名: 祁博 成绩:
指导教师: 叶延风
完成日期: 2012年 2月18 日
课程设计的主要内容 需求分析
1.1课程设计题目
用线性表实现一元多项式的加法减法与乘法。
1.2课程设计的任务及要求
任务:利用所学线性表知识来完成计算器中一元多项式的加法减法与乘法的运算。要求:能自己创建线性表,能自主的进行线性表的有关插入删除操作,并且可以在此基础上实现线性表之间的加减乘除运算。
1.3课程设计思想
首先要定义一个结构体,其中定义一元多项式的两个参数,系数和指数和链表中的指针域,然后一一罗列每个在主程序中得到的函数,并一一实现,最后在主程序中主要完成用户的输入和相关程序的调用。
1.4软件开发的环境
VC++6.0。
2.程序源代码
#include #include
typedef struct node{//定义节点类型
float coef;int expn;
struct node * next;}Ployn;
void menu()//用户选择界面
{
printf(“************************************n”);
printf(“ 两个一元多项式的相加/相减,相乘:n”);
printf(“************************************n”);
printf(“请选择操作:n”);
printf(“0.退出n”);
printf(“1.两个一元多项式相加n”);
printf(“2.两个一元多项式相乘n”);
printf(“3.两个一元多项式相减n”);
}
void insert(Ployn *head,Ployn *inpt)//查找位置插入新链节程序
{
Ployn *pre,*now;
int signal=0;
pre=head;//pre定义为现在的前一个链节
if(pre->next==NULL){pre->next=inpt;}
else {now=pre->next;while(signal==0){
if(inpt->expn>now->expn)//当新链节小于现在的连接时向后移一个链节
{
if(now->next==NULL)
{
now->next=inpt;
signal=1;
}
else
{
pre=now;
now=pre->next;
}
}
else if(inpt->expnexpn)//如果发现比现在的链节大了就插入到这个连接的前面
{
inpt->next=now;
pre->next=inpt;
signal=1;
}
else
{
now->coef=now->coef+inpt->coef;
signal=1;
free(inpt);//与当前链节相等指数
if(now->coef==0)
{
pre->next=now->next;
free(now);
}
} } } }
Ployn *creat(char ch)//输入多项式
{
Ployn *head,*inpt;
float x;
int y;
head=(Ployn *)malloc(sizeof(Ployn));//创建链表头
head->next=NULL;
printf(“请输入一元多项式%c:(格式是:系数 指数;以0 0 结束!)n”,ch);
scanf(“%f %d”,&x,&y);
while(x!=0)
{
inpt=(Ployn *)malloc(sizeof(Ployn));//创建新链节
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);//不然就查找位置并且插入新链节
printf(“请输入一元多项式%c的下一项:(以0 0 结束!)n”,ch);
scanf(“%f %d”,&x,&y);
}
return head;}
Ployn *addPloyn(Ployn *head,Ployn *pre)//多项式相加
{
Ployn *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当现在指向空时跳出循环
else
{
pre=pre->next;
inpt=(Ployn *)malloc(sizeof(Ployn));//创建新链节
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否则把当前“g(x)”的链节插入到“y(x)”中
}
return head;}
Ployn *minusPloyn(Ployn *head,Ployn *pre)//多项式相加
{
Ployn *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当现在指向空时跳出循环
else
{
pre=pre->next;
inpt=(Ployn *)malloc(sizeof(Ployn));//创建新链节
inpt->coef=0-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否则把当前“g(x)”的链节插入到“y(x)”中
}
return head;}
Ployn *byPloyn(Ployn *head1,Ployn *head2)//多项式相乘
{
Ployn *inpt,*res,*pre;
int flag=0;
res=(Ployn *)malloc(sizeof(Ployn));//创建链表头
res->next=NULL;
head1=head1->next;
pre=head2;
while(flag==0)
{
if(pre->next==NULL)
{
pre=head2;//当现在指向空时跳出循环
head1=head1->next;
continue;
}
if(head1==NULL)
{
flag=1;//当现在指向空时跳出循环
continue;
}
pre=pre->next;
inpt=(Ployn *)malloc(sizeof(Ployn));//创建新链节
inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);//把当前“g(x)”的链节插入到“y(x)”中
}
return res;}
void print(Ployn *fun)//输出多项式
{
Ployn *printing;
int flag=0;
printing=fun->next;//正在被打印的链节
if(fun->next==NULL)//如果函数为空打印0
{
printf(“0n”);
return;}
while(flag==0)
{
if(printing->coef>0 && fun->next!=printing)
printf(“+”);//为正数且不为第一项时打印“+”号
if(printing->coef==1);//如果为“1”就不用打印系数了
else if(printing->coef==-1)
printf(“-”);//如果为“-1”就打印“-”号就行了
else
printf(“%f”,printing->coef);//其余情况都得打印
if(printing->expn!=0)//如果指数为“0”不打印指数项
{ if(printing->expn==1)printf(“x”);
else printf(“x^%d”,printing->expn);
}
else if((printing->coef==1)||(printing->coef==-1))
printf(“1”);
if(printing->next==NULL)
flag=1;//如果现在的链节没有下一个就结束
else
printing=printing->next;
}
printf(“n”);}
void main(){
Ployn *f,*g;
int sign=-1;//设置标志
menu();
while(sign!=0)
{
scanf(“%d”,&sign);
switch(sign){
case 0: break;//退出
case 1:
{
printf(“你选择的操作是多项式相加:n”);
f=creat('f');//输入多项式f(x)
printf(“f(x)=”);
print(f);
g=creat('g');//输入多项式g(x)
printf(“g(x)=”);
print(g);
printf(“F(x)=f(x)+g(x)=”);
f=addPloyn(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
menu();//回复用户选择界面
break;
}
case 2:
{
printf(“你选择的操作是多项式相乘:n”);
f=creat('f');//输入多项式f(x)
printf(“f(x)=”);
print(f);
g=creat('g');//输入多项式g(x)
printf(“g(x)=”);
print(g);
printf(“F(x)=f(x)*g(x)=”);
f=byPloyn(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
menu();//回复用户选择界面
break;
}
case 3:
{
printf(“你选择的操作是多项式相减:n”);
f=creat('f');//输入多项式f(x)
printf(“f(x)=”);
print(f);
g=creat('g');//输入多项式g(x)
printf(“g(x)=”);
print(g);
printf(“F(x)=f(x)-g(x)=”);
f=minusPloyn(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
menu();//回复用户选择界面
break;
}
default:
{
printf(“输入有误!请重新选择操作!n”);//选择错误,返回选择界面
menu();
break;
}
}
} }
3.心得体会
每次做课设都有很大的收获。课设不仅是对课本知识的理论实践,更是对自我的一种挑战。
这次课设过程中,遇到很多的问题,让我有种无从下手的感觉,但是办法总比困难多,于是,在老师、同学的帮助下,以及自己在翻书、上网找资料的情况下,顺利解决问题。于是,我又上课的认识到,团队的重要性。