实验三四 链表的实现和应用
链表实际应用
链表实际应用
链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
链表在实际应用中有广泛的用途,比如在社交网络中存储用户关系、在电商平台中管理商品信息等。
在社交网络中,链表可以用来存储用户之间的关注关系。
每个节点代表一个用户,节点中的数据元素是用户的个人信息,比如姓名、年龄等。
而指针则指向该用户关注的下一个用户。
通过这种方式,可以方便地查找某个用户的关注列表,或者查找两个用户之间的关系链。
在电商平台中,链表可以用来管理商品信息。
每个节点代表一个商品,节点中的数据元素是商品的信息,比如名称、价格等。
而指针则指向下一个商品。
通过这种方式,可以方便地遍历商品列表,或者根据某个条件筛选出符合要求的商品。
除了在社交网络和电商平台中的应用,链表还可以用来实现其他功能。
比如在汽车导航系统中,可以使用链表来存储道路信息,每个节点代表一个路口,节点中的数据元素是路口的地理位置信息,指针则指向下一个路口。
通过这种方式,可以方便地规划出最优的行车路线。
链表还可以用来实现音乐播放器中的播放列表。
每个节点代表一首
歌曲,节点中的数据元素是歌曲的信息,指针则指向下一首歌曲。
通过这种方式,可以方便地切换歌曲,或者按照用户的喜好进行推荐。
链表在实际应用中有着广泛的用途。
无论是在社交网络、电商平台、汽车导航系统还是音乐播放器中,链表都可以有效地管理和组织数据,提供便捷的操作方式。
通过链表,我们可以更好地理解和应用各种实际场景中的数据结构。
编程题实训-链表应用python版
编程题实训-链表应用python版一、简介在计算机科学领域,链表是一种常见的数据结构,它由一系列节点组成,每个节点都包含数据和一个指向下一个节点的引用。
链表可以用于实现各种算法和数据结构,如栈、队列、图等。
在本文中,我们将使用python语言来实现链表,并介绍链表的一些常见应用。
二、链表的基本操作1. 定义节点类我们需要定义一个节点类来表示链表中的节点。
节点类通常包含两个属性:数据和指向下一个节点的引用。
```pythonclass Node:def __init__(self, data):self.data = dataself.next = None```2. 创建链表接下来,我们可以创建一个链表类来管理节点。
链表类通常包含一些基本操作,如添加节点、删除节点、查找节点等。
```pythonclass LinkedList:def __init__(self):self.head = Nonedef add_node(self, data):new_node = Node(data)if self.head is None:self.head = new_nodeelse:current = self.headwhile current.next:current = current.nextcurrent.next = new_nodedef remove_node(self, data):current = self.headif current.data == data:self.head = current.nextwhile current.next:if current.next.data == data:current.next = current.next.nextreturncurrent = current.nextdef find_node(self, data):current = self.headwhile current:if current.data == data:return Truecurrent = current.nextreturn False```三、链表的应用1. 栈栈是一种后进先出(LIFO)的数据结构,可以使用链表来实现。
数据结构与算法分析实验报告
数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
数据结构实验报告实验总结
数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。
通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。
下面对每一部分实验进行总结。
实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。
在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。
实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。
通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。
实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。
通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。
实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。
通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。
通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。
同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。
在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。
通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。
总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。
在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。
数据结构与算法——链表的应用
数据结构与算法——链表的应用一、链表基础在计算机科学的基石中,数据结构与算法扮演着至关重要的角色,它们是理解和解决复杂问题的关键。
数据结构涉及如何在计算机内存中有效地组织和存储数据,而算法则是解决问题或执行任务的一系列精确步骤。
精通数据结构与算法能够优化程序的效率,提高代码的可读性,是每一位程序员都应具备的核心能力。
1.1 链表的特性与优势链表作为一种基础数据结构,其主要特点在于节点的非连续存储。
与数组不同,链表的节点通过指针相互链接,这一特性使得在链表中进行插入和删除操作更为高效,因为通常不需要移动大量数据。
然而,这也导致了访问链表元素的过程较数组间接,通常需要从头节点开始遍历。
1.2 内存管理与类型链表的内存管理相对复杂,每个节点除了存储实际数据外,还需额外空间存放指向下一节点的指针。
这种分散的内存分配可能导致内存碎片,尤其是在处理大量数据时,可能对系统性能产生影响。
链表有多种变体,每种都有特定的应用场景。
单链表是最基础的形式,每个节点仅包含指向下一个节点的指针。
双向链表则提供双向遍历的便利,每个节点拥有前一个和后一个节点的引用。
循环链表中,最后一个节点的指针会回指到链表的头节点,形成一个封闭的环。
此外,多级链表和哈希链表等复杂结构在数据库索引、文件系统和图形处理等领域有广泛应用。
二、链表的威力与应用总而言之,链表是一种强大的工具,其设计和应用能够帮助我们构建出更高效、更具弹性的程序,以应对各种复杂的数据库处理挑战。
在实际编程中,根据具体需求选择合适的链表类型,并巧妙利用其特性,往往可以实现显著的性能提升。
二、链表类型详解2.1 单链表单链表作为一种基本的线性数据结构,由一连串相互连接的节点构成,每个节点都承载着数据,并携带一个指针,用于指引到下一个节点的位置。
这种布局使得在执行插入和删除操作时,相较于数组具有更高的效率,因为它只需要更新相邻节点的指针,无需物理移动元素。
在实践中,如在构建栈和队列的数据结构时,单链表便于实现快速的压栈、出栈,以及入队、出队操作。
算法与及数据结构实验报告
算法与及数据结构实验报告算法与数据结构实验报告一、实验目的本次算法与数据结构实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见算法和数据结构的基本原理、特性和应用,提高我们解决实际问题的能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,为了进行算法性能的分析和比较,使用了 Python 的 time 模块来计算程序的运行时间。
三、实验内容1、线性表的实现与操作顺序表的实现:使用数组来实现顺序表,并实现了插入、删除、查找等基本操作。
链表的实现:通过创建节点类来实现链表,包括单向链表和双向链表,并完成了相应的操作。
2、栈和队列的应用栈的实现与应用:用数组或链表实现栈结构,解决了表达式求值、括号匹配等问题。
队列的实现与应用:实现了顺序队列和循环队列,用于模拟排队系统等场景。
3、树结构的探索二叉树的创建与遍历:实现了二叉树的先序、中序和后序遍历算法,并对其时间复杂度进行了分析。
二叉搜索树的操作:构建二叉搜索树,实现了插入、删除、查找等操作。
4、图的表示与遍历邻接矩阵和邻接表表示图:分别用邻接矩阵和邻接表来存储图的结构,并对两种表示方法的优缺点进行了比较。
图的深度优先遍历和广度优先遍历:实现了两种遍历算法,并应用于解决路径查找等问题。
5、排序算法的比较插入排序、冒泡排序、选择排序:实现了这三种简单排序算法,并对不同规模的数据进行排序,比较它们的性能。
快速排序、归并排序:深入理解并实现了这两种高效的排序算法,通过实验分析其在不同情况下的表现。
6、查找算法的实践顺序查找、二分查找:实现了这两种基本的查找算法,并比较它们在有序和无序数据中的查找效率。
四、实验步骤及结果分析1、线性表的实现与操作顺序表:在实现顺序表的插入操作时,如果插入位置在表的末尾或中间,需要移动后续元素以腾出空间。
删除操作同理,需要移动被删除元素后面的元素。
在查找操作中,通过遍历数组即可完成。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
数据结构 实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
操作系统为 Windows 10。
三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。
对链表进行排序,如冒泡排序或插入排序。
2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。
利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。
3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。
进行二叉树的插入、删除节点操作。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先遍历和广度优先遍历。
四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。
链表的综合应用课程设计
链表的综合应用课程设计一、课程目标知识目标:1. 学生能理解链表的基本概念,掌握链表的构建、插入、删除等基本操作。
2. 学生能够运用所学知识解决实际问题,如实现一个简单的学生管理系统。
3. 学生了解链表与其他数据结构(如数组、栈、队列)的优缺点,并能够根据需求选择合适的数据结构。
技能目标:1. 学生通过编写代码,能够独立完成链表的相关操作,培养编程实践能力。
2. 学生能够运用链表解决实际问题,提高问题分析和解决方案设计的能力。
3. 学生通过团队协作,提高沟通与协作能力,共同完成链表综合应用项目。
情感态度价值观目标:1. 学生在学习过程中,培养对数据结构和算法的兴趣,激发自主学习动力。
2. 学生通过解决实际问题,体验编程的乐趣,增强自信心和成就感。
3. 学生养成严谨、踏实的编程习惯,树立正确的价值观,认识到编程在生活中的重要性。
课程性质:本课程为高年级计算机科学或信息技术学科的选修课程,侧重于培养学生的编程实践能力和问题解决能力。
学生特点:学生已具备一定的编程基础,对数据结构有一定了解,具有较强的逻辑思维能力。
教学要求:课程要求学生在理解链表基本概念的基础上,通过实践操作,掌握链表的综合应用。
教学过程中注重引导学生主动探索、团队协作,培养学生的创新意识和实际操作能力。
将目标分解为具体的学习成果,以便后续的教学设计和评估。
二、教学内容1. 链表的基本概念:定义、分类(单向链表、双向链表、循环链表)及结构特点。
2. 链表的构建与操作:- 创建链表节点结构体;- 初始化链表;- 插入节点(头插法、尾插法、指定位置插入);- 删除节点(按位置、按值);- 遍历链表;- 查找链表中的元素。
3. 链表的应用案例:- 实现学生管理系统(增删改查功能);- 链表与其他数据结构(如数组、栈、队列)的对比分析。
4. 链表在实际应用中的优缺点及适用场景。
教学大纲安排:第一课时:链表的基本概念及分类第二课时:链表的构建与操作第三课时:链表的应用案例(学生管理系统)第四课时:链表与其他数据结构的对比及在实际应用中的优缺点教学内容与教材关联性:本教学内容与教材中关于链表的相关章节紧密相关,涵盖了链表的定义、构建、操作和应用等方面,确保学生能够系统地掌握链表知识。
实验三 链表的建立及基本操作方法实现
实验预备知识:1.熟练运用指针进行程序设计,掌握结构体指针。
2.掌握使用结构体指针访问结构体变量。
3.掌握指针作为函数的参数使用。
4.理解单链表的含义、目的和处理方法。
一、实验目的1.掌握线性表的链式存贮结构及基本操作,深入了解链表的基本特性,以便在实际问题背景下灵活运用它们。
2.巩固该存贮结构的构造方法,深入理解和灵活掌握链表的插入、删除等操作。
二、实验要求(本次实验要求上交)【题目1】----验证型实现循环单链表的各种基本运算的算法。
参考代码见(3-1.cpp)该程序主函数完成如下功能:(1)初始化循环单链表(2)利用尾插法插入若干元素(3)输出循环单链表(4)输出该单链表的长度(5)判断该单链表是否为空(6)输出单链表的第3个元素(7)在地4的元素位置上插入元素f(8)删除第3个元素(9)销毁该循环单链表【题目2】编写一个程序,用单链表存储一元多项式,将单链表按幂指数的降序排序并实现两个多项式的相加运算。
源程序见附录部分。
该工程的程序结构图如下图所示:测试数据:A:{1.2,0}{2.5,1}{3.2,3}{-2.5,5}B: {-1.2,0}{2.5,1}{3.2,3}{2.5,5}{5.4,10}算法分析:问题1:单链表排序问题2:利用多项式进行相加运算请自己编写Add ()函数及main ()函数,其余函数已经给出(见3-2.cpp )。
将整个程序的源码附录于下表中。
请将源程序附录于此:CreatListRAdd DestroyList Sort DispPoly main实验上传方法:将源程序文件和本word文档(添加了相应的源程序和截图)上传。
多个文件请将其放入一个文件夹压缩后上传。
请于指定时间前上交,过时不补!。
软件技术基础实验指导书(1)
软件技术基础实验指导书2014年9月1日目录实验一斐波那契数列的实现算法及分析 (3)实验二顺序表的实现与应用 (5)实验三链表的实现和应用 (7)实验四栈的实现和应用 (9)实验五队列 (11)实验六二叉树的创建和遍历 (12)实验七图 (15)实验八哈夫曼树及哈夫曼编码 (16)实验九查找算法的实现 (19)实验十内部排序算法的实现 (26)实验十一迷宫问题 (29)实验十二 B+树程序设计 (30)实验十三四叉树程序设计 (31)实验十四修路方案问题 (32)实验一斐波那契数列的实现算法及分析实验目的:1.掌握分别用递归和非递归方法计算斐波那契(Fibonacci)数列。
2.掌握算法性能测试的方法,并能进行算法分析和比较。
实验环境(硬/软件要求):Windows 2000, VisualC++ 6.0实验内容:二阶Fibonacci数列的定义如下:F0=1,F1=1, F2=2,F3=3,F4=5,。
,Fi=F(i-1)=F(i-2) (i>=1).试用递归法和非递归法两种方法写出计算Fn的函数。
实验要求:1.完成计算Fn的递归函数Fib-rec.2.完成计算Fn的非递归数列Fib-ite.3.当n=10,15,20,25,30,35,40,45时测试以上两种算法执行的时间,并把测试结果填写在附表1-1中。
附表1-1 测试表注:表格中填写的是测试时间,单位μm.4.试解释两种算法在执行时间上的不同,并对两种算法进行算法分析。
【C语言源程序】#include <stdio.h>#include <time.h>Long Fib-rec(int n){if(n==0||n==1)return(1);else return(Fib-rec(n-1) + Fib-rec(n-2) );}long Fib-ite(int n){long fib1,fib2,fib;int i;fib1=1;fib2=1;for (i=3;i<=n,i + + ){fib=fib1+fib2;fib1=fib2;fib2=fib;}return fib;}void main ( ){clock-t us1, us2;int n;printf(“请输入n:\n”);scanf(“%d,&n);us1=clock( );printf(“递归函数计算结果:%1d\n”,Fib-rec(n) ); us2=clock( );printf(“递归函数执行时间%1d毫秒\n”,us2-us1);us1=clock( );printf(“非递归函数计算结果:%1d\n”,Fib-ite(n) ); us2=clock( );printf(非递归函数执行时间%1d毫秒\n”,us2-us1);}实验二顺序表的实现与应用实验目的:1.掌握线性表的概念。
C++实验报告:链表应用
班级:******* 学号: ************ 姓名: *****链表应用——学生信息管理系统一、实验内容定义一个链表,其中的数组元素为结构体成员,结构体中的学生信息有学号、姓名、身高,还有用于存放下一结点的结构体指针。
然后定义在其上操作的函数,有在首部插入结点、在尾部插入结点、在某一个结点前插入结点、删除指定的结点、删除全部结点、修改指定结点的数据部分、显示全部结点信息、按照结构体结点中某一个数据项对链表进行排序。
从主函数开始执行,输入数据,选择执行操作的类型,进入到各个函数中执行相应的操作,执行完毕后,返回主函数,结束程序的运行。
二、功能模块简介主函数:程序开始运行后,由主函数定义头结点StuLst lst,将结点的next域置为NULL。
然后,显示指示用户进行输入的信息,供用户进行阅读了解,然后进行输入操作。
对各个模块进行简介:0.结束程序:在主界面输入0,退出正在运行的程序。
1.显示所有节点信息:在主界面输入1,调用函数ShowLst(StuLst* lst)进行显示结点信息操作。
如果链表不为空,则显示所有结点的信息。
先设置输出信息格式,输出表头信息,定义指针*p=lst->next;用while循环,每次使p=p->next;如果p不为空则输出显示该节点的数据信息,然后依次显示每个节点的数据信息。
2.插入节点到头部:在主界面输入2,调用函数InsertToFirst(StuLst* lst)插入结点到链表的头部。
定义结构体指针并为它分配一个地址空间Stu* pSt=new Stu;用来接收用户输入的信息,屏幕上显示出提示信息,请用户输入信息,如果输入的学号信息不为"0",则在执行完这一次输入后,继续执行下一次输入。
输入完毕后,将该结构体指针插入到链表的头部去:pSt->next=lst->next;lst->next=pSt。
3.插入节点到尾部:在主界面输入3,调用函数InsertToLast(StuLst* lst)插入结点到链表的尾部。
链表的基本操作与实现
武夷学院实验报告
课程名称:数据结构与算法设计项目名称: 链表的基本操作与实现
姓名:专业:通信工程班级:2011级学号:同组成员:无
1注:1、实验预习部分包括实验环境准备和实验所需知识点准备。
2、若是单人单组实验,同组成员填无。
2注:实验过程记录要包含实验目的、实验原理、实验步骤,页码不够可自行添加。
实验报告成绩(百分制)__________ 实验指导教师签字:__________ 3注:1、实验小结应包含实验所需知识点和实验方法的总结,实验心得体会等。
2、分组实验需包含同组讨论内容。
数据结构实验报告及心得体会
数据结构实验报告及心得体会一、实验背景和目的本次实验的目的是通过设计和实现常见的数据结构,来加深对数据结构的理解,并能够熟练运用。
实验中使用的数据结构有栈、队列和链表,通过这些数据结构的设计和应用,能够更好地掌握数据结构的原理和应用。
二、实验过程1. 栈的设计和实现在本次实验中,我设计了一个基于数组的栈,用于存储数据。
首先,我定义了一个栈类,包含栈的容量、栈顶指针和存储数据的数组。
然后,我实现了入栈、出栈和判断栈空、栈满的操作。
在测试阶段,我编写了一些测试用例,验证栈的功能和正确性。
2. 队列的设计和实现在本次实验中,我设计了一个基于链表的队列。
首先,我定义了一个队列类,包含队列的头指针和尾指针。
然后,我实现了入队、出队和判断队列空、队列满的操作。
在测试阶段,我编写了一些测试用例,验证队列的功能和正确性。
3. 链表的设计和实现在本次实验中,我设计了一个能够存储任意数据类型的单链表。
首先,我定义了一个链表类,包含链表的头指针和尾指针。
然后,我实现了插入、删除和查找节点的操作。
在测试阶段,我编写了一些测试用例,验证链表的功能和正确性。
三、实验结果和分析通过本次实验,我成功设计和实现了栈、队列和链表这三种常见的数据结构。
在测试阶段,我对这些数据结构进行了充分的测试,验证了它们的功能和正确性。
在测试过程中,我发现栈和队列在实际应用中具有很大的作用。
例如,在计算表达式的过程中,可以利用栈来实现中缀表达式转后缀表达式的功能;在操作系统中,可以利用队列来实现进程的调度。
此外,在实验过程中,我还进一步加深了对数据结构的理解。
通过设计和实现数据结构,我学会了如何根据问题的需求选择合适的数据结构,并能够运用数据结构解决实际问题。
在实现过程中,我遇到了一些问题,例如链表的插入和删除操作需要考虑前后指针的变化,但通过不断的实践和思考,最终成功解决了这些问题。
同时,我还注意到数据结构的时间复杂度和空间复杂度对算法的性能有着重要的影响,因此在设计数据结构时需要充分考虑这些因素。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过本次实验,旨在加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解和运用,提高编程能力和问题解决能力,培养算法设计和分析的思维。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、数组与链表的实现与操作分别实现整数数组和整数链表的数据结构。
实现数组和链表的插入、删除、查找操作,并比较它们在不同操作下的时间复杂度。
2、栈与队列的应用用数组实现栈结构,用链表实现队列结构。
模拟栈的入栈、出栈操作和队列的入队、出队操作,解决实际问题,如表达式求值、任务调度等。
3、二叉树的遍历构建二叉树的数据结构。
实现先序遍历、中序遍历和后序遍历三种遍历算法,并输出遍历结果。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先搜索(DFS)和广度优先搜索(BFS)算法,并分析它们的时间复杂度。
四、实验步骤1、数组与链表数组的实现:定义一个固定大小的整数数组,通过索引访问和操作数组元素。
链表的实现:定义链表节点结构体,包含数据和指向下一个节点的指针。
插入操作:对于数组,若插入位置在末尾,直接赋值;若不在末尾,需移动后续元素。
对于链表,找到插入位置的前一个节点,修改指针。
删除操作:数组需移动后续元素,链表修改指针即可。
查找操作:数组通过索引直接访问,链表需逐个节点遍历。
2、栈与队列栈的实现:用数组模拟栈,设置栈顶指针。
队列的实现:用链表模拟队列,设置队头和队尾指针。
入栈和出栈操作:入栈时,若栈未满,将元素放入栈顶,栈顶指针加 1。
出栈时,若栈不为空,取出栈顶元素,栈顶指针减 1。
入队和出队操作:入队时,在队尾添加元素。
出队时,取出队头元素,并更新队头指针。
3、二叉树构建二叉树:采用递归方式创建二叉树节点。
先序遍历:先访问根节点,再递归遍历左子树,最后递归遍历右子树。
中序遍历:先递归遍历左子树,再访问根节点,最后递归遍历右子树。
链表的基本操作实验报告
《数据结构》实验报告学号1445203105 姓名王胜博班级软件5班成绩实验名称实验三链表的基本操作是否原创是一、实验要求编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。
二、实验目的通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。
和实验2对比,掌握线性结构两种不同存储方式的区别。
三、设计思想用函数执行各个功能,随机插入元素四、主要源代码#include<stdio.h>#include<stdlib.h>#include<time.h>typedef int ElemType;typedef struct Node{ElemType data;struct Node *next;}Node, *LinkList;void InitList(LinkList *L){*L=(LinkList)malloc(sizeof(Node));if(!(*L))printf("存储分配失败\n");(*L)->next=NULL;}void DestroyList(LinkList L){LinkList p;while(L){p=L->next;free(L);L=p;}}int ListLength(LinkList L){LinkList p;int i=0;p=L->next;while(p){i++;p=p->next;}return i;}int GetElem(LinkList L,int i,ElemType &e){ LinkList p;p=L->next;int j=1;while(p&&j<i){p=p->next;++j;}e=p->data;return e;}int GetElemLo(LinkList L,int i,ElemType &e){ LinkList p;p=L->next;int j=1;while(p->data!=i&&j<=ListLength(L)){p=p->next;++j;}e=j;return e;}void FindPre(LinkList L,int x){LinkList p;p=L;if(p->next->data==x){printf("第一个元素没有前驱\n");}else{while(p->next){if(p->next->data==x){printf("%d的前驱结点是:%d\n",x,p->data);break;}else{p=p->next;}}}}void FindNext(LinkList L,int x){LinkList p;p=L->next;while(p){if(p->data==x){printf("%d的后继结点是:%d\n",x,p->next->data);break;}else{p=p->next;}if(p->next==NULL){printf("最后一个元素没有后继\n");break;}}}void LinkInset_L(LinkList &L,int i,ElemType e){ LinkList p;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1)printf("i小于1或者i大于表长加1\n");LinkList s;s=(LinkList)malloc(sizeof (Node));s->data=e;s->next=p->next;p->next=s;}void ListDelete_L(LinkList &L,int i,ElemType &e){ LinkList p,q;p=L;int j=0;while(p->next && j<i-1){p=p->next;++j;}if(!p->next ||j>i-1)printf("删除位置不合理\n");q=p->next;p->next=q->next;e=q->data;free(q);printf("已删除的元素是:%d\n",e);}void visit(ElemType e){printf("%d,",e);}void ListTraverse(LinkList L){LinkList p=L->next;while(p){visit(p->data);p=p->next;}printf("\n");}void CreatListTail(LinkList *L,int n){LinkList p,r;int i;srand(time(0));*L=(LinkList)malloc(sizeof(Node));r=*L;for(i=0;i<n;i++){p=(Node *)malloc(sizeof(Node));p->data=rand()%100+1;r->next=p;r=p;}r->next=NULL;}int main(){LinkList L;int opp;printf("可执行的操作有:\n");printf("1.初始化或重置链表\n");printf("2.随机插入元素\n");printf("3.显示链表中数据元素个数\n");printf("4.输出所输入的链表元素\n");printf("5.所指位序的元素值\n");printf("6.链表已存在元素的位序\n");printf("7.请输入元素,求直接前驱\n");printf("8.请输入元素,求直接后继\n");printf("9.在第i个位置插入元素\n");printf("10.删除第i个元素\n");printf("11.销毁链表\n");printf("12.退出\n");printf("\n");printf("请输入你的选择:\n");do{scanf("%d",&opp);switch(opp){case 1:{InitList(&L);printf("链表已初始化\n");printf("下一步操作:");break;}case 2:{int n;printf("输入插入元素个数:");scanf("%d",&n);CreatListTail(&L,n);printf("下一步操作:");break;}case 3:{printf("链表中元素的个数是:%d\n",ListLength(L));printf("下一步操作:");break;}case 4:{ListTraverse(L);printf("下一步操作:");break;}case 5:{int m,e;printf("输入要取元素的位置:");scanf("%d",&m);if(m>ListLength(L)){printf("输入有误\n");}else{GetElem(L,m,e);printf("该元素是:%d\n",e);}printf("下一步操作:");break;}case 6:{int i,e;printf("输入要取的元素:");scanf("%d",&i);GetElemLo(L,i,e);printf("该元素的位置是:%d\n",e);printf("下一步操作:");break;}case 7:{int x;printf("要求哪个元素的前驱?");scanf("%d",&x);FindPre(L,x);printf("下一步操作:");break;}case 8:{int x;printf("要求哪个元素的后继?");scanf("%d",&x);FindNext(L,x);printf("下一步操作:");break;}case 9:{int i,e;printf("在哪个位置插入元素?");scanf("%d",&i);if(i>ListLength(L))printf("输入有误\n");else{printf("插入的新元素是:");scanf("%d",&e);LinkInset_L(L,i,e);printf("新链表:");ListTraverse(L);}printf("下一步操作:");break;}case 10:{int i,e;printf("要删除哪个位置的元素?");scanf("%d",&i);if(i>ListLength(L))printf("输入有误\n");else{ListDelete_L(L,i,e);printf("新链表:");ListTraverse(L);}printf("下一步操作:");break;}case 11:{DestroyList(L);printf("链表已销毁!\n");printf("下一步操作:");break;}case 12:{printf("谢谢使用\n");break;}default:{printf("输入错误,请重新输入\n");break;}}}while(opp!=12);return 0;}五、调试与测试数据六、实验总结。
链表的实现及应用实验原理与方法
链表的实现及应用实验原理与方法链表简介链表是一种数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表中的节点可以在内存中分散存储,相比于数组,链表更加灵活,动态插入和删除元素的效率更高。
链表的基本操作以下是链表的几个基本操作:1.创建链表:创建一个空链表,设置头节点为空。
2.插入节点:在链表的指定位置插入一个新节点,调整指针指向。
3.删除节点:根据给定值,在链表中找到并删除节点,调整指针指向。
4.查找节点:根据给定值,在链表中查找节点。
链表的实现方法链表可以通过不同的实现方法来实现,以下是两种常见的实现方法:单链表(Singly Linked List)单链表是最简单的链表形式,每个节点只包含一个指针指向下一个节点,最后一个节点指向空。
单链表的插入和删除操作效率高,但查找节点的效率较低。
双链表(Doubly Linked List)双链表在单链表的基础上增加了一个指向前一个节点的指针。
双链表的插入和删除操作相对复杂一些,但查找节点的效率更高,可以在双链表中前后遍历。
链表的应用链表作为一种常见的数据结构,在许多实际问题中都有广泛的应用,以下是几个常见的应用场景:1.链表用于实现栈和队列:链表可以轻松地实现栈和队列等数据结构,插入和删除操作效率高。
2.链表用于LRU缓存淘汰算法:链表可以按照访问顺序存储数据,当缓存容量不够时,可以通过删除链表尾部的节点来实现淘汰。
3.链表用于多项式求解:链表可以存储多项式的每一项,方便进行运算和求解。
链表的实验原理与方法链表的实验原理与方法可以包括以下几个方面:1.实验原理:了解链表的基本原理,包括节点结构、指针指向等。
2.实验设备:准备笔记本电脑和编程环境。
3.实验步骤:–步骤1:创建一个链表,设置头节点为空。
–步骤2:插入节点:根据需要在链表中插入节点,调整指针指向。
–步骤3:删除节点:根据需要在链表中删除节点,调整指针指向。
–步骤4:查找节点:根据给定值在链表中查找节点。
实验三 链表基本操作的实现
实验三链表基本操作的实现
一、实验目的
1.掌握线性表的链式存贮结构及基本操作,深入了解链表的基本特性,以便在实际问题背景下灵活运用它们。
2.巩固该存贮结构的构造方法,深入理解和灵活掌握链表的插入、删除等操作。
二、实验环境
⒈硬件:每个学生需配备计算机一台。
操作系统:DOS或Windows;
⒉软件:DOS或Windows操作系统+Turbo C;
三、实验要求
⒈将带头结点的单链表的建表、遍历、插入、删除分别定义为4个子函数,通过主函
数实现对上述子函数的调用。
⒉输入数据:链表中每个结点为结构体类型,数据域(data)设定为整型。
3在此基础上实现习题3.3
4 完成习题3.8,并通过主函数输入数据输出结果。
四、实验内容
附:1-3参考程序为P42-45。
4若采用带头单链表可在3的基础上做,亦可采用别的数据结构做,参考相应结构的基本运算。
五、报告要求
1.报告要求用专门的实验报告纸书写,字迹清晰,格式规范。
2.报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验要求。
3.报告中应书写源程序,且源程序中要有注释。
4.报告中应包含运行结果及结果分析。
如调试通过,请注明‘通过’并写出输入的数据及运行结果;如未调试通过或结果不正确,试分析原因。
5.报告最后包含实验总结和体会。
实验3 循环链表的操作
实验三循环链表的操作一.实验目的通过本实验中循环链表的使用,进一步熟练掌握链表的操作方式二.实验内容(1)建立一个单循环链表。
(2)实现单循环链表的逆置。
三.实验要求(1)根据实验内容编写程序,上机调试并获得运行结果(2)撰写实验报告四.关键操作思路与算法(1)建立循环链表首先要用s来表示需要建立的每个节点,用r来保存上一个s节点,然后在下一次进行循环时,让s = r->next,如此循环往复,一个用尾插法建立的单链表就形成了,然后在最后的时候进行一次判断看L链表的尾节点是否为头L,若不成立,则让尾节点指向头。
算法如下:1.//建立带头结点的循环单链表2.LinkedList* CreateListH()3.{4. LinkedList *L = NULL;5. LinkedList *s, *r = NULL;6.char ch;7. ch = getchar();8.while(ch != '$')9. {10. s = (LinkedList* )malloc(sizeof(LinkedList));11. s->data = ch;12.if(L == NULL)//!!!!!!!!!两个等号13. L = s;14.else15. r->next = s;16. r = s;17. ch = getchar();18. }19.if(r != L)20. r->next = L;21.return L;(2)循环链表倒置首先要把头结点用cur保存下来,然后把头结点的下一个节点用pre保存,然后每次让pre指向cur,然后循环,每次执行单步倒置之后,让pre和cur分别指向它们的下一个,当pre走到head时,让pre->next指向cur,这样就完成了整个循环链表的倒置,然后返回cur即原链表的尾节点,即新链表的头结点算法如下:1.//链表倒置2.LinkedList* ReList(LinkedList *head)3.{4. LinkedList *cur,*pre,*temp;5. cur=head;6. pre=head->next;7.while(pre != head)8. {9. temp=pre->next;10. pre->next=cur;11. cur=pre;12. pre=temp;13. }14. pre->next = cur;15.return cur;16.}五.源代码23.#include<math.h>24.#include<malloc.h>25.#include<stdlib.h>26.#include<stdio.h>27.#include<io.h>28.#define TRUE 129.#define FALSE 030.#define OK 131.#define ERROR -132.33.typedef char datatype;34.//定义节点35.typedef struct node37. datatype data;38.struct node *next;39.}LinkedList;40.//置空表41.void InitLList(LinkedList* L)42.{43. L->next = NULL;44.}45.//建立带头结点的循环单链表46.LinkedList* CreateListH()47.{48. LinkedList *L = NULL;49. LinkedList *s, *r = NULL;50.char ch;51. ch = getchar();52.while(ch != '$')53. {54. s = (LinkedList* )malloc(sizeof(LinkedList));55. s->data = ch;56.if(L == NULL)//!!!!!!!!!两个等号57. L = s;58.else59. r->next = s;60. r = s;61. ch = getchar();62. }63.if(r != L)64. r->next = L;65.return L;66. }67.//输出带头节点的循环单链表68.void PrintList(LinkedList *L)69.{70. LinkedList *p;71.int i = 0;72. p = L;73.while(i < 20)74. {75. printf("%4c",p->data);76. p = p->next;77. i++;78. }79. printf("\n");81.}82.//链表倒置83.LinkedList* ReList(LinkedList *head)84.{85. LinkedList *cur,*pre,*temp;86. cur=head;87. pre=head->next;88.while(pre != head)89. {90. temp=pre->next;91. pre->next=cur;92. cur=pre;93. pre=temp;94. }95. pre->next = cur;96.return cur;97.}98.//主函数99.int main()100.{101. LinkedList *a;102. printf("请输入表(输入$代表输入结束):"); 103. a= CreateListH();104. printf("顺序输出\n");105. PrintList(a);106.//倒置之后的结果107. printf("倒序输出\n");108. a = ReList(a);109. PrintList(a);110.return 0;111.}六.代码测试图七.实验总结:本节实验,我学到了循环线表和链表的倒置,循环链表它是在单链表基础上让尾节点指向链表头结点,这样就形成了一个循环链表,倒置链表算法就是设立两个节点,一个指向第一个节点cur,一个指向下一个节点pre,并让pre的next指向cur,然后每次让两个节点往后移直到完成整个链表的倒置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
江南大学物联网工程学院上机报告课程名称 班 级 数据结构 上机名称 姓 名 链表的实现和应 用 上机日期 学 号 2016.3.11 上机报告要求 1.上机名称 2.上机要求 3.上机环境 4.程序清单(写明运行结果) 5.上机体会1.上机名称链表的实现和应用2.上机要求⑴定义线性表的链式存储表示; ⑵基于所设计的存储结构实现线性表的基本操作; ⑶编写一个主程序对所实现的线性表进行测试; ⑷线性表的应用:①设线性表 L1和 L2分别代表集合 A 和 B,试设计算法求 A 和 B 的并集 C,并用线 性表 L3代表集合 C;②设线性表 L1和 L2中的数据元素为整数,且均已按值非递减有序排列,试 设计算法对 L1和 L2进行合并,用线性表 L3保存合并结果,要求 L3中的数据元素也按值非递减 有序排列。
⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式 相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。
3.上机环境Visual C++ 6.04.程序清单(写明运行结果)(1) #include<stdio.h> #include<stdlib.h> typedef int datatype; typedef struct node { datatype data; struct node *next; }LinkList; LinkList *CREATLISTF(LinkList *L,int n) { intnum,i; LinkList *head,*s,*r; head=L; r=head; head->next=NULL;printf("请输入集合中的元素(由小到大) :\n"); for(i=0;i<n;i++) { scanf("%d",&num); s=(LinkList*)malloc(sizeof(LinkList)); s->data=num; r->next=s; r=s; } r->next=NULL; return head; } LinkList *merge(LinkList *L1,LinkList *L2) { LinkList *L3,*pa,*pb1,*pb2,*pc; L3=(LinkList*)malloc(sizeof(LinkList)); L3->next=NULL; pa=L1->next; pb1=pb2=L2->next; pc=L3; while(pa && pb1) if(pa->data<pb1->data) { pc->next=pa;pc=pa; pa=pa->next; } else if(pa->data>pb1->data) { pc->next=pb1;pc=pb1; pb1=pb1->next; } else { pc->next=pa; pc=pa;pa=pa->next;pb1=pb2=pb1->next; } if(pa)pc->next=pa; else pc->next=pb1; return(L3); } void display(LinkList *L) { LinkList *head; head=L->next;do { printf("%d\t",head->data); head=head->next; }while(head!=NULL); } void main() { intan,bn; LinkList *L1,*L2,*L3; L1=(LinkList*)malloc(sizeof(LinkList)); L2=(LinkList*)malloc(sizeof(LinkList)); printf("\n 集合 A 中元素的个数:\n"); scanf("%d",&an); *L1=*CREATLISTF(L1,an); printf("集合 A 的元素为:\n"); display(L1); printf("\n 集合 B 中元素的个数:\n"); scanf("%d",&bn); *L2=*CREATLISTF(L2,bn); printf("集合 B 的元素为:\n"); display(L2); L3=merge(L1,L2); printf("\n 集合 A 与集合 B 的并集为:\n"); display(L3); }(2) #include<stdio.h> #include<stdlib.h> struct node { intexp; float coef; struct node *next; }; typedef struct node ListNode; ListNode *createpoly() { ListNode *h=NULL,*p,*q=NULL; int e; float c; printf("请输入系数和指数:"); scanf("%f,%d",&c,&e); while(e!=0||c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(h==NULL) h=p; else q->next=p; q=p; printf("请输入系数和指数:"); scanf("%f,%d",&c,&e); } return h; } void disppoly(ListNode *h) { ListNode *p; p=h; while(p!=NULL) { if(p->exp==0) printf("%.2f",p->coef); else printf("%fx^%d",p->coef,p->exp); p=p->next;if(p!=NULL) printf("+"); } printf("\n"); } ListNode *addpoly(ListNode *h1,ListNode *h2) { ListNode *p,*r=NULL,*s1,*s2,*s=NULL; float c; int e; s1=h1; s2=h2; while(s1!=NULL&&s2!=NULL) { if(s1->exp==s2->exp) { c=s1->coef+s2->coef; e=s1->exp; s1=s1->next; s2=s2->next; } else if(s1->exp>s2->exp) { c=s1->coef; e=s1->exp; s1=s1->next; } else { c=s2->coef; e=s2->exp; s2=s2->next; } if(c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(s==NULL) s=p; else r->next=p; r=p;} } while(s1!=NULL) { c=s1->coef; e=s1->exp; s1=s1->next; if(c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(s==NULL) s=p; else r->next=p; r=p; } } while(s2!=NULL) { c=s2->coef; e=s2->exp; s2=s2->next; if(c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(s==NULL) s=p; else r->next=p; r=p; } } return s; } void deletepoly(ListNode *h) { ListNode *p,*r=h; while(r!=NULL){ p=r->next; free(r); r=p; } } void main() { ListNode *head1,*head2,*head; printf("第一个多项式为:\n"); head1=createpoly(); printf("第二个多项式为:\n"); head2=createpoly(); printf("将两个多项式相加后得:\n"); head=addpoly(head1,head2); disppoly(head); deletepoly(head); }5.上机体会并集的表示有两种方法,顺序结构和链式结构,首先先要搞清楚这两者的区别,然后再加以编写,改进程 序。
而在多项式相加中,特别要注意相同指数,系数相加为0的情况,这需要重点考虑、重点编写。
在写 程序的时候,遇到了许多小问题,需要对每一段单独调试,花了很多时间和精力,这也是因为自己的 c 语 言基础不是很好的缘故,每次都需要去翻书查看。
还需要好好提高自己的基础,每次写程序都是一个锻炼 的过程。
教师评价优良中及 格不 及 格教师 签名日 期。