项目4 线性表的链式结构算法设计
【实验目的】
1、掌握线性表的链式结构定义;
2、掌握线性表的链式操作,如建立、查找、插入和删除等。
【实验内容】
1、定义链式数据结点;
2、定义线性表的链式结构。
3、实现链式的查找、计算长度、插入新结点、删除结点、显示所有结点信息等。
【实验参考代码】
请回答:
package com;
public class LinkNode { //单链表的结点
String key; //结点的关键字
int data; //结点的数据值
LinkNode nextNode; //指向下一个结点
public LinkNode( LinkNode node){
this.nextNode = node;
}
public LinkNode(String key , int data ){
this.key = key;
this.data=data;
this.nextNode = null;
}
}
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
package com;
public class LinkList {
LinkNode head; // 创建 单链表的 头结点
public LinkList() { //单链表的构造方法
head = new LinkNode(null); //new一个头结点,头结点指针域为null
}
public int AddNode(String key, int data) { //添加新结点
LinkNode node, htemp; //引入临时变量 LinkNode node, htemp
node = new LinkNode(key, data); //创建一个新结点 node
if (node == null) { //判断 node是否创建,如果node为null则不存在
System.out.print("创建新结点node失败!\n");
}
else {
if (head.nextNode == null) { // 首次插入第一个结点,对头结点指针域是否为
// 空进行判断,如果为空,则进行插入新结点。
head.nextNode = node; //把第一个结点放到 头结点后面,
//令头结点指针域指向第一个新结点node
System.out.println(“成功添加新结点 !”);
return 1; //插入成功,返回为1;
}
htemp = head; // 把头结点赋值为 htemp,从而找到单链表起始位置
while (htemp.nextNode != null) { // 根据当前结点的指针域nextNode不为空,利用
//循环,找到 单链表中 上一次插入的最后一个结点
htemp = htemp.nextNode; //提取当前结点的指针域nextNode的值,重新赋值给 htemp
}
htemp.nextNode = node; // 插入新结点
}
return 1; //返回 1
}
public int getLength() { //方法的功能:获取单链表的总长度,多少个结点
int j = 0; //变量 j 存储 结点总个数,初始值为0
LinkNode htemp; //创建临时变量LinkNode htemp
htemp = this.head; //把当前链表头head赋值给 htemp,从而获取链表
while (htemp.nextNode != null) { //判断当前结点的nextNode是否为空,以便确定下一个结点是否存在。如果不为空,说明下一个结点是存在的,则j自动加1
j++; //j记录统计的总个数
htemp = htemp.nextNode;//提取当前结点的指针域的值,赋值给htemp,以便 获取下一个结点,进而利用循环,统计总的结点个数
}
System.out.println("当前链表长度是 :" + j);
return j; //返回 j值
}
public void GetAll() { //在终端输出每一个结点的内容。
LinkNode htemp; //创建临时变量LinkNode htemp
htemp = this.head; //把当前链表头head赋值给 htemp,从而获取链表
while (htemp.nextNode != null) {//判断当前结点的nextNode是否为空,以便确定下一个结点是否存在。如果不为空,说明下一个结点是存在的,从而可以读取结点
System.out.println("链表的所有元素以此是 :【 key: " + htemp.nextNode.key + " ,data " + htemp.nextNode.data + " ]、 ");//提取结点的内容,在终端输出
htemp = htemp.nextNode; //提取当前结点的指针域的值,赋值给htemp,以便 获取下一个结点, 如果下一个结点为空,则停止循环,否则,玖可以找到下一个结点了。
}
}
public void GetLocateList( int i ){ //找到指定位置的结点
LinkNode htemp =head; //把当前链表头head赋值给 htemp,从而获取链表
int j = 0; //记录的是 定位到 要查找的那个结点的前一个结点
while (htemp.nextNode != null && j<i) {
htemp = htemp.nextNode; //提取当前结点的指针域 赋值给htemp
//从而 获取下一个结点
j++; //记录已经访问过的结点个数,但不超过要找的那个结点位置
}
if(j==i)
System.out.println("该指定位置的结点值是 :"+htemp.data);
else
System.out.println("不好意思,没有找到 。");
}
}
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
package com;
public class test {
public static void main(String[] args) {
LinkList linklist = new LinkList(); //创建单链表
System.out.println(“初始化了链表,”+“长度是:0”);
linklist.AddNode( "001",10 ); // 为单链表插入新结点
linklist.AddNode( "002",20 );
linklist.AddNode( "003",30 );
linklist.getLength(); //获取单链表的长度
linklist.GetAll(); //显示单链表中所有结点元素内容
}
}