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("申请内存失败!\n"); 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("申请内存失败!\n"); 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("申请内存失败!\n"); 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("未找到正确的插入位置!\n"); 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个结点。链表所有数据如下:\n", CLLength(head)); 125 while (htemp != null) // 循环处理链表每个结点 126 { 127 nodeData = htemp.nodeData; // 获取结点数据 128 System.out.printf("结点(%s,%s,%d)\n", 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("链表测试。先输入链表中的数据,格式为:关键字 姓名 年龄\n"); 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("\n演示插入结点,输入插入位置的关键字:"); 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("\n演示删除结点,输入要删除的关键字:"); 169 170 key = input.next(); // 输入删除结点关键字 171 CL.CLDeleteNode(head, key); // 调用删除结点函数 172 CL.CLAllNode(head); // 显示所有结点 173 174 System.out.printf("\n演示在链表中查找,输入查找关键字:"); 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)\n", key, nodeData.key, 181 nodeData.name, nodeData.age); 182 } else // 若结点指针无效 183 { 184 System.out.printf("在链表中未找到关键字为%s的结点!\n", key); 185 } 186 } 187 }