输出List2节点;(系数要取负再输出)
指针后移;
Else
两链表指针都后移;
if(链表1到头)
输出链表2剩余的节点;
else(即链表二到头)
输出链表1剩余的节点;
}
6)求值函数:
voidCalc()
{
输入x的值;
依次调用链表一的节点,求出单项式的值相加后输出;
}
7)求导函数:
voidDaohanshu()
{
输出多项式一的导函数;
}
三、详细设计
#include
#include
#include
typedefstructLNode//元素类型
{
floatxishu;
intzhishu;
structLNode*next;
}LNode,*Linklist;
LinklistList1=NULL;
LinklistList2=NULL;
LinklistIn(LinklistL)//依次往链尾插
{
Linklistp;
floata;
intb;
Linklisthead=(Linklist)malloc(sizeof(LNode));
L=head;
head->zhishu=0;//head->zhishu头结点放的是多项式的项数
p=head;
p->next=NULL;
printf("请输入一个多项式:
\n");
while(scanf("%f%d",&a,&b)&&(a||b))//默认多项式是按指数由小到大输入
{
//printf("%f%d\n",a,b);
(head->zhishu)++;
//printf("%3d\n",L->zhishu);
Linklistq=(Linklist)malloc(sizeof(LNode));
q->xishu=a;
q->zhishu=b;
if(p->next==NULL)
{
p->next=q;
q->next=NULL;
p=head;
}
else
{
if(p->next->zhishu<=q->zhishu)
{
q->next=p->next;
p->next=q;
p=head;
}
else
{
p=p->next;
}
}
}
printf("您已成功输入一个多项式!
!
\n");
returnL;
}
voidInput()
{
List1=In(List1);
List2=In(List2);
}
voidOut(LinklistL)
{
Linklistp;
p=L->next;
printf("此多项式有%3d项",L->zhishu);
while(p!
=NULL)//按指数由大到小输出
{
printf("%0.1f%3d",p->xishu,p->zhishu);
p=p->next;
}
printf("\n");
}
voidOutput()
{
printf("第一个多项式为:
\n");
Out(List1);
printf("第二个多项式为:
\n");
Out(List2);
}
voidAdd()
{
Linklistp1,p2;
p1=List1->next;
p2=List2->next;
printf("相加后的多项式为:
\n");
while(p1&&p2)
{
if(p1->zhishu>p2->zhishu)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
elseif(p1->zhishuzhishu)
{
printf("%0.1f%3d",p2->xishu,p2->zhishu);
p2=p2->next;
}
else
{
printf("%0.1f%3d",p1->xishu+p2->xishu,p1->zhishu);
p1=p1->next;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2)
{
printf("%0.1f%3d",p2->xishu,p2->zhishu);
p2=p2->next;
}
}
else
{
while(p1)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
}
printf("\n");
}
voidSub()
{
Linklistp1,p2;
p1=List1->next;
p2=List2->next;
printf("相减后的多项式为:
\n");
while(p1&&p2)
{
if(p1->zhishu>p2->zhishu)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
elseif(p1->zhishuzhishu)
{
printf("%0.1f%3d",-p2->xishu,p2->zhishu);
p2=p2->next;
}
else
{
if(p1->xishu-p2->xishu!
=0)
{
printf("%0.1f%3d",p1->xishu-p2->xishu,p1->zhishu);
}
p1=p1->next;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2)
{
printf("%0.1f%3d",-p2->xishu,p2->zhishu);
p2=p2->next;
}
}
else
{
while(p1)
{
printf("%0.1f%3d",p1->xishu,p1->zhishu);
p1=p1->next;
}
}
printf("\n");
}
voidCalc()
{
intx;
doublesum=0;
Linklistp;
printf("请输入x的值:
");
scanf("%d",&x);
p=List1->next;
while(p)
{
sum+=p->xishu*pow(x,p->zhishu);
p=p->next;
}
printf("多项式1在x处的值为:
%0.1lf",sum);
printf("\n");
}
voidDaohanshu()
{
Linklistp;
p=List1->next;
printf("多项式1的导函数为:
\n");
while(p)
{
printf("%0.1f%3d",p->xishu*p->zhishu,p->zhishu-1);
p=p->next;
}
printf("\n");
}
intmain()
{
intnum;
while
(1)
{
printf("-----------------------------------------------\n");
printf("1-------输入并建立多项式;\n");
printf("2-------输出其指系数排列;\n");
printf("3-------多项式相加;\n");
printf("4-------多项式相减;\n");
printf("5-------计算多项式在x处的值;\n");
printf("6-------求多项式a的导函数a';\n");
printf("0-------退出\n");
printf("-----------------------------------------------\n");
printf("请输入您要选择的功能:
");
scanf("%d",&num);
switch(num)
{
case1:
Input();break;//输入函数
case2:
Output();break;//输出函数
case3:
Add();break;//函数相加
case4:
Sub();break;//函数相减
case5:
Calc();break;//计算函数在x处的值
case6:
Daohanshu();break;//求函数的导函数
case0:
exit
(1);
default:
printf("输入错误,请重新输入!
!
!
");
}
}
free(List1);
free(List2);
return0;
}
四、调试分析
1.由于链表是设置成为全局变量,所以任意函数都可以修改它,存在一定风险性。
但这也为后来的函数方便了,所有的函数统一没有参数。
2.刚开始时曾忽略了一些变量的类型以及没有考虑到指针的返回问题,使调试程序浪费了一定的时间。
今后应重视确定参数的变量和赋值属性的区分和标识。
3.本程序模块简洁,在main()函数里得到充分体现;
4.链表默认用户输入是按指数从小到大的顺序输入的,而默认输出时按指数从大到小;输入时,依次把节点插在链表的末端。
五、用户手册
1.本程序运行环境为Windows操作系统,执行文件为:
std.exe
2.进入演示程序后显示的界面:
六、测试结果
中南民族大学
数据结构课程设计报告
姓名:
康宇
年级:
2010
学号:
10061014
专业:
计算机科学与技术
指导老师:
宋中山
2013年4月15日
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求