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. mac通过命令行获取证书和配置文件过期时间

      背景:ios打包证书的profile配置文件过期了,导致以前已经打完的测试包不能安装.所以需要加上检测机制,在打包时提示证书是否将要过期,如果要过期了给出提示   方案: 1.查找profile配 ...

  2. nginx配置 解决ajax请求跨域问题

    文章来源:http://to-u.xyz/2016/06/30/nginx-cors/ 背景描述 最近在研究RESTful API接口设计,使用的是Nginx,要实现本地http://127.0.0. ...

  3. new usercontrol

    http://www.codeproject.com/Articles/12421/The-Grouper-A-Custom-Groupbox-Control

  4. pta7-20 畅通工程之局部最小花费问题(Kruskal算法)

    题目链接:https://pintia.cn/problem-sets/15/problems/897 题意:给出n个城镇,然后给出n×(n-1)/2条边,即每两个城镇之间的边,包含起始点,终点,修建 ...

  5. NumPy 迭代数组

    NumPy 迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用 arange() ...

  6. 1009 数字1的数量 数位dp

    1级算法题就这样了,前途渺茫啊... 更新一下博客,我刚刚想套用数位dp的模板,发现用那个模板也是可以做到,而且比第二种方法简单很多 第一种方法:我现在用dp[pos][now]来表示第pos位数字为 ...

  7. PAT1020 (已知中序,后序遍历转前序遍历)

    已知后序与中序输出前序(先序):后序:3, 4, 2, 6, 5, 1(左右根)中序:3, 2, 4, 1, 6, 5(左根右) 已知一棵二叉树,输出前,中,后时我们采用递归的方式.同样也应该利用递归 ...

  8. 食物链(带权&种类并查集)

    食物链 http://poj.org/problem?id=1182 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9326 ...

  9. 【git】gitignore

    gitignore git专门有个文件用来管理那些不被纳入版本库的文件,这个文件是 [.gitignore],所有不被包含的都能放进去,但这个是有前提的. 前提 前提是文件如果没被git客户端trac ...

  10. 单击Gridview中LinkButton,获取当前行索引及某单元格值,进行相关处理

    1.在Gridview中添加模板列,在其中加入Linkbuttion,增加CommandName属性 (设置命令名),并赋值 <asp:TemplateField HeaderText=&quo ...