import java.util.Scanner;
类数据2
{
字符串密钥; //节点关键字
字符串名称;
int age;
}
定义class CLType//链表结构
{
数据2 node data=new data2(;
Cl类型下一个节点;
添加//节点
cltypecladdend(cltypehead,DATA2 nodeData )。
{
Cl类型节点,htemp;
if((node=newcltype ) ) ) ) ) )。
{
System.out.print ('内存申请失败! n ';
返回空值; //内存分配失败
}
else
{
节点. node data=node data; //保存数据
node.nextNode=null; //清空节点指针将成为页脚
if (头==空)//头指针
{
头=节点;
返回头;
}
htemp=head;
wile(htemp.nextnode!=查找空链表的末尾
{
htemp=htemp.nextNode;
}
htemp.nextNode=node;
返回头;
}
}
//添加标题节点
cltypecladdfirst(cltypehead,数据2节点数据)。
{
Cl类型节点;
if((node=newcltype ) ) ) ) ) )。
{
System.out.print ('内存申请失败! n ';
返回空值; //内存分配失败
}
else
{
节点. node data=node data; //保存数据
node.nextNode=head; //头指针指向的节点
头=节点; //头指针指向新节点
返回头;
}
}
//查找节点
cltypeclfindnode(cltypehead,字符串密钥) )。
{
Cl类型h temp;
htemp=head; //保存链表头指针
wile(htemp!=null(//如果节点有效则查找
{
if (h temp.node data.key.com Pareto (key )==0) ) /节点密钥与传入密钥相同时
{
返回时间; //返回到其节点指针
}
htemp=htemp.nextNode; //处理下一个节点
}
返回空值; 返回到//空指针
}
//插入节点
cltypeclinsertnode(cltypehead,字符串查找密钥,DATA2 nodeData ) )。
{
Cl类型节点,节点模板;
if () node=newcltype ) ) )==null )//分配存储节点的内容
{
System.out.print ('内存申请失败! n ';
返回空值; //内存分配失败
}
节点. node data=node data; 保存//节点的数据
节点时间=clfindnode (head,findkey );
节点时间!=null(//如果找到要插入的节点
{
node.next node=node temp.next node; //新插入的节点指向关键节点的下一个节点
nodetemp.nextNode=node; //使关键节点指向新插入的节点
}
else
{
System.out.print ('未找到正确的插入位置! n ';
//free(node ); //释放内存
}
返回头; //返回头指针
}
intcldeletenode(cltypehead,字符串密钥) )。
{
Cl类型节点,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);
}
}
}