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. js中的arguments对象

    在Javascript中没有函数重载,而arguments对象弥补了这点不足. js函数的参数是一个数组,在参数个数不固定的情况下,只需要给方法传递不同元素个数的数组即可.即使声明函数时没有形式参数, ...

  2. Integer 原码解读

    有一天,突然发现,阅读原码可以发现很多有趣的东西.在Java中,我们知道很多东西都是封装好的,拿来即用,当你有一天去研究它拿来的东西是如何具体操作的,将会是非常有趣的事情. 在上一篇研究HashMap ...

  3. day17 正则表达式 re模块和hashlib模块

    今日内容 1. re&正则表达式(*****) 注:不要将自定义文件命名为re import re re.findall(正则表达式,被匹配的字符串) 拿着正则表达式去字符串中找,返回一个列表 ...

  4. leetcode 中等题(2)

    50. Pow(x, n) (中等) double myPow(double x, int n) { ; unsigned long long p; ) { p = -n; x = / x; } el ...

  5. NumPy 矩阵库(Matrix)

    NumPy 矩阵库(Matrix) NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象. 一个 的矩阵是一个由行(row)列(col ...

  6. Python3 round() 函数

    Python3 round() 函数  Python3 数字 描述 round() 方法返回浮点数x的四舍五入值. 语法 以下是 round() 方法的语法: round( x [, n] ) 参数 ...

  7. TOJ4127: Root of String

    传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4127 4127: Root of ...

  8. 【python】入门指南:控制语句

    条件控制 if,if-else,if-elseif-else #!/bin/python a = 'test' if a == 'test': print('a is %s' %(a)) else: ...

  9. how2j网站前端项目——天猫前端(第一次)学习笔记2

    今天早上开始首页内容.首页除了公共页面,还有许多自己的内容:导航和轮播.分类菜单.推荐产品展示,最后还有js的互动. 一.导航和轮播的学习 在自己做图片的轮播时,还是没有一次成功.存在了好几处问题: ...

  10. WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)

    WorkerMan中work.php中 resetStd 方法中代码如下 public static function resetStd() { if (!static::$daemonize || ...