java數據結構(一)——線性鏈表

    與C++類似java數據結構的線性表中也有順序表和線性表。但是順序表有幾個缺點:1.插入刪除操作不方便。2.存儲空間必須連續,當表較大時無法申請到足夠大的連續存儲空間。所以,本文介紹鏈表結構。

    鏈表具體結構如下:

    1.數據部分,保存需要存儲的數據。

    2.地址部分,保存下一個節點的地址。

代碼主要包括數據結構和數據操作。

數據結構部分:

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

class CLType								//定義鏈表結構
{
    DATA nodeData=new DATA();
    CLType nextNode;
}

數據操作部分:

1.添加節點

 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;
    	}
    }

2.插入頭結點

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; 
    	}
    }


3.查找結點

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;								//返回頭指針(java中沒有指針實際上是頭引用)
    }


4.刪除結點

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;									//未刪除 
    }

5.遍歷所有節點

void CLAllNode(CLType head) 					//遍歷鏈表 
    {
        CLType htemp;
        DATA 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;					//處理下一結點 
        }
    }
  
}

6.計算表長

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章