JAVA链表库_JAVA链表简单实现

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

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值