《多项式相加、相乘 程序设计类课程报告》由会员分享,可在线阅读,更多相关《多项式相加、相乘 程序设计类课程报告(10页珍藏版)》请在金锄头文库上搜索。
1、福建农林大学计算机与信息学院(程序设计类课程)实验报告课程名称:姓 名:系:专 业:年 级:学 号:指导教师:职 称:福建农林大学计算机与信息学院实验报告系: 计算机 专业: 计算机科学与技术 年级: 姓名: 学号: 实验室号_ 计算机号 实验一 线性表及其应用(多项式相加、相乘)一、 实验目的和要求1、 熟悉tc的运行环境,并可以熟练的使用tc;2、掌握链表存储的方法以及基本操作;3、掌握内存的动态分配和释放方法;4、熟悉C语言程序的基本格式与规范。二、 实验内容和原理1、实验内容:设计一个一元多项式的简单计算程序,其基本功能有:(1)输入并建立多项式;(2)输出多项式;(3)多项式的相加减
2、;(4)多项式的相乘。利用单链表实现。2、实验原理:将两多项式存入链表lianbiao1、lianbiao2,用pointer1扫描lianbiao1,pointer2扫描lianbiao2,结果保存在lianbiao3中(用pointer3来创建lianbiao3)三、 实验环境硬件:(1)学生用微机(2)多媒体实验教室(3)局域网环境软件:(1)Windows XP中文操作系统 (2)Turbo C 3.0四、 算法描述及实验步骤1、描述1. 定义创建链表的函数,然后创建三个链表,一个用于存放结果。2. 定义多项式相加的函数实现多项式的相加功能,定义多项式的相乘功能。3. 定义打印链表和释
3、放链表的函数。4. 最后在主函数里面调用这些函数,实现多项式的相加和相乘。例子:A(X)=3X+7X6-9X9B(X)=2X-3+7-3X+8X3+X5(1)执行加法操作,输出“lianbiao1+lianbiao2:(2,-3) (7,0) (8,5) (1,5) (7,6) (-9,9)”(2)执行乘法操作,输出“lianbiao1*lianbiao2:(6,-2) (21,1) (-9,2) (14,3) (55,6) (3,6) (-21,7) (-63,9) (27,10) (56,11) (7,11) (-72,14) (-9,14)”2、框图3、代码(注释)#include st
4、dio.h /* 输入输出函数的头文件 */#include alloc.h /* alloc.h是动态分配内存空间头文件 */typedef struct node/* 定义节点,包含两个数据域(c和e)和一个指针域(*next)*/int c,e;/*c是指多项式的系数, e是项的指数*/struct node *next;/* 定义next为指向下一个结点的指针*/Pn;/*定义Pn类型*/Pn *create()/*创建链表*/Pn *pointer,*lianbiao;int n;lianbiao=malloc(sizeof(Pn);/*用malloc动态分配函数给链表分配内存空间*
5、/printf(n:);/*提示用户输入多项式的项数*/scanf(%d,&n);/*接收用户输入的多项式的项数*/pointer=lianbiao;while(n)/*对n进行判断,当n不为零时执行while循环语句*/pointer-next=malloc(sizeof(Pn);/*为链表新的节点申请空间*/pointer=pointer-next;/*将pointer下移*/printf(c e:);scanf(%d %d,&pointer-c,&pointer-e);/*将系数c,指数e存入链表中的新节点*/n-;/*没当输入一项时,项数n就减一*/pointer-next=NULL;
6、/*如果pointer指向的下一个结点的指针域为空,说明链表已经创建好了*/return lianbiao; void OUT(Pn *lianbiao)/*打印输出链表*/Pn *pointer=lianbiao-next;while(pointer)/*打印出当前的结点系数c和指数e, 直到链表为空*/printf(%d,%d) ,pointer-c,pointer-e);/*打印出多项式系数c和指数e*/pointer=pointer-next;/*打印出当前结点后,将指针移到下一个节点*/printf(n);/*用n换行*/void Free(Pn *lianbiao)/*释放链表空间
7、*/Pn *pointer=lianbiao;/*将pointer指向头节点*/while(pointer)/*释放链表中的结点,直到pointer链表为空时推出循体*/lianbiao=lianbiao-next;/*删除当前节点*/free(pointer);/*释放当前结点的空间*/pointer=lianbiao;/* 当pointer指向头结点指针时结束循环*/Pn *add(Pn *lianbiao1,Pn *lianbiao2)/*多项式相加*/Pn *lianbiao3,*pointer3,*pointer1=lianbiao1-next,*pointer2=lianbiao2
8、-next;/*建立新的链表lianbiao3,用于存放lianbiao1与lianbiao2相加后的结果*/int c,e;/*这里的c为多项式相加后的系数,而e为结点相加后的指数*/pointer3=lianbiao3=malloc(sizeof(Pn);/*用malloc为lianbiao3申请空间*/lianbiao3-next=NULL;while(pointer1|pointer2) /*当pointer1或pointer2不为空时,分成3种情况*/if(pointer1&(pointer2=NULL|pointer1-ee)/*第一种是当pointer1不空并且pointer2为
9、空,或者pointer1所指的指数e小于pointer2所指的指数e时*/c=pointer1-c;/*将pointer1当前所指结点的系数c赋值给c*/e=pointer1-e;/*将pointer1当前所指结点的系数e赋值给e*/pointer1=pointer1-next;/*将pointer1移到下一结点*/else if(pointer2&(pointer1=NULL|pointer2-ee) /*第二种是当pointer2不空且pointer1为空或者pointer2所指的指数e小于pointer1所指的指数e时*/c=pointer2-c;e=pointer2-e;pointer
10、2=pointer2-next;else /*第三种是当pointer1、pointer2都不为空且pointer1的指数e等于pointer2的指数e时*/c=pointer1-c+pointer2-c;/*将pointer1与pointer2所指的系数相加*/e=pointer1-e;pointer1=pointer1-next;/*将pointer1下移*/pointer2=pointer2-next;/*将pointer2下移*/if(c)pointer3-next=malloc(sizeof(Pn);/*申请新结点的空间*/pointer3=pointer3-next;/*point
11、er3下移*/pointer3-c=c;/*把系数c放入新结点*/pointer3-e=e;/*把指数e放入新结点*/pointer3-next=NULL;/*当所指的指针为NULL时,链表结束*/return lianbiao3;/* 返回两个多项式相加的结果lianbiao3 */Pn *mx1(Pn *pointer1,Pn *lianbiao2) /*多项式相乘*/Pn *lianbiao3,*pointer3,*pointer2=lianbiao2-next;/*定义链表lianbiao3 */pointer3=lianbiao3=malloc(sizeof(Pn);/*为lianb
12、iao3申请空间, 并将pointer3指向lianbiao3*/lianbiao3-next=NULL;while(pointer2)/* 当pointer2不为空时, 执行while循环*/pointer3-next=malloc(sizeof(Pn);/*为新创结点申请空间*/pointer3=pointer3-next;/*将pointer3指向新结点*/pointer3-c=pointer1-c*pointer2-c;/*将pointer1的系数乘以pointer2-c*/pointer3-e=pointer1-e+pointer2-e;/*将pointer1的指数乘以pointer
13、2-e*/pointer2=pointer2-next;/*pointer2下移*/pointer3-next=NULL;return lianbiao3;/*将结果lianbiao3返回*/Pn *mxm(Pn *lianbiao1,Pn *lianbiao2)/*多项式相乘*/Pn *lianbiao3,*pointer1=lianbiao1-next,*htemp;lianbiao3=malloc(sizeof(Pn);lianbiao3-next=NULL;while(pointer1)/*当pointer1不为空,执行while循环*/htemp=mx1(pointer1,lianbiao2);/*将相乘结果放到链表htemp*/lianbiao3=add(lianbiao3,htemp);/*将htemp中