实验一:线性表的基本操作
一、实验目的:
1、熟悉Java 上机环境,掌握Java语言编程方法,熟练运用Java语言实现数据结构设计和算法设计。
2、掌握线性表的顺序存储结构和链式存储结构的定义与基本操作,并能用Java语言实现线性表基本功能。
3、掌握利用线性表编写算法解决实际问题的方法。
二、实验内容:
1、编写一个Java语言程序,实现带头结点的单链表存储及基本操作。
实验步骤:
①、在Java编辑环境中新建程序,参考书本P48/P41内容,输入完整程序内容,并保存和编译;
②、运行程序,输出操作菜单;
③、依次实现单链表插入、删除、追加、查找、取元素、判空、求长度等;
2、编写一个Java语言程序,利用线性表实现约瑟夫环问题,参考书本程序示例【例2.1】、【例2.2】,完善该程序并运行。
实验步骤:
①、在Java编辑环境中新建程序,根据【例2.1】、【例2.2】输入完整程序内容,并保存和编译;
②、运行程序,输入约瑟夫环长度number、起始位置start、计数值distance;
③、依次输入约瑟夫环中number个数据元素;
④、输出约瑟夫环执行过程。
三、操作步骤:
/*
* 任务一:
* 编写一个Java语言程序,实现带头结点的单链表存储及基本操作。
实验步骤:
①、在Java编辑环境中新建程序,参考书本P48/P41内容,输入完整程序内容,并保存和编译;
②、运行程序,输出操作菜单;
③、依次实现单链表插入、删除、追加、查找、取元素、判空、求长度等;
*/
public class SinglyList
//头指针,指向单链表的头结点
public Node
public T[] values;
//构造空单链表
public SinglyList(){
this.head=new Node
}
public SinglyList(T[] values){
this();//调用自身的构造方法 SinglyList();
//rear指向单链表的最后一个结点
Node
for(int i=0;i<values.length;i++){
rear.next=new Node
rear=rear.next;
}
}
//判断是否为空
public boolean isEmpty(){
return this.head.next==null;
}
//判断单链表的长度
public int getLength(){
int i=-1;
for(Node
i++;
}
return i;
}
//存取单链表中指定元素的值
public T get(int i){
Node
int j;
for(j=0;p!=null && j<i;j++)//条件为该表不为空表并且j
p=p.next;
return(j>=0 && p!=null)? p.data : null;
}
//返回单链表中所有元素的描述字符串,形式为(,)
public String toString(){
String str=this.getClass().getName()+"(";
for(Node
str =str+ p.data.toString();
if(p.next != null)
str += ",";
}
return str+")";
}
//插入
/*
* 1.插入x作为第i个元素,x!=null,返回插入点
* 2.对序号i进行容错措施,若i<0则插入x在最前,若x>n则插入x在最后
*/
public Node
if(x==null)
throw new NullPointerException("x==null");
Node
for(int j=0;j<i;j++){
front=front.next;
}
front.next=new Node
return front.next;
}
//删除,并且返回被删除元素
public T remove(int i){
Node
for(int j=0;j<i;j++)
front=front.next;
T old=front.next.data;
front.next.data=front.next.next.data;
front.next=front.next.next;
return old;
}
//返回第一次出现t的位置
public int search(String t){
int i=-1;
for(Node
if(p.data == t)
break;
i++;
}
return i;
}
public class Node
public Node
public T data;
Node(){
}
Node(T data,Node
this.data=data;
this.next=next;
}
}
以上为主要程序方法
以下为测试部分,程序的运行:
public static void main(String []args ){
String[] t ={"a0","a1","a2","a3","a4","a5"};
SinglyList
System.out.println("依次实现单链表插入、删除、追加、查找、取元素、判空、求长度等");
System.out.println("该表是否为空:"+sing.isEmpty());
System.out.println("打印该表的元素 "+sing.toString());
System.out.println("该表的长度为"+sing.getLength());
System.out.println();
System.out.println();
System.out.println("对该表进行插入操作");
System.out.println("将元素x插入第0个位置"+sing.insert("x", 0));
System.out.println("将元素y插入第4个位置"+sing.insert("y", 4));
System.out.println("将元素z插入最后一个位置"+sing.insert("z",sing.getLength()));
System.out.println("打印该表的元素 "+sing.toString());
System.out.println("该表的长度为"+sing.getLength());
System.out.println();
System.out.println();
System.out.println("返回该单链表中第3个元素 "+sing.get(2));
System.out.println("删除第3个元素"+sing.remove(2));
System.out.println("返回该单链表中第3个元素 "+sing.get(2));
System.out.println("打印该表的所有元素 "+sing.toString());
System.out.println("查找第一次出现a4的元素的位置"+sing.search("a4"));
}
}
import java.util.ArrayList;
/*
* 约瑟夫环的思想
* 1.先确定链表的长度、数数的起点位置(由数组控制)、步长(独特算法)
* 2.步长可以实现将所有的数变成“连接的”,由队列排列变成了一个圆排列,每隔一定步长删掉一个人
*/
public class Josephus_2_1 {
public Josephus_2_1(int number,int start,int distance){
System.out.println("Josephus("+number+","+start+","+distance+")");
//创建顺序表实例,类型是string,可以通过number确定表长
ArrayList
for(int i=0;i<number;i++)
list.add((char)('A'+i)+"");
System.out.println(list.toString());
int i=start;
while(list.size()>1){
i=(i+distance-1)%list.size();
System.out.print("删除"+list.remove(i).toString()+" ");
System.out.println(list.toString());
}
System.out.println("被赦免者是"+list.get(0).toString());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Josephus_2_1(8,2,3);
}
}
四、实验收获和建议: