データ構造-チェーンテーブルの概要

4441 ワード

JAvaのチェーンテーブル
チェーンテーブルは、さまざまなデータとオブジェクトを置くためのコンテナです.1本の果樹といえば、たくさんの果物が実っているので、容器を入れなければなりません.このとき、私たちが必要とするかごはjavaのlistになりたいと思っています.果物はいろいろなデータやオブジェクトに相当します.
JAvaの具体的な実装はカプセル化されており、配列キューよりも挿入と削除の面で優位に立っており、秩序があるという利点もあります.
それでも柔軟性が足りない場合が多いのは、遍歴構造でチェーンテーブルの要素にアクセスするのは遅いのではないかという欠点です.チェーンテーブルのヘッダから必要な要素までクエリーする必要があるので、チェーンテーブルは遍歴に使用されます.
チェーンテーブルは、以前に学んだキューや配列とは異なり、メモリに連続的に格納されていない非線形です.
一部のC++を学んだことがあるので、中先生はチェーンテーブルを紹介したことがあります.この2つの異なるプログラミング言語は時々似ていると思います.考えと大まかな枠組みはあまり違わない.違いはC++がポインタで実現され、javaにはポインタがありません.
また、削除部分を行う場合、C++には構造関数がありメモリの解放が行われますが、javaではこれらを管理する必要はありません.javaのゴミ回収メカニズムは自然に私たちにこのことをしてくれます.
チェーンテーブルと呼ばれる以上、自然にチェーンと関係があり、チェーンのように、実際のリンクはなく、アドレスの指向にすぎません.
チェーンテーブルについては、プログラムを書くとき、頭の中で想像するだけではいけません.それを描いて、具体化して、画像化して、よく理解していることがわかります.
チェーンテーブルの方法についてはここではあまり言わず、コードで直接実現します.
package   ;
/*
 *     Node 
 */
public class Node {
	//  Node    next  
	Node next;
	//  Object        
	Object data;
}

 
package   ;

public class MyLink {
	private Node root;//     
	private Node tail;//         
	private int length;//      
	
	public static void main(String [] args){
		//     MyLink   
		MyLink link = new MyLink();
		for(int i = 0;i<10;i++){
			link.add("student:"+i);		
		}
		for(int i = 0;i<10;i++){
			System.out.println(link.get(i));		
		}
		link.insert(0, "a");
		link.insert(3,"b");
		for(int i = 0;i<10;i++){
			System.out.println(link.get(i));		
		}
		
	    System.out.println("========");
	    System.out.println("      : "+link.remove(0));
		for(int i = 0;i<10;i++){
			System.out.println(link.get(i));		
		}
	}
	
	/**
	 *     ,        
	 * @param obj
	 */
	public void add(Object obj){
		//     Node    
		Node node = new Node();
		//        date  
		node.data=obj;
		//        ,                
		if(root==null){
			root=node;
			tail=node;
		}else{
			//     ,             node   
			tail.next=node;
			tail=node;
		}
		//       length+1
		length++;
	}
	
	/*
	 *              
	 */
	public Object get(int index){
		//        
		if(index<0||index>=length){
			return  new java.lang.ArrayIndexOutOfBoundsException("      !");
		}
		//        ,    index    ,   data
		Node temp=root;
		for(int i=0;i<index;i++){
			temp=temp.next;
		}
		return temp.data;
	}
	
	/*
	 *          ,      
	 */
	public Object remove(int index){
		//        
		if(index<0||index>=length){
			return new java.lang.ArrayIndexOutOfBoundsException("      !");
		}
		//          ,        ,      
		if(length==1){
			length--;
			Object obj=root.data;
			root=null;
			return obj;
		}
		length--;
		//    
		if(index==0){
			Object obj=root.data;
			root=root.next;
			return obj;
		}
		Node temp = root;
		//         
		for(int i=0;i<index-1;i++){
			temp=temp.next;
		}
		Object obj=temp.next.data;
		temp=temp.next.next;
		return obj;
	}
	
	public void insert(int index ,Object obj){
		if(index<0||index>=length){
			//      
			throw new java.lang.ArrayIndexOutOfBoundsException("      !");
		}
		Node node=new Node();
		node.data=obj;
		//         
		if(index==0){
			node.next=root;
			root=node;
			length++;
			
		}
		Node temp=root;
		//                
		for(int i=0;i<index-1;i++){
			temp=temp.next;
		}
		Node temp1=new Node();
		temp1=temp.next;
		temp.next=node;
		node.next=temp1;
		length++;//   1		
	}
}

 
実行結果:
student:0 student:1 student:2 student:3 student:4 student:5 student:6 student:7 student:8 student:9 astudent:0 student:1 bstudent:2 student:3 student:4 student:4 student:5 student:6 student:7=============除去するデータ:astudent:0 student:1 bstudent:2 student:3 student:4 student:4 student:5 student:6 student:7 student:8