一元多项式相加数据结构实验一-1307班谭淇蔚.docx
《一元多项式相加数据结构实验一-1307班谭淇蔚.docx》由会员分享,可在线阅读,更多相关《一元多项式相加数据结构实验一-1307班谭淇蔚.docx(96页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date一元多项式相加数据结构实验一-1307班谭淇蔚一元多项式相加数据结构实验一-1307班谭淇蔚中南大学数据结构与算法课程实验实验报告题 目 实验一 线性表的操作 学生姓名 谭淇蔚 学生学号 3901130721 专业班级 软件工程1307班 完成日期 2014年3月31日星期一 实验一 线性表的操作(一元多项式相加)1. 需求分析 我们使用计算机处理的对象之间通常存在着
2、的是一种最简单的线性关系,这类数学模型可称为线性的数据结构。而数据存储结构有两种:顺序存储结构和链式存储结构。线性表是最常用且最简单的一种数据结构。所以我们做的是实验一-线性表的操作。实验的目的是掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算以及熟练运用掌握的线性表的操作,实现一元n次多项式的加法运算。学习实现一元n次多项式的加法是符号多项式的操作,是表处理的典型用例,需要注意的是:顺序存储结构指的是用数组方法,使用数组方法实现时,在插入和删除的方面,数组不如链表灵活,方法复杂,删除其中一个需要将其后的数组元素改变位置,使其数组保持原有的顺序结
3、构,在查找方面较链表简单,只需要知道其下标就可以知道。链接存储结构指的是用链表方法,值得注意的是,删除和插入较为灵活,不需要变动大多数元素,但是查找过程相对于数组这种顺序存储结构来说较为复杂,耗时巨大。我们要学习的是通过对两种方法基本操作的掌握来做到实现一元n次多项式的相加减。 我们程序的任务是:能进行简单的线性表操作(插入、删除、查找)以及线性表合并等运算。能通过这些基本操作实现一元多项式相加。明确规定:输入的形式:按照提示(比如:“请您输入第一个结构体数组的项数(不超过50项):”、“请您输入第二个结构体数组的项数(不超过50项):”、“请输入第n项的系数”、“请输入第n项的指数”等等),
4、先输入多项式的项数,之后顺次输入每一项的系数与指数。输入值的范围:项数没有要求,但不能过于巨大;系数取为float型数据,指数取为int型数据,输出的形式:按照提示(比如:“您输入的第一个多项式为:”、“您输入的第二个多项式为:”等等),会输出原输入的多项式和经过排序和合并之后的降幂型多项式。同时,系数会以保留小数点后两位数字的形式输出;若指数输入时为小数,则输出时会自动截取其整数部分。程序所能达到的功能:程序可以对输入的序列紊乱的多项式进行加工,使之按照降幂排列,之后对两多项式进行加法运算(包括系数为负的加法),最后输出最终的多项式。测试数正确数据:输入:2*X3+2*X6+2*X7+2*X
5、8+2*X10 和 - 3*X10+4*X8+2*X7+3*X5+3*X3输出:7.00*X2+8.00*X1+2.00错误数据:输入:-8*X1.5+4*X2 和 3*X2+12*X1.6输出:7.00*X2+4.00*X12概要设计(1)链接存储结构:struct node float coef; int expo; struct node *next;chainLink;函数主体部分,利用头指针进行链表操作,利用display进行打印出屏幕,利用order函数对其进行降幂排序,当两个多项式已经创建完毕时,利用add函数进行两个多项式相加。(2)顺序存储结构抽象数据类型为结构体数组:str
6、uct polyfloat coef;int exp;函数主体部分,会引用指针进行参数传递,在函数主体部分定义了3个结构体数组同时定义其所对应的指针,利用用户输入,利用print函数将其打印出来,再用sort函数将其降序排列,做完两个结构体数组后,接着利用add函数将两个多项式相加。3详细设计(1)链接存储结构:结构体定义:struct nodeint coef; /系数 int exp; /指数 struct node * next;/指针域chainLink;/创建chainLink的node结点对象(值得注意的是,与顺序存储结构不同的是,内部还定义了指针域)功能函数介绍:struct n
7、ode *create() /定义建立多项式函数,并返回链表头指针struct node *h = NULL, *q, *p;/定义结构体头指针h,标记指针p和q,p是创造新节点的标记指针,q是链接链表的指针;int i = 1, N; /定义多项式的项数N及标记数icout N;p = 0;/指针初始化;q = 0;/本地指针初始化;for (; i = N; i+)p = (struct node *)malloc(sizeof(chainLink); /为一个新节点分配空间cout 请输入第 i (*p).coef;cout 请输入第 i (*p).exp;if (i = 1) h =
8、p; q = p; /建立头节点elseq-next = p;q = p;q-next = NULL;/p,q都成为新链表的尾指针;p-next = NULL;return h;PS:值得注意的是,我在里面P,q指针均使其值为0,是让其为空指针,对其进行初始化,在visual studio 2013版中,如果不进行初始化,会被报错。打印函数display:void display(struct node *h)struct node *p; /定义标记指针,输出链表p = h;while (p != NULL)if (p-coef = 0)struct node *d;d = h;while
9、(d-next != p)d = d-next;d-next = p-next;p = p-next;/删去系数为0的节点;elseif (p-coefexp = 0) cout (*p).coef +;else cout ( (*p).coef ) *X (*p).exp exp = 0) cout (*p).coef exp!=0&p-exp!=1)cout (*p).coef *X (*p).exp +;else cout (*p).coef next;cout next; /将原来的链表建立成待排序链表h1-next = NULL; /截断第一个原链表中的节点while (h2 !=
10、NULL)q = h1;p = q-next;t = h2; /从待排序链表中选出一个节点准备插入到新链表中h2 = h2-next; /移动待排序链表的头指针,便于进行下一次挑选t-next = NULL;if (t-expq-exp) /应插入头指针之前的情况t-next = q;h1 = t;continue;if (p = NULL&t-exp exp) q-next = t; /应插入表尾的情况while (p != NULL)if (t-expp-exp)q-next = t;t-next = p;break;elseq = q-next;p = p-next;if (p = NU
11、LL) q-next = t;return h1; /新链表即为按降幂顺序排好的链表,返回其头指针Order函数其实是利用了3个头指针,具体操作看代码即可,其实很容易懂。 相加函数add:struct node *add(struct node *h1, struct node *h2) /定义加法函数,并返回结果的链表的头指针struct node *p, *q, *head, *r; /定义结构体头指针head和标记指针p,q,rp = h1;q = h2;head = (struct node *)malloc(sizeof(chainLink); /为结果多项式分配头指针if (p-e
12、xp = q-exp) head = h1; p = p-next; elseif (p-expexp) head = h2; q = q-next; else p-coef = p-coef + q-coef; head = p; p = p-next; q = q-next; r = head;while (p != NULL&q != NULL)if (p-expq-exp) r-next = p; p = p-next; elseif (p-expexp) r-next = q; q = q-next; else p-coef = p-coef + q-coef; r-next = p
13、; p = p-next; q = q-next; r = r-next;if (p = NULL&q = NULL) r-next = NULL;elseif (p = NULL) r-next = q;if (q = NULL) r-next = p;return head;add函数大部分其实和老师PPT思路差不多。比较两个多项式中指数大小,然后分别对其余两个进行操作。(2)顺序存储结构结构体定义:struct polyfloat coef;int exp;/结构体数组定义主函数结构体数组的创建以及导引指针的创建:poly p50, *po=p;poly p150, *po1=p1;po
14、ly p2100, *po2=p2;/定义三个结构体数组,用于存放多项式,定义三个指针变量;print函数以及参数调用代码:void print(struct poly *s, int n)for (int i = 0; i n; i+)if (i = n - 1)cout (*s)i.coef *X (*s)i.exp;elsecout (*s)i.coef *X (*s)i.exp+;/输出数组主函数中调用print函数的具体形式:print(&po, n1);sort函数的代码:void sort(struct poly *s, int n)int i, temp1, j; /定义数组中
15、的循环标记数据i与j,和整型标记temp1float temp2; /定义单精度型标记temp2for (i = 0; in - 1; i+)for (j = i + 1; j(*s)i.exp)temp1 = (*s)j.exp;(*s)j.exp = (*s)i.exp;(*s)i.exp = temp1;temp2 = (*s)j.coef;(*s)j.coef = (*s)i.coef;(*s)i.coef = temp2;for (i = 0; in - 1; i+)if (*s)i.exp = (*s)i + 1.exp)(*s)i + 1.coef = (*s)i.coef +
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 相加 数据结构 实验 1307 班谭淇蔚
限制150内