與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;
}
}
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中沒有指針實際上是頭引用)
}
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; //返回結點數量
}