JAVA鏈表簡單實現


import java.util.Scanner;


class DATA2
{
    String key;  				//結點的關鍵字 
    String name;
    int age;
} 

class CLType								//定義鏈表結構
{
    DATA2 nodeData=new DATA2();
    CLType nextNode;
    
    
  //追加結點 
    CLType CLAddEnd(CLType head,DATA2 nodeData)  	
    {
        CLType node,htemp;
        if((node=new CLType())==null)
        {
            System.out.print("申請內存失敗!\n"); 
            return null;  							//分配內存失敗 
        }
    	else
    	{
    		node.nodeData=nodeData; 				//保存數據 
    		node.nextNode=null;  				//設置結點指針為空,即為表尾 
    		if(head==null)  						//頭指針 
    		{
    			head=node;
    			return head;
    		}
    		htemp=head;
    		while(htemp.nextNode!=null) 			//查找鏈表的末尾 
    		{
    			htemp=htemp.nextNode;
    		}
    		htemp.nextNode=node;
    		return head;
    	}
    }

    
    //添加頭結點
    CLType CLAddFirst(CLType head,DATA2 nodeData) 
    {
        CLType node;
        if((node=new CLType())==null)
        {
            System.out.print("申請內存失敗!\n"); 
            return null;  							//分配內存失敗 
        }
    	else
    	{
    		node.nodeData=nodeData; 				//保存數據 
    		node.nextNode=head;  					//指向頭指針所指結點 
    		head=node;        						//頭指針指向新增結點
    		return head; 
    	}
    }
    
  //查找結點
    CLType CLFindNode(CLType head,String key) 		
    {
        CLType htemp;
        htemp=head;       							//保存鏈表頭指針 
        while(htemp!=null)      							//若結點有效,則進行查找 
        {
            if(htemp.nodeData.key.compareTo(key)==0) 		//若結點關鍵字與傳入關鍵字相同 
    		{
                return htemp;  						//返回該結點指針 
    		}
            htemp=htemp.nextNode; 					//處理下一結點 
        }
        return null; 								//返回空指針 
    }
  //插入結點 
    CLType CLInsertNode(CLType head,String findkey,DATA2 nodeData)  	
    {
        CLType node,nodetemp;    
        if((node=new CLType())==null) 		//分配保存結點的內容 
        {
            System.out.print("申請內存失敗!\n"); 
            return null;  								//分配內存失敗 
        }
        node.nodeData=nodeData;  					//保存結點中的數據 
        nodetemp=CLFindNode(head,findkey);
        if(nodetemp!=null)  								//若找到要插入的結點 
        {
            node.nextNode=nodetemp.nextNode;  		//新插入結點指向關鍵結點的下一結點 
            nodetemp.nextNode=node;    			//設置關鍵結點指向新插入結點 
        }
    	else
    	{
            System.out.print("未找到正確的插入位置!\n"); 
//            free(node);								//釋放內存
        }
        return head;								//返回頭指針
    }

    int CLDeleteNode(CLType head,String key)
    {
        CLType node,htemp; 						//node保存刪除結點的前一結點 
        htemp=head; 
    	node=head;
        while(htemp!=null)
        {
            if(htemp.nodeData.key.compareTo(key)==0) 		//找到關鍵字,執行刪除操作 
            {
                node.nextNode=htemp.nextNode;  		//使前一結點指向當前結點的下一結點
//                free(htemp);  						//釋放內存 
                return 1;
            }
    		else
    		{
                node=htemp;  						//指向當前結點 
                htemp=htemp.nextNode; 				//指向下一結點 
            }
         }
         return 0;									//未刪除 
    }

    int CLLength(CLType head)						//計算鏈表長度
    {
        CLType htemp;
        int Len=0;
        htemp=head;
        while(htemp!=null)      							//遍歷整個鏈表 
        {
            Len++; 								//累加結點數量 
            htemp=htemp.nextNode;					//處理下一結點 
        }
        return Len;									//返回結點數量 
    }

    void CLAllNode(CLType head) 					//遍歷鏈表 
    {
        CLType htemp;
        DATA2 nodeData;
        htemp=head;
        System.out.printf("當前鏈表共有%d個結點。鏈表所有數據如下:\n",CLLength(head)); 
        while(htemp!=null) 								//循環處理鏈表每個結點 
        {
            nodeData=htemp.nodeData;				//獲取結點數據 
            System.out.printf("結點(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age); 
            htemp=htemp.nextNode;					//處理下一結點 
        }
    }
  
}

public class LinkedList {

	public static void main(String[] args) {
		CLType node, head=null;
	    CLType CL=new CLType();
	    String key,findkey;
	    Scanner input=new Scanner(System.in);
	    
	    System.out.print("鏈表測試。先輸入鏈表中的數據,格式為:關鍵字 姓名 年齡\n"); 
	    do
		{ 
	    	DATA2 nodeData=new DATA2();
	        nodeData.key=input.next();
	       if(nodeData.key.equals("0")) 
			{
				break; //若輸入0,則退出
			}
			else
			{
				nodeData.name=input.next();
				nodeData.age=input.nextInt();
				head=CL.CLAddEnd(head,nodeData);//在鏈表尾部添加結點
			}
	    }while(true);   
	    CL.CLAllNode(head); 							//顯示所有結點
	 
	    System.out.printf("\n演示插入結點,輸入插入位置的關鍵字:") ;
	    findkey=input.next();  						//輸入插入位置關鍵字 
	    System.out.print("輸入插入結點的數據(關鍵字 姓名 年齡):");
	    DATA2 nodeData=new DATA2();
	    nodeData.key=input.next();
	    nodeData.name=input.next();
	    nodeData.age=input.nextInt();//輸入插入結點數據 
	    head=CL.CLInsertNode(head,findkey,nodeData);		//調用插入函數  
	    CL.CLAllNode(head); 							//顯示所有結點

	    System.out.print("\n演示刪除結點,輸入要刪除的關鍵字:");
	     
	    key=input.next();								//輸入刪除結點關鍵字 
	    CL.CLDeleteNode(head,key); 					//調用刪除結點函數 
	    CL.CLAllNode(head); 							//顯示所有結點   

	    System.out.printf("\n演示在鏈表中查找,輸入查找關鍵字:");
	    key=input.next();							//輸入查找關鍵字 
	    node=CL.CLFindNode(head,key);					//調用查找函數,返回結點指針 
	    if(node!=null)									//若返回結點指針有效 
	    {
	        nodeData=node.nodeData;				//獲取結點的數據 
	        System.out.printf("關鍵字%s對應的結點為(%s,%s,%d)\n" ,key,nodeData.key,nodeData.name,nodeData.age);        
	    }
		else										//若結點指針無效 
		{
	        System.out.printf("在鏈表中未找到關鍵字為%s的結點!\n",key); 
		}

	}

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM