zoukankan      html  css  js  c++  java
  • java链表实现

      1 import java.util.Scanner;
      2 
      3 class DATA2 {
      4     String key; // 结点的关键字
      5     String name;
      6     int age;
      7 }
      8 
      9 class CLType // 定义链表结构
     10 {
     11     DATA2 nodeData = new DATA2();
     12     CLType nextNode;
     13 
     14     // 追加结点
     15     CLType CLAddEnd(CLType head, DATA2 nodeData) {
     16         CLType node, htemp;
     17         if ((node = new CLType()) == null) {
     18             System.out.print("申请内存失败!
    ");
     19             return null; // 分配内存失败
     20         } else {
     21             node.nodeData = nodeData; // 保存数据
     22             node.nextNode = null; // 设置结点指针为空,即为表尾
     23             if (head == null) // 头指针
     24             {
     25                 head = node;
     26                 return head;
     27             }
     28             htemp = head;
     29             while (htemp.nextNode != null) // 查找链表的末尾
     30             {
     31                 htemp = htemp.nextNode;
     32             }
     33             htemp.nextNode = node;
     34             return head;
     35         }
     36     }
     37 
     38     // 添加头结点
     39     CLType CLAddFirst(CLType head, DATA2 nodeData) {
     40         CLType node;
     41         if ((node = new CLType()) == null) {
     42             System.out.print("申请内存失败!
    ");
     43             return null; // 分配内存失败
     44         } else {
     45             node.nodeData = nodeData; // 保存数据
     46             node.nextNode = head; // 指向头指针所指结点
     47             head = node; // 头指针指向新增结点
     48             return head;
     49         }
     50     }
     51 
     52     // 查找结点
     53     CLType CLFindNode(CLType head, String key) {
     54         CLType htemp;
     55         htemp = head; // 保存链表头指针
     56         while (htemp != null) // 若结点有效,则进行查找
     57         {
     58             if (htemp.nodeData.key.compareTo(key) == 0) // 若结点关键字与传入关键字相同
     59             {
     60                 return htemp; // 返回该结点指针
     61             }
     62             htemp = htemp.nextNode; // 处理下一结点
     63         }
     64         return null; // 返回空指针
     65     }
     66 
     67     // 插入结点
     68     CLType CLInsertNode(CLType head, String findkey, DATA2 nodeData) {
     69         CLType node, nodetemp;
     70         if ((node = new CLType()) == null) // 分配保存结点的内容
     71         {
     72             System.out.print("申请内存失败!
    ");
     73             return null; // 分配内存失败
     74         }
     75         node.nodeData = nodeData; // 保存结点中的数据
     76         nodetemp = CLFindNode(head, findkey);
     77         if (nodetemp != null) // 若找到要插入的结点
     78         {
     79             node.nextNode = nodetemp.nextNode; // 新插入结点指向关键结点的下一结点
     80             nodetemp.nextNode = node; // 设置关键结点指向新插入结点
     81         } else {
     82             System.out.print("未找到正确的插入位置!
    ");
     83             // free(node); //释放内存
     84         }
     85         return head; // 返回头指针
     86     }
     87 
     88     int CLDeleteNode(CLType head, String key) {
     89         CLType node, htemp; // node保存删除结点的前一结点
     90         htemp = head;
     91         node = head;
     92         while (htemp != null) {
     93             if (htemp.nodeData.key.compareTo(key) == 0) // 找到关键字,执行删除操作
     94             {
     95                 node.nextNode = htemp.nextNode; // 使前一结点指向当前结点的下一结点
     96                 // free(htemp); //释放内存
     97                 return 1;
     98             } else {
     99                 node = htemp; // 指向当前结点
    100                 htemp = htemp.nextNode; // 指向下一结点
    101             }
    102         }
    103         return 0; // 未删除
    104     }
    105 
    106     int CLLength(CLType head) // 计算链表长度
    107     {
    108         CLType htemp;
    109         int Len = 0;
    110         htemp = head;
    111         while (htemp != null) // 遍历整个链表
    112         {
    113             Len++; // 累加结点数量
    114             htemp = htemp.nextNode; // 处理下一结点
    115         }
    116         return Len; // 返回结点数量
    117     }
    118 
    119     void CLAllNode(CLType head) // 遍历链表
    120     {
    121         CLType htemp;
    122         DATA2 nodeData;
    123         htemp = head;
    124         System.out.printf("当前链表共有%d个结点。链表所有数据如下:
    ", CLLength(head));
    125         while (htemp != null) // 循环处理链表每个结点
    126         {
    127             nodeData = htemp.nodeData; // 获取结点数据
    128             System.out.printf("结点(%s,%s,%d)
    ", nodeData.key, nodeData.name,
    129                     nodeData.age);
    130             htemp = htemp.nextNode; // 处理下一结点
    131         }
    132     }
    133 
    134 }
    135 
    136 public class LinkedList {
    137 
    138     public static void main(String[] args) {
    139         CLType node, head = null;
    140         CLType CL = new CLType();
    141         String key, findkey;
    142         Scanner input = new Scanner(System.in);
    143 
    144         System.out.print("链表测试。先输入链表中的数据,格式为:关键字 姓名 年龄
    ");
    145         do {
    146             DATA2 nodeData = new DATA2();
    147             nodeData.key = input.next();
    148             if (nodeData.key.equals("0")) {
    149                 break; // 若输入0,则退出
    150             } else {
    151                 nodeData.name = input.next();
    152                 nodeData.age = input.nextInt();
    153                 head = CL.CLAddEnd(head, nodeData);// 在链表尾部添加结点
    154             }
    155         } while (true);
    156         CL.CLAllNode(head); // 显示所有结点
    157 
    158         System.out.printf("
    演示插入结点,输入插入位置的关键字:");
    159         findkey = input.next(); // 输入插入位置关键字
    160         System.out.print("输入插入结点的数据(关键字 姓名 年龄):");
    161         DATA2 nodeData = new DATA2();
    162         nodeData.key = input.next();
    163         nodeData.name = input.next();
    164         nodeData.age = input.nextInt();// 输入插入结点数据
    165         head = CL.CLInsertNode(head, findkey, nodeData); // 调用插入函数
    166         CL.CLAllNode(head); // 显示所有结点
    167 
    168         System.out.print("
    演示删除结点,输入要删除的关键字:");
    169 
    170         key = input.next(); // 输入删除结点关键字
    171         CL.CLDeleteNode(head, key); // 调用删除结点函数
    172         CL.CLAllNode(head); // 显示所有结点
    173 
    174         System.out.printf("
    演示在链表中查找,输入查找关键字:");
    175         key = input.next(); // 输入查找关键字
    176         node = CL.CLFindNode(head, key); // 调用查找函数,返回结点指针
    177         if (node != null) // 若返回结点指针有效
    178         {
    179             nodeData = node.nodeData; // 获取结点的数据
    180             System.out.printf("关键字%s对应的结点为(%s,%s,%d)
    ", key, nodeData.key,
    181                     nodeData.name, nodeData.age);
    182         } else // 若结点指针无效
    183         {
    184             System.out.printf("在链表中未找到关键字为%s的结点!
    ", key);
    185         }
    186     }
    187 }
  • 相关阅读:
    delphi Int64Rec 应用实例
    PerformEraseBackground 擦除背景(ThemeServices)
    Delphi 的 Bit
    delphi 关于 "高位" 与 "低位"
    PByte和PChar的关系
    执行控制台程序并且获得它的输出结果
    Console下Pause效果的函数
    ByteType字符串中判断是否英文
    窗体包括标题作为一个位图复制到剪贴板
    inf 启动
  • 原文地址:https://www.cnblogs.com/yys369/p/3398071.html
Copyright © 2011-2022 走看看