`
clover珂
  • 浏览: 3277 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

数据结构小结——简单实现链表与数组队列

    博客分类:
  • java
 
阅读更多

 一般常用的结构类型有:

  1. 数组 Array
  2. 链表 Linked List
  3. 队列 Queue
  4. 栈 Stack
  5. 堆 Heap
  6. 树 Tree
  7. 图 Graph
数据结构也可以根据存储的地址是不是连续的分做两大类,连续的和非连续的
连续的有:数组,栈
非连续的有:链表,堆,树
队列要看情况,要看是采用什么方式存储的。
 主要总结一下数组,链表以及由数组组成的数组队列和链表链接的链表队列
【数组】
 
 定义数组的几种方式:
     
          数据类型[ ] 数组名 = new 数据类型[长度];
          eg:int[ ] array = new int[10];

          数据类型[ ] 数组名;
          数组名 = new 数据类型[长度];
          eg: int[ ] array;
               array = new int[10];

          数据类型[ ] 数组名 = {值,...};
          数据类型[ ][ ] 数组名 = {{值,...},...};(二维数组
          eg: int[ ] array = {1,2,3,4}
                int[ ] [ ]  array2 = { { 1,2,3 },
                                             { 4,5,6, },
                                             { 7,8,9 } };
 
          数据类型[ ] 数组名 = new 数据类型[ ]{值,...};
          eg: int[ ] array = new int[ ]{1,2,3,4 };
          
          数据类型[ ] 数组名;
          数组名 = new 数据类型[ ]{值,...};
          eg: int[ ] array;
                array = new int[ ]{ 1,2,3 };
   
     获取一维数组的大小(长度):数组名.length
     获取二维数组有多少行数据:数组名.length
     获取二维数组某一行有多少列数据:数组名[行下标].length
     
     
     数组的特点:
          1、大小一定
          2、类型一定   
          优点:根据下标访问元素方便迅速
          缺点:因为大小一定所以添加删除等操作不方便
 
【链表】
   链表由节点,存储的数据和引用组成。
    链表的特点:
     添加、删除方便。这同时也是链表的优点。
    链表的缺点:
     不像数组那样可以通过下标直接找到存储的元素,链表必须通过遍历才能查找到存储的数据。
 
 
 
【数组队列】
用数组实现队列,依赖数组名存储的是数组对象在内存中的首地址。
添加删除节点时都需要重新建立一个数组,添加一个节点时新建数组扩大一位,删除一个节点时减少一位。
在这里采用了泛型,泛型使用某一种符号来泛指Java中所有的数据类型。
package com.hnu.wk1108数组队列;

public class ArrayQueue<E> {
	
		private int  size = 0;
		private Object[] array = new Object[0];

		// 添加新元素
		public void add(E e) {
			// 定义一个比原数组长一个单位的新数组array1
			Object array1[] = new Object[size + 1];
			// 把原数组中的元素传给新数组
			for (int i = 0; i < size; i++) {
				array1[i] = array[i];
			}
			// 把新元素添加给新数组的最后一个位置
			array1[size] = e;
			// 让原数组指向新数组
			size++;
			array = array1;
		}
		
		// 删除,根据下标
		public void delete(int n) {
			if (n >= 0 && n < size) {
				// 定义一个比原数组短一个单位的新数组array1
				Object array2[] = new Object[size - 1];
				// 把被删除元素前的元素传给新数组
				for (int i = 0; i < n; i++) {
					array2[i] = array[i];
				}
				// 把被删除元素后的元素向前移动一位传给新数组
				for (int i = n; i < size - 1; i++) {
					array2[i] = array[i + 1];
				}
				// 数组元素个数减少
				size--;
				// 让原数组指向新数组
				array = array2;
			}
		}
		//获取
		public E gete(int n){
			if( n>=0 && n<getsize() ){
				E e=(E) array[n];
				return e;
			}
			return null;
		}
		// 得到数组元素个数
		public int getsize() {
			return size;
		}

	

}
 
package com.hnu.wk1108数组队列;

public class tester {

	public static void main(String[] args) {
		ArrayQueue<String> aq = new ArrayQueue(); //String对象
		//添加节点
		for(int i= 1;i<=5;i++){
			aq.add(" "+i);
		}
		printaq(aq);
		//删除节点
		int j = 2;
		aq.delete(j);
		System.out.println("删除第"+(j+1)+"个后:");
		printaq(aq);
	}
	
	public static void printaq(ArrayQueue<String> aq ){
		for(int i=0;i<aq.getsize();i++){
			System.out.println(aq.gete(i));
		}
	}

}
 

【链表队列】
 用链表实现队列,依赖链表的引用可以方便地找到下一个节点。
节点类
package com.hnu.wk1113链表队列;


public class LinkNode {
	
	public Object data;//链表节点内的数据
	public LinkNode next;//下一个节点的指向
	
}
 方法类
package com.hnu.wk1113链表队列;



public class LinkList {
	
	private LinkNode root = null;//首节点
	private LinkNode last = null;//尾节点
	private int size = 0;
	
	
	

	/**
	 * 给链表添加节点的方法
	 * @param data 添加的数据对象
	 */
	public void add(Object data){
		if(root==null){
			root = new LinkNode();	
			root.data = data;//数据存入首节点
			last=root;
			size++;
		}else{
			LinkNode node = new LinkNode();//新建节点
			node.data = data;//存入数据
			last.next = node;//上个节点指向新建的节点
			last = node;//last指向新建节点
			size++;
		}
	}
	
	/**
	 * 获取指定位置节点的数据
	 * @param index 节点位置
	 * @return 指定节点数据
	 */
	public Object getIndex(int index){
		if(index<0||index>size){
			 return null;	 
			 
		 }
		LinkNode node = root;
		for(int i=0;i<index;i++){
			node = node.next;
		}
		return node.data;
	}
	
	/**
	 * 在指定位置插入节点
	 * @param index 指定位置
	 * @param o 插入节点数据   
	 * 
	 */
	public void insert(int index,Object data){
		if ( index < 0 || index > size){
			 throw new RuntimeException("下标越界");
		}else{
			if(root==null){
				root = new LinkNode();	
				root.data = data;//数据存入首节点
				last=root;
				size++;
			}else{
			//新建要插入的节点
			LinkNode newNode = new LinkNode();
			newNode.data = data;
			//得到当前索引位置的节点
			
			LinkNode node = root;
			//遍历至索引位置
			for(int i = 0;i<index-1;i++){
				node = node.next;
			}
			newNode.next = node.next;
			node.next = newNode;
			size++;

			}
		}
	}
	
	
	/**
	 * 删除指定位置节点的方法
	 * @param index 指定位置
	 */
	public void delete(int index){
//		String str ;
		if ( index < 0 || index > size){
			 throw new RuntimeException("下标越界");
		}else{
			//得到当前索引位置的节点
			LinkNode node1 = new LinkNode();
			node1.data = this.getIndex(index);//获取索引位置的节点
			LinkNode node = root;
			//遍历至索引位置前一个
			for(int i = 0;i<index-1;i++){
				node = node.next;
			}
			node.next = node.next.next;
			size--;
//			System.out.println("   "+node1.data);
		}
	}
	
	
	/**
	 * 获取链表长度的方法
	 * @return 链表长度
	 */
	public int getSize(){
		return size;
	}

}
 测试类
package com.hnu.wk1113链表队列;


public class Tester {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		LinkList list = new LinkList();
		String s1 = "a";
		list.add(s1);
		String s2 = "b";
		list.add(s2);
		String s3 = "c";
		list.add(s3);
		
		int count=list.getSize();
		
		
		for(int t=0;t<count;t++){
			Object obj=list.getIndex(t);
			String s=(String)obj;
			System.out.println(t+" 号位取出的是: "+s);
		}
		
		list.insert(1, "d");
     	count=list.getSize();
		System.out.println("插入一个节点:");
		for(int t=0;t<count;t++){
			Object obj=list.getIndex(t);
			String s=(String)obj;
			System.out.println(t+" 号位取出的是: "+s);
		}
		
		list.delete(2);
		count=list.getSize();
		System.out.println(list.getSize());
		System.out.println("删除后:");
		for(int t=0;t<count;t++){
			Object obj=list.getIndex(t);
			String s=(String)obj;
			System.out.println(t+" 号位取出的是: "+s);
		}
	}

}
 
链表和数组都是基本的,常常会用到的数据类型,要好好练习_(:з」∠)_
最后再让我吐槽一下这个博客的编辑器真难用啊(╯‵□′)╯ノ┻━┻☆ 
格式经常会不统一啊强迫症患者的世界有人懂吗吗吗!இ௰இ
分享到:
评论

相关推荐

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    10.8 有关指针的数据类型和指针运算的小结 167 10.8.1 有关指针的数据类型的小结 167 10.8.2 指针运算的小结 167 10.8.3 void 指针类型 168 11 结构体与共用体 11.1 定义一个结构的一般形式 170 11.2 结构类型变量的...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    10.8 有关指针的数据类型和指针运算的小结 167 10.8.1 有关指针的数据类型的小结 167 10.8.2 指针运算的小结 167 10.8.3 void 指针类型 168 11 结构体与共用体 11.1 定义一个结构的一般形式 170 11.2 结构类型变量的...

    数据结构与算法分析_Java语言描述(第2版)

    《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...

    数据结构与算法分析

     1.4.3 接口与实现的分离   1.4.4 vector和string   1.5 C++细节   1.5.1 指针   1.5.2 参数传递   1.5.3 返回值传递   1.5.4 引用变量   1.5.5 三大函数:析构函数、复制构造函数和...

    严蔚敏 数据结构(C语言版) 代码 23490 书中算法

    1.3 抽象数据类型的表示与实现 7 1.4 算法和算法分析 11 1.4.1 算法的定义及特性 11 1.4.2 评价算法优劣的基本标准 11 1.4.3 算法的时间复杂度 12 1.4.4 算法的空间复杂度 14 1.5 小结 15 习题 16 第...

    数据结构与算法分析_Java语言描述(第2版)]

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    数据结构与算法分析Java语言描述(第二版)

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    数据结构与算法分析 Java语言描述第2版

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    数据结构与算法分析C描述第三版

     1.4.3 接口与实现的分离   1.4.4 vector和string   1.5 C++细节   1.5.1 指针   1.5.2 参数传递   1.5.3 返回值传递   1.5.4 引用变量   1.5.5 三大函数:析构函数、复制构造函数和operator...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    3.6.3 应用 3.7 队列adt 3.7.1 队列模型 3.7.2 队列的数组实现 3.7.3 队列的应用 小结 练习第4章 树 4.1 预备知识 4.1.1 树的实现 4.1.2 树的遍历及应用 4.2 二叉树 4.2.1 实现 4.2.2 例子...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    3.6.3 应用 3.7 队列adt 3.7.1 队列模型 3.7.2 队列的数组实现 3.7.3 队列的应用 小结 练习第4章 树 4.1 预备知识 4.1.1 树的实现 4.1.2 树的遍历及应用 4.2 二叉树 4.2.1 实现 4.2.2 例子...

    数据结构与算法:C++描述

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

    数据结构算法与应用(C++语言描述).rar

    第二部分 数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类ChainNode 和Chain 86 3.4.2 ...

    数据结构算法与应用-C++语言描述

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

    数据结构算法与应用 很详细的,数据结构算法全集 这个是你想找的

    数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类...

    数据结构(C语言描述)

    第二部分 数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类ChainNode 和Chain 86 3.4.2 ...

    数据结构算法与应用-C__语言描述

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

Global site tag (gtag.js) - Google Analytics