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

java链表实现的更多相关文章

  1. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  2. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  3. JAVA链表中迭代器的实现

    注:本文代码出自<java数据结构和算法>一书. PS:本文中类的名字定义存在问题,Link9应改为Link.LinkList9应该为LinkList.由于在同包下存在该名称,所以在后面接 ...

  4. JAVA 链表操作:单链表和双链表

    主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...

  5. java 链表数据结构

    首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了.下面直接进入正题: 先要定义一个结点类 ...

  6. Java 链表

    按链表的组织形式分有ArrayList和LinkList两种.ArrayList内部其实是用数组的形式实现链表,比较适合链表大小确定或较少对链表进行增删操作的情况,同时对每个链表节点的访问时间都是co ...

  7. 算法_栈与队列的Java链表实现

    链表是一个递归的数据结构,它或者为null,或者是指向一个结点的引用,该结点含有一个泛型的元素和指向另一个链表的引用.可以用一个内部类来定义节点的抽象数据类型: private class Node ...

  8. 学习记录 java 链表知识

    01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. ...

  9. Java链表的一些操作:

    [还有一些其他的算法提]http://blog.csdn.net/WalkingInTheWind/article/category/906980 [转]http://blog.csdn.net/lu ...

  10. 面试中的Java链表

    链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...

随机推荐

  1. DB2 57016报错的解决办法(表状态不正常,导致表无法操作)

    新建了一张表,删除了一列,然后执行insert的时候,报错 57016,解释为:因为表不活动. 1.执行db2 "load query table <tabname>" ...

  2. 【scrapy】爬虫的时候总在提示 KeyError: 'novelLabel'

    调试的时候总是提示 KeyError: 'novelLabel'然后决定断点调试一下, 在def parse_book_list(self, response):方法下,添加print(respons ...

  3. FileItem类的常用方法(关于文件上传的)

    1.boolean  isFormField().isFormField方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段.如果是普通文本表单字段,返回一个tr ...

  4. xshell 5 书写汉字乱码

    使用win10安装xshell5后发现使用xshell连接虚拟机后,能识别中文但是无法输入中文了   控制面板--语言   删除除中文输入法之外的所有输入法和美式键盘 然后就可以正常输入中文了,为了英 ...

  5. 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密

    后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...

  6. Java_10 继承

    1 继承的好处 继承的出现提高了代码的复用性,提高软件开发效率. 继承的出现让类与类之间产生了关系,提供了多态的前提. 2 继承的注意事项 在Java中,类只支持单继承,不允许多继承,也就是说一个类只 ...

  7. 34-BigInteger详解

    在用C或者C++处理大数时感觉非常麻烦,但是在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数, ...

  8. 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'

    80*25彩色字符模式显示缓冲区的结构: 内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区.向这个地址空间写入数据,写入的内容将立即出现在显示器上. 在 ...

  9. python学习-名字管理

    记录代码片段 print("="*50) print(" 名片管理系统 v0.01") print("1. 添加一个新的名片") print ...

  10. power designer 从sqlserver数据库获取字段说明&导出rtf文档模板

    具体的操作稍后在修改 附件下载:https://files.cnblogs.com/files/zinan/powerDesigner.rar