数据结构这个词,让人听起来就觉得晦涩难懂。其实很多东西,你不打开它的包装是很难知道它究竟是什么的,就像之前说的队列,打开它华丽的包装,其实里面装的就是数组。
数据结构是这样定义的:是相互之前存在着一种或多种特定关系的数组元素的集合。将这样一句话封装成这样一个词,大概是显得高深一点吧,但我们打破这个封装,就会对所谓的数据结构稍有了解了。那我们继续撕开它的包装,数据结构是可以这样划分的:线性结构,树形结构,图状结构和集合结构(如下图)。
当我们可以用图形表示一个东西时,那它就不再高深难懂。当然,数据结构不可能只包括这些简单的内容,不过这里我们先实现这些。
【第一篇——单向链表】
链表,也就是我们所说的线性结构,而所谓单向,那就不言而喻了。
首先要写一个类来定义链表中所需要的量:
public class JNode { public int Value; //记录的值 public JNode Next; //指向下一个节点的指针 }现在我们就仿照数组实现的队列来写链表,先实现它最基本的插入方法。这时会出现一个问题,当我们传参数时,肯定会传入要插入的元素,但是位置呢?所以我们需要有两种方法,一种是默认插入到最后的,另一种是插入到指定位置的。这就为我们编程提供了一种很好的思想——为用户着想。
如果把两种方法都写一遍,就会发现方法内容其实是重复的,那我们是不是可以在默认插入到最后的方法中直接调用插入到指定位置的方法,只不过指定的位置就是链表末端,这样就只需要写一遍具体方法了。
在写具体方法时,又要考虑到链表本身的情况,它是否有元素,或者传入的要插入的位置是否存在等等,我们必须要考虑到每一种情况才不会让用户使用是找到bug。
private JNode head=null; //定义一个头指针 private int count = 0; //count记录个数 //默认插入到最后 public void insert(JNode node){ insert(count,node); } //插入到pos处 public void insert(int pos,JNode node){ //如果pos<0或者pos>count,直接返回 if(pos<0||pos>count){ return; } //如果链表为空,直接插在第一位 if(count==0){ head=node; count++; return; } //正常情况 JNode flag = head; //定义一个标志 //循环找到pos的位置 for(int i=0;i<pos-1;i++){ flag = flag.Next; } //把指定位置后面的元素放在插入元素的后面 node.Next = flag.Next; //再把要插入的元素赋给指定位置后面的元素 flag.Next = node; //每插入一个元素,count就++ count++; }既然有插入,那对应就要有删除方法,删除的思想和插入是一样的,但还需增加一点,就是返回给用户他删除的元素:
//默认在头删除 public JNode delete(){ return delete(0); } //在Pos出删除 public JNode delete(int pos){ //如果删除位置不对 if(pos <0 || pos >count -1){ System.out.println("删除位置错误"); return null; } //如果没有元素 if(count == 0){ System.out.println("数组元素为空"); return null; } JNode flag = head; //定义一个标志 //如果只有一个元素 if(count==1){ head = null; count = 0; return head; } //如果pos=0 if(pos==0){ head=head.Next; flag.Next=null; count--; return flag; } //循环找到pos的位置 for(int i=0;i<pos-1;i++){ flag = flag.Next; } JNode temp = flag.Next; flag.Next = temp.Next; temp = null; count--; return temp; }
后面还要有获取元素的方法,获取个数的方法等等,相对简答一点,这里就不说明了,只要记得为用户着想就不会有问题。
线性结构不仅包括链表,也包括数组实现的队列。写完链表就会发现,其实它们的区别并不大,只是用另一种方法实现一样的东西,在用途上是没有区别的。但还是可以轻易的发现它们各自的优缺点:一方面,数组实现的队列很容易获取到它的个数,因为数组是有下标的,个数就是下标+1,但链表就需要定义一个计数器,插入元素时+1,删除元素的-1;另一方面,队列在插入元素时,需要把其余的元素一个一个拷贝到临时数组中,在一个一个的拷贝回去,过程比较繁琐,但链表只需要把指针指向不同的元素就可以做到了。
【第二篇——树】
对于树来说,我们先简单的了解一下如何建树。
树,这个字已经可以说明很多了,比如它肯定有一个根节点,然后分支出去就会有左节点、右节点,每个节点会有相应的值,有这几个量就可以实现树了。同样地,我们新建一个类来定义它们:
public class TreeNode { public int value; public TreeNode left; public TreeNode right; }
现在我们开始建树,当我们把每个值放到节点中时,要考虑它和它的根节点值的大小,这里将较小值放在左节点,较大值放在右节点(反过来也一样),等于的情况可以随意设定。那我们就需要考虑一个问题,用户在用这个方法时,他不会告诉你哪个是根节点,它只会输入要放入树中的数据,考虑到这点,就可以很容易的建好树了:
private TreeNode root; //定义一个根节点 //增加节点 值为value public void add(int value){ //建一个临时的树 TreeNode temp = new TreeNode(); //把value值赋给temp temp.value = value; //添加节点 在根下面添加temp //如果根节点为空,直接跳出 if(root == null){ root = temp; return; } //不为空,则在root下添加temp add(root,temp); } //增加节点,在head下面添加node public void add(TreeNode head ,TreeNode node){ //判断节点大小,如果node<head,放到左边 if(node.value<=head.value){ //如果左边不为空 if(head.left!=null){ add(head.left,node); } //如果左边为空 else{ head.left=node; } } //如果大于,放右边 else{ //如果右边不为空 if(head.right!=null){ add(head.right,node); } //如果右边为空 else{ head.right=node; } } }
其实现在我们已经建好了树,但是对于用户来说,它虽然可以把数据放进去,但却看不到这个树,那我们就需要写一个遍历树的方法,让用户看到这个树,这里写的是中序(左根右)遍历:
//中序遍历 public void middle(){ middleEx(root.left); System.out.println(root.value+" "); middleEx(root.right); } private void middleEx(TreeNode node){ if(node==null) return; middleEx(node.left); System.out.print(node.value +" "); middleEx(node.right); }
现在只是以中序输出了数据,其实最佳方法是用图形来展示出这个树,毕竟图形化界面才会真正让用户简单明了的看到数据的存放。
相关推荐
【数据结构报告关于数据结构课程设计的报告】 数据结构是一门关键的计算机科学课程,它研究如何有效地组织和存储数据,以便于数据的检索、处理和管理。在课程设计中,学生通常会接触到一系列的数据结构类型,如数组...
在“有关于数据结构的表达式求值”这个主题中,我们主要关注的是如何利用数据结构来解决表达式的求值问题。这通常涉及到抽象语法树(AST)和栈等数据结构的应用。 首先,表达式求值是编程语言理论的一个核心概念,...
本压缩包“关于数据结构的代码.rar”包含了与数据结构相关的源代码,对于学习和实践这些概念非常有帮助。 首先,我们要理解数据结构的基本类型。常见的数据结构有数组、链表、栈、队列、树、图等。数组是最基础的...
这个资源“关于数据结构的资料”显然包含了丰富的学习材料,特别是针对数据结构的学习者,提供了大量的题型和经典问题。下面将详细讨论数据结构的主要类型、重要性以及如何通过解题来深入理解这一主题。 数据结构...
总之,“关于数据结构的一些东西”这个压缩包可能包含了大量的学习资料,从基础理论到实践案例,对于提升编程技能和解决实际问题的能力大有裨益。无论是初学者还是经验丰富的开发者,都应该重视数据结构的学习,因为...
在“关于数据结构的实验内容”这个主题中,我们主要关注通过实际操作来理解和掌握各种数据结构的原理与应用。实验是学习数据结构的重要环节,因为它能帮助我们直观地理解抽象的概念,并通过编写代码实现这些概念来...
"刘汝佳关于数据结构方面的课件"是一个宝贵的资源,尤其对那些准备参加ACM(国际大学生程序设计竞赛)的学生来说,它是提升技能的重要工具。 首先,基础数据结构.pdf这部分内容可能涵盖了数组、链表、栈、队列等...
数据结构-图,关于数据结构的逻辑图
在这个“关于数据结构C++ 语言描述Cpp.rar”压缩包中,包含了几个常见的线性数据结构的C++实现,包括ArrayList(动态数组)、LinkedList(链表)以及LinkDeque(双端队列)和ArrayStack(数组栈)。让我们详细探讨...
这个“关于数据结构的课件值得一看”的资源提供了深入学习数据结构的宝贵资料,适合计算机科学的学生、程序员或者任何对算法和数据结构有兴趣的人士。 数据结构的选择和设计直接影响到程序的运行效率和内存占用,...
在这个“关于数据结构(计算机)的考研题集”中,我们可以找到一系列针对考研复习的数据结构习题,旨在帮助备考者深入理解和掌握这一领域的关键概念。 数据结构主要包括以下几类: 1. **线性结构**:如数组和链表...
《尚观培训Linux董亮老师关于数据结构的笔记与讲义》 在计算机科学领域,数据结构是不可或缺的基础,它是理解和解决复杂问题的关键。尚观培训的Linux董亮老师通过其丰富的教学经验,为我们提供了深入浅出的数据结构...
数据预算法--关于数据结构考试 数据结构预算法.doc
"cpp-这是一个关于数据结构的C语言静态链接库支持泛型"项目正解决了这一问题,它提供了一个静态链接库,允许C程序员在处理数据结构时使用类似泛型的功能。 首先,我们要理解什么是静态链接库。静态链接库是将所有...
此项目是基于java语言的关于数据结构的代码实现,包含所有经典数据结构算法,并且注释完善,非常适合了解和学习数据结构。另外包含了一个联系人存储工具(phonebook),它由swing展示,并应用了数据结构算法的相关概念...
关于数据结构的概念与特性及其组成
1. **数据结构的概念**:数据结构不仅仅是关于数据的存储,更关乎数据之间的关系和对这些关系的操作。常见的数据结构有数组、链表、栈、队列、树、图、哈希表等。 2. **数组**:是最基础的数据结构,它提供了一种...
本文档是关于数据结构的习题及实验参考答案,涵盖了数据结构的基础知识、逻辑结构、物理结构、算法、时间复杂度等方面。 数据结构基础 数据结构是指数据元素之间的逻辑关系,是从逻辑关系上描述数据的。它与数据...
这个压缩包包含了关于数据结构的多个重要组成部分,包括单元测试、单元作业、源码、编译后的程序以及课程设计和期末论文。下面将详细阐述这些内容的知识点。 首先,**单元测试** 是软件开发过程中的一个重要环节,...
关于数据结构-创建一棵树-C语言版; 关于数据结构-创建一棵树-C语言版