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