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