数据结构上机实习报告
- 格式:doc
- 大小:216.00 KB
- 文档页数:31
数据结构实习总结【篇一:数据结构实训总结】这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
从刚开始得觉得很难,到最后把这个做出来,付出了很多,也得到了很多,以前总以为自己对编程的地方还不行,现在,才发现只要认真做,没有什么不可能。
编程时要认真仔细,出现错误要及时找出并改正,(其中对英语的要求也体现出来了,因为它说明错误的时候都是英语)遇到问题要去查相关的资料。
反复的调试程序,最好是多找几个同学来对你的程序进行调试并听其对你的程序的建议,在他们不知道程序怎么写的时候完全以一个用户的身份来用对你的用户界面做一些建议,正所谓当局者迷旁观者清,把各个注意的问题要想到;同时要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。
另外,要注意符号的使用,注意对字符处理,特别是对指针的使用很容易出错且调试过程是不会报错的,那么我们要始终注意指针的初始化不管它怎么用以免不必要麻烦。
通过近两周的学习与实践,体验了一下离开课堂的学习,也可以理解为一次实践与理论的很好的连接。
特别是本组所做的题目都是课堂上所讲的例子,在实行之的过程中并不是那么容易事让人有一种纸上谈兵的体会,正所谓纸上得来终觉浅绝知此事要躬行。
实训过程中让我们对懂得的知识做了进一步深入了解,让我们的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人做事风格。
通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的课程设计,通过用for 的多重循环,舍弃多余的循环,提高了程序的运行效率。
一、实习背景数据结构是计算机科学中的基础课程,对于学习计算机编程、算法设计等方面具有重要意义。
为了更好地掌握数据结构知识,提高自己的编程能力,我参加了为期一个月的数据结构实习。
二、实习目标1. 掌握数据结构的基本概念和常用算法;2. 能够运用所学知识解决实际问题;3. 提高编程能力和团队协作能力。
三、实习内容1. 需求分析本次实习主要实现以下功能:(1)实现线性表、栈、队列、链表、树、图等基本数据结构;(2)实现查找和排序算法,如顺序查找、折半查找、快速排序、归并排序等;(3)设计并实现一个简单的学生管理系统,用于存储和管理学生的基本信息。
2. 设计说明(1)数据结构设计本次实习主要使用C语言实现数据结构,具体包括:- 线性表:使用数组实现静态线性表,使用链表实现动态线性表;- 栈和队列:使用数组实现栈和队列;- 树:使用链表实现二叉树;- 图:使用邻接矩阵和邻接表实现图。
(2)算法设计本次实习主要实现以下算法:- 查找算法:顺序查找、折半查找;- 排序算法:快速排序、归并排序;- 学生管理系统:使用链表实现学生信息存储,通过查找算法实现按学号或姓名查找学生信息。
(3)模块设计本次实习将整个程序划分为以下模块:- 数据结构模块:实现各种数据结构的基本操作;- 查找算法模块:实现查找算法;- 排序算法模块:实现排序算法;- 学生管理系统模块:实现学生管理系统的功能。
3. 上机结果及体会(1)合作人编码分工在本次实习中,我与同学合作完成编程任务。
我负责数据结构模块和查找算法模块的设计与实现,同学负责排序算法模块和学生管理系统模块的设计与实现。
(2)实际完成情况本次实习成功实现了以下功能:- 实现了线性表、栈、队列、链表、树、图等基本数据结构;- 实现了顺序查找、折半查找、快速排序、归并排序等查找和排序算法;- 设计并实现了一个简单的学生管理系统,能够存储和管理学生的基本信息。
(3)程序性能分析本次实习程序的性能分析如下:- 数据结构模块:使用链表实现数据结构,具有良好的动态性,空间复杂度较低;- 查找算法模块:顺序查找和折半查找算法的时间复杂度分别为O(n)和O(logn),适用于不同场景;- 排序算法模块:快速排序和归并排序算法的时间复杂度均为O(nlogn),适用于大数据量排序;- 学生管理系统模块:使用链表实现学生信息存储,查询效率较高。
数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。
上机实习报告班号:116112姓名:**学号:***********实习报告【实习一】线性表及其应用n(n>20)的阶乘【问题描述】大数运算——计算n的阶乘(n>=20)。
【基本要求】(1)数据的表示和存储:(1.1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;(1.2)试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。
(2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。
【问题分析】(1)设计数据的存储结构:介于乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。
然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或结点存储数据的若干位数值。
从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。
累积运算的特点是当前的计算结果是下次乘法运算的乘数。
实现两个数的乘法运算须考虑:(1)乘数的各位数都要与被乘数进行乘法运算;(2)乘法过程中的进位问题及其实现;(3)因每个元素或结点最多存储数据的3位数值,故当元素或结点中的数值大于999,需向前一个元素或结点进位。
综合以上几点,我采用了单链表的储存结构形式。
(2)阶乘算法的实现:1. 链表型数据乘法的具体实现描述:(1)初始算法顺序访问对每个节点上的数据乘以要乘的数后在顺序访问查看是否需要进位,大于999则向前进位,如果前面没有节点则添加新节点储存进位的数(2)改进算法将原始算法的乘操作和进位操作合在一起进行,提高程序效率.2. 数据输出算法具体实现描述从高位向低位顺序输出节点上储存的数据,注意补零,最高位的节点不补,其它节点要补。
对于最后的结果,因为我采用的是普通的单链表算法,因此我添加了一个逆置的算法。
数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。
2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。
通过实验,我们将学习如何使用这两种数据结构来解决实际问题。
3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。
3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。
该算法可以判断一个字符串中的括号是否匹配。
具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。
通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。
3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。
该算法可以模拟多个任务按照一定的优先级进行调度的过程。
具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。
通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。
4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。
优秀数据结构实践报告体会范文(15篇)优秀数据结构实践报告体会范文(15篇)篇一随着个人的文明素养不断提升,报告的使用成为日常生活的常态,报告具有成文事后性的特点。
那么报告应该怎么写才合适呢?下面是小编收集整理的体会社会实践报告,希望对大家有所帮助。
大学的第二个暑假到来了,应学校的提议和社会对大学生的要求,我参加了暑期社会实践活动。
在这又一次的活动中,我学到了很多,也感悟了很多。
下面就我这次暑期社会实践的心得做一总结。
因为我是计算机学院的学生,所以我在这学期的社会实践中去了家附近的塑料厂帮助整理资料和制作表格。
暑期社会实践,是我们大学生充分利用暑期的时间,以各种方式深入社会之中展开形式多样的各种实践活动。
积极地参加社会实践活动,能够促进我们对社会的了解,提高自身对经济和社会发展现状的认识,实现书本知识和实践知识的更好结合,帮助我们树立正确的世界观、人生观和价值观;大学生社会实践活动是全面推进素质教育的重要环节,是适应新世纪社会发展要求,培养全面发展型人才的需要,是加强集体主义,爱国主义,社会主义教育,升华思想的有效途径。
积极投身社会实践,深入群众,了解社会,增长才干,是青年学生成长成才的正确道路,是青年学生运用所学知识技能,发挥聪明才智,积极为社会作贡献的重要途径。
暑期社会实践则恰恰为我们提供了一个走出校园,踏上社会,展现自我的绚丽舞台。
利用假期参加有意义的社会实践活动,接触社会,了解社会,从社会实践中检验自我。
在实践中积累社会经验,在实践中提高自己的能力,这将为我们以后走出社会打下坚实的基础!年少轻狂,经受不住暴雨的洗礼?谁说象牙塔里的我们两耳不闻窗外事,一心只读圣贤书?走出校园,踏上社会,我们能否不辜负他人的`期望,为自己书写一份满意的答卷。
在注重素质教育的今天,大学生假期社会实践作为促进大学生素质教育,加强和改进青年学生思想政治工作,引导学生健康成长成才的重要举措,作为培养和提高学生实践、创新和创业能力的重要途径,一直来深受学校的高度重视。
数据结构实验报告课程数据结构 _ 院系专业班级实验地点姓名学号实验时间指导老师数据结构上机实验报告1一﹑实验名称:实验一——链表二﹑实验目的:1.了解线性表的逻辑结构特性;2.熟悉链表的基本运算在顺序存储结构上的实现,熟练掌握链式存储结构的描述方法;3.掌握链表的基本操作(建表、插入、删除等)4. 掌握循环链表的概念,加深对链表的本质的理解。
5.掌握运用上机调试链表的基本方法三﹑实验内容:(1)创建一个链表(2)在链表中插入元素(3)在链表中删除一个元素(4)销毁链表四﹑实验步骤与程序#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的链表均为带头结点。
void CreatLinkList(LinkList &L,int j){//建立一个链表L,数据为整数,数据由键盘随机输入。
LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"请输入一个链表:"<<endl;for(int i=0;i<j;i++){ p=(LinkList)malloc(sizeof(Lnode));cin>>p->data;p->next=q->next;q->next=p;q=p;}}int PrintLinkList(LinkList &L){//输出链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算链表L的数据元素个数。
实验名称:数据结构实验实验时间:2021年X月X日实验地点:计算机实验室实验目的:1. 理解并掌握基本数据结构(线性表、栈、队列、链表、树、图)的概念和操作。
2. 能够运用C语言实现基本数据结构的各种操作。
3. 培养编程能力和问题解决能力。
实验内容:1. 线性表2. 栈3. 队列4. 链表5. 树6. 图实验环境:1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019实验步骤:一、线性表1. 实现线性表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个线性表,包含10个元素。
- 在第3个位置插入一个新元素。
- 删除第5个位置的元素。
- 查找线性表中的第7个元素。
- 遍历线性表,并打印所有元素。
二、栈1. 实现栈的创建、入栈、出栈、判空和求栈顶元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个栈。
- 向栈中依次入栈元素1、2、3、4、5。
- 判断栈是否为空。
- 求栈顶元素。
- 出栈元素,并打印出栈的元素。
三、队列1. 实现队列的创建、入队、出队、判空和求队头元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个队列。
- 向队列中依次入队元素1、2、3、4、5。
- 判断队列是否为空。
- 求队头元素。
- 出队元素,并打印出队的元素。
四、链表1. 实现单链表、双向链表和循环链表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个单链表,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
- 查找链表中的第4个元素。
- 遍历链表,并打印所有元素。
五、树1. 实现二叉树的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个二叉树,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
数据结构上机实验报告一、实验目的本次数据结构上机实验的主要目的是通过实际编程操作,深入理解和掌握常见的数据结构及其基本操作,提高解决实际问题的能力和编程技能。
具体目标包括:1、熟练掌握线性表、栈、队列、树、图等数据结构的基本概念和存储方式。
2、学会运用数据结构的相关算法进行数据的插入、删除、查找、排序等操作。
3、培养分析问题、设计算法、编写代码和调试程序的综合能力。
4、增强对数据结构在实际应用中的认识,提高解决复杂问题的思维能力。
二、实验环境1、操作系统:Windows 102、编程环境:Visual Studio 20193、编程语言:C++三、实验内容本次实验共包括以下几个部分:1、线性表的操作实现顺序表和链表的创建、插入、删除、查找和遍历操作。
比较顺序表和链表在不同操作下的性能差异。
2、栈和队列的应用利用栈实现表达式求值。
用队列模拟银行排队系统。
3、树的遍历实现二叉树的先序、中序和后序遍历算法,并输出遍历结果。
构建哈夫曼树,并进行编码和解码操作。
4、图的基本操作用邻接矩阵和邻接表存储图,并实现图的深度优先搜索和广度优先搜索算法。
四、实验步骤及结果1、线性表的操作顺序表的实现:```cppinclude <iostream>using namespace std;define MAXSIZE 100 //顺序表的最大长度class SeqList {private:int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度public:SeqList(){//构造函数,初始化顺序表length = 0;}//插入元素bool insert(int pos, int element) {if (pos < 0 || pos > length || length == MAXSIZE) {return false;}for (int i = length; i > pos; i) {datai = datai 1;}datapos = element;length++;return true;}//删除元素bool remove(int pos) {if (pos < 0 || pos >= length) {return false;}for (int i = pos; i < length 1; i++){datai = datai + 1;}length;return true;}//查找元素int search(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i;}}return -1;}//遍历输出顺序表void traverse(){for (int i = 0; i < length; i++){cout << datai <<"";}cout << endl;}};int main(){SeqList list;listinsert(0, 10);listinsert(1, 20);listinsert(2, 30);listtraverse();listremove(1);listtraverse();int position = listsearch(30);if (position!=-1) {cout <<"元素 30 在位置"<< position << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```链表的实现:```cppinclude <iostream>using namespace std;class Node {public:int data;Node next;Node(int element) {data = element;next = NULL;}};class LinkedList {private:Node head;public:LinkedList(){head = NULL;}//插入元素void insert(int element) {Node newNode = new Node(element);if (head == NULL) {head = newNode;} else {Node current = head;while (current>next!= NULL) {current = current>next;}current>next = newNode;}}//删除元素void remove(int element) {if (head == NULL) {return;}if (head>data == element) {Node temp = head;head = head>next;delete temp;return;}Node current = head;Node prev = NULL;while (current!= NULL && current>data!= element) {prev = current;current = current>next;}if (current!= NULL) {prev>next = current>next;delete current;}}//查找元素bool search(int element) {Node current = head;while (current!= NULL) {if (current>data == element) {return true;}current = current>next;}return false;}//遍历输出链表void traverse(){Node current = head;while (current!= NULL) {cout << current>data <<"";current = current>next;}cout << endl;}};int main(){LinkedList list;listinsert(10);listinsert(20);listinsert(30);listtraverse();listremove(20);listtraverse();if (listsearch(30)){cout <<"找到元素 30" << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```性能比较:在插入和删除操作中,顺序表在表头或中间位置操作时需要移动大量元素,时间复杂度较高;而链表只需要修改指针,时间复杂度较低。
数据结构上机实习报告实验题目:一元多项式班级:193121姓名:邹冠宏学号:20121002758指导老师:郭艳完成日期:2013/9/30一问题分析1. 问题描述设计一个n元多项式程序,并完成多项式的加法,乘法运算。
从实际的角度出发,这里设计的程序是基于一元n次多项式的数学模型。
2、功能需求1)构造一个空的多项式。
2)多项式插入新的一项。
3)计算多项式的值。
4)打印多项式。
5)多项式合并同类项。
6)多项式加法。
7)多项式乘法。
8)多项式减法二、概要设计1问题分析在数学上,一个一元多项式Pn(x)可按升幂写成:Pn(x)=a 0+a1 x+a2 x^2 +…+a n x^n-1 .它由n+1个系数惟一确定,因此,在计算机里,它可用一个线性表P来表示:Pn=(a0,a1,a2,…,an)每一项的指数i 隐含在其系数ai的序号里。
2数据模型设计一个单链表模型,动态分配空间,刻意随时插入新的一项多项式加法规则:两个具有相同指数的项合并,系数为0时把这一项省去,也就是删除了这一节点。
多项式的乘法规则:多次运用单项式与多项式相乘的法则得到的.计算时(a+b)(c+d),把(c+d)看成一个单项式,(a+b) 是一个多项式,运用单项式与多项式相乘的法则,得到(a+b)(c+d)=a(c+d)+b(c+d),然后再次运用单项式与多项式相乘的法则。
3 构造数据结构通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:系数信息、指数信息和指向下一个单项式的指针。
通过指针,我们就可以把多个单项式连接起来,形式一个多项式,基于以上的分析,我们定义多项式的数据结构为如下结构体形式:typedef struct Polynomial{float coef;//系数int expn;//指数struct Polynomial *next;//指向下一个结点}*Polyn,Polynomial; //Polyn为结点指针类型三、详细设计1一元多项式运算程序具有以下基本功能:1).界面输出,提示如何输入数据。
要求先输入多项式的项数。
2).创建多项式。
接收输入的数据,并保存到链表中。
3).显示程序的功能表,允许使用者选择运算类型。
4).打印多项式。
5).实现加法运算。
7).实现乘法运算。
6).清除内存内容,销毁创建的链表,退出程序。
2功能算法描述与数据结构说明该多项式程序除了main()函数外,主要有以下函数:Polyn CreatePolyn(Polyn head,int m)void Insert(Polyn p,Polyn h)void PrintPolyn(Polyn P)int compare(Polyn a,Polyn b)Polyn AddPolyn(Polyn pa,Polyn pb)Polyn MultiplyPolyn(Polyn pa,Polyn pb)void DestroyPolyn(Polyn p)void CountPolyn(Polyn P,int k)3. 主要功能函数的详细设计1).main()函数main函数是用来实现提示使用者输入、显示功能列表、调用其他运算函数实现运算功能。
在main()函数中,定义m、n用来保存两个多项式的项数,pa、pb、pc、pd、pf定义程序所需链表的头指针。
在程序开始要求输入两个多项式的项数,随后根据项数创建两个链表以保存多项式,再显示出功能列表后通过输入数字来选择来实现功能的选择,从而达到对整个程序流程进行控制。
2). Polyn CreatePolyn(Polyn head,int m)该函数功能是创建新的多项式链表。
int m保存的多项式的项数,使用for语句,控制输入多项式的每一项。
若创建的链表长度为m时,将不再提示用户继续输入多项式的系数和指数。
因为是从0项开始计算的。
在该函数中要用到分配空间的函数malloc()为新建链表分配空间。
而空间的长度要用sizeof()。
3). void Insert(Polyn p,Polyn h)该函数功能:将新的节点p插入到现有链表的后面,并确保多项式的指数exp是升序。
将s节点插入到head所指向的链表。
在该函数的操作中,要注意指针是如何移动的。
对插入的位置要分情况讨论。
在头,中,尾三处的插入。
4). int compare(Polyn a,Polyn b)该函数功能:判断两个多项式在同一指数下是否有其中一个为系数为0。
根据不同情况来讨论多项式的指数,用来辅助加法和乘法运算。
5). Polyn AddPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式pa、pb相加,并将计算结果存储于新建立的pc中,它的原理是将指数相同的单项式相加,系数相加后为0,则pa、pb的指针都后移。
在加法计算中要求pa,与pb的幂次序都是升序,否则可能得到错误的结果。
该函数调用了int compare(Polyn a,Polyn b)的结果,用来判断多项式在同一指数下a、b是否有为系数为0。
同样也使用了malloc()关键字,为新链表创建分配空间。
6). void PrintPolyn(Polyn P)该函数功能:显示多项式链表。
在该函数中较复杂的是如何控制链表的输出,尤其是第一项的输出,同时还有符号的控制。
在输出第一项时要判断是不是常数项,若是,则不要输出字符x。
还有对系数的正负的判断,若是正就输出+,负则直接输出。
7). Polyn MultiplyPolyn(Polyn pa,Polyn pb)函数功能:实现两个多项式相乘,F(X) * H(x) 。
计算时运用单项式与多项式相乘的法则,然后再次运用单项式与多项式相乘的法则。
对得到多项式进行合并。
8)Polyn CountPolyn(Polyn p,int x)此函数是用来输出多项式的计算结果,要给x赋值,当*next==Null时结束运算,输出结果9). void DestroyPolyn(Polyn p)该函数的功能是销毁掉创建的两个链表,释放内存。
以辅助退出程序。
有利于空间空域,如果不释放没用的内存空间的话,内存会被占用,最后导致内存不足,甚至系统崩溃。
4各函数的详细设计该程序实现了多项式的创建、多项式的加法、、乘法运算以及多项式的清除。
为完成这些功能,必须用到一些辅助函数。
下面讨论一些重要函数具体实现过程及其参数的含义:1). Polyn CreatePolyn(Polyn head,int m)该函数的两个参数,head表示为创建的链表的头指针,m表示为链表的长度,即多项式的项数。
定义int i计数,当i<m时,for语句反复提示用户输入该多项式的每一项的指数和系数,并保存。
当i=m时,输入完毕,该链表也创建完毕。
详细的实现过程如下:Polyn CreatePolyn(Polyn head,int m){int i;//用来计数Polyn p;//定义一个p链表p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head); //调用Insert函数插入结点}return head;}//CreatePolyn2). void Insert(Polyn p,Polyn h) 该函数具有两个参数,用来实现链表的顺序排列和合并相同的项。
以下是实现插入的关键代码:void Insert(Polyn p,Polyn h){if(p->coef==0) free(p); //系数为0的话释放结点else{//如果系数不为0Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn){ //查找插入位置q1=q2;q2=q2->next; }if(q2&&p->expn==q2->expn){ //将指数相同相合并q2->coef+=p->coef;free(p);if(!q2->coef){ //系数为0的话释放结点q1->next=q2->next;free(q2); }}else{ //指数为新时将结点插入p->next=q2;q1->next=p;}}}//Insert3). int compare(Polyn a,Polyn b)此函数是用来比较两个多项式之间的系数大小。
int compare(Polyn a,Polyn b){if(a&&b){if(!b||a->expn>b->expn) return 1;else if(!a||a->expn<b->expn) return -1;else return 0;}else if(!a&&b) return -1;//a多项式已空,但b多项式非空else return 1;//b多项式已空,但a多项式非空}//compare4). Polyn AddPolyn(Polyn pa,Polyn pb) 该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。
其计算的结果存放在新建的pc所指向的链表中。
函数中调用了int compare(Polyn a,Polyn b)的结果。
下面是实现加法的关键代码:Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针Polyn qa=pa->next;Polyn qb=pb->next;Polyn headc,hc,qc;hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点hc->next=NULL;headc=hc;while(qa||qb){qc=(Polyn)malloc(sizeof(struct Polynomial));switch(compare(qa,qb)){case 1: {qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;}case 0: {qc->coef=qa->coef+qb->coef; qc->expn=qa->expn;qa=qa->next;qb=qb->next;break;}case -1:{qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;}}//switchif(qc->coef!=0){qc->next=hc->next;hc->next=qc;hc=qc;}else free(qc);//当相加系数为0时,释放该结点}//whilereturn headc;}//AddPolyn5). Polyn MultiplyPolyn(Polyn pa,Polyn pb) 该函数同加法一样,拥有相同的参数并且同样将新建立的链表pf的指针返回,用来实现输出乘法结果。