双向循环链条实现LinkList

1.Node 节点定义:

package data_table.syn.com.common.util;
/**
 * 简单封装Node节点
 * @author Administrator
 *
 */
public class Node {

private Object value;// 值
private Node next; // 下一个对象的地址值
private Node before; // 上一个对象的地址值
public Node getBefore() {
return before;
}
public void setBefore(Node before) {
this.before = before;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}

public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node() {
super();
// TODO Auto-generated constructor stub
}
public Node(Object value) {
super();
this.value = value;
}



}

2.双向循环实现LinkList:

package data_table.syn.com.common.util;


import java.util.zip.Inflater;


public class MyLinkList2 {

    private Node head=null;
private int size=0;
public int size() {
return size;
}
/**
* 添加值
* @param value
*/
public void add(Object value) {
Node newNode=new Node(value);
if (head==null) {
head=newNode;
}else {
Node temp=head;
// 获取最后一个节点
if (head.getBefore()!=null) {
temp=head.getBefore();

}

//循环结束temp为最后node
temp.setNext(newNode);
newNode.setBefore(temp);// 上一个节点
head.setBefore(newNode); // 记录最后一个节点
}
size++;
}
/**
*获取指定位置的值 
* @param index
* @return
*/
public Object get(int index) {
Node temp=head;
int len=size/2; // 当len=index前后都一样
if (index<len) {   // 从前面遍历
for(int i=0;i<index;i++) {
temp=temp.getNext();
}
}else {
// 从后面遍历

for(int i=size-1;i>=index;i--) {
temp=temp.getBefore();
}
}


return temp.getValue();

}
/**
* 给指定位置设置值
* @param index
* @param value
*/
public void set(int index,Object value) {
Node temp=head;

int len=size/2; // 当len=index前后都一样
if (index<len) {   // 从前面遍历
for(int i=0;i<index;i++) {
temp=temp.getNext();
}
}else {
// 从后面遍历

for(int i=size-1;i>=index;i--) {
temp=temp.getBefore();
}
}
/*for(int i=0;i<index;i++) {
temp=temp.getNext();

}*/
temp.setValue(value);


/**
* 清空数据
*/
public void clear() {
size=0;
head=null;

}
/**
* 删除指定位置值
* @param index
*/
public void removeAt(int index) {
if (index==0) {
head.getNext().setBefore(head.getBefore());
head=head.getNext();
}
Node temp=head;
int len=size/2; // 当len=index前后都一样
if (index<len) {   // 从前面遍历
for(int i=0;i<index-1;i++) {
temp=temp.getNext();
}
temp.setNext(temp.getNext().getNext());
temp.getNext().getNext().setBefore(temp);

}else {
// 从后面遍历

for(int i=size-1;i>=index+1;i--) {
temp=temp.getBefore();
}
temp.setBefore(temp.getBefore().getBefore());
temp.getBefore().getBefore().setNext(temp);
}

size--;
}
public void toStrings() {
for(int i=0;i<size;i++) {
System.out.print(get(i));
}
}


}

3.单链条实现与双向链条实现LinkList性能比较:

a)添加/删除:单链条添加元素,需要遍历整个链条。双向链条直接获取最后一个元素添加,性能高的多。

b)get/set 获取元素:但链条获取元素,遍历整个列表;双向链表可以从两端循环遍历,性能高于单链条。

综合比较双向循环链表更高效。




(1)建立线性表的链式存储结构,实现线性链表的建表、查找、插入和删除操作。 〖提示〗首先定义线性链表如下: typedef struct node datatype data; struct node *next; }LNode, *LinkList; 此题可仿照实验指导一节中22· 1顺序表的应用来做。将每个操作定义为一个函数,主程序对各个函数进行调用。函数的实现可参看配套教材。 (2) 处理约瑟夫环问题也可用数组完成,请编写使用数组实现约瑟夫环问题的算法和程序。 〖提示〗首先定义线性表的顺序存储结构,约瑟夫环的算法思想参看实验指导一节的 223小节。 (3) 假设有两个按元素值递增有序排列的线性表A和B'均以单链表作存储结构,请编写算法将表A和表B归并成一个按元素非递减有序(允许值相同)排列的线性表c,并要求利用原表(即表A和表B)的结点空间存放表co 〖提示〗除了指向线性表c头结点的指针外,还需设置三个指针Pa、Pb、Pc;首先 pa、Pb分别指向线性表A和B的表头,pc指向A和B的表头值较小的结点,线性表c头结点的指针等于pc;然后,比较pa与Pb的值的大小,让Pc的后继指向较小值的指针,接着pc向后移动,较小值的指针也向后移动,以此类推,直到pa、Pb中某一个为空,这时,让pc的后继指向pa、Pb中非空的指针,这样就完成了c表的建立。 (4) 给定一个整数数组b[0..N-1], b中连续相等元素构成的子序列称为平台,试设计算法,求出b中最长平台的长度。 〖提示〗设置一个平台长度变量Length和一个计数器sumo初始化Length为1' sum 为1,再设置两个下标指针i、jo首先,i指向第一个数组元素,j指向其次的第二个元素,比较i、j指向元素值的大小,若相等,则sum++' i++' j++'再次比较i、j指向元素值的大小,若不相等,则比较Length与sum的大小,如果sum值大于Length'则把sum的值赋给Length, sum的值重置为1,同时i、j也向前各移动一位;重复上面的过程,直到i 指向最后一个元素为止,此时的Length就是最长平台的长度。 (5) 大整数的加法运算。c语言中整数类型表示数的范围为一231、231一1 '无符号整型数表示数的范围为0、232一1,即0、4 294967 295,可以看出,不能存储超出10位数的整数。有些问题需要处理的整数远不止10位。这种大整数用c语言的整数类型无法直接表示。请编写算法完成两个大整数的加法操作。 〖提示〗处理大整数的一般方法是用数组存储大整数,数组元素代表大整数的一位,通过数组元素的运算模拟大整数的运算。注意需要将输入到字符数组的字符转换为数字。 程序中可以定义两个顺序表LA、LB来存储两个大整数,用顺序表LC存储求和的结果。 (6) 设计一个学生成绩数据库管理系统,学生成绩管理是学校教务部门日常工作的重要组成部分,其处理信息量很大。本题目是对学生成绩管理的简单模拟,用菜单选择方式完成下列功能:输入学生数据;输出学生数据;学生数据查询;添加学生数据;修改学生数据;删除学生数据。用户可以自行定义和创建数据库,并能保存数据库信息到指定文件以及打开并使用己存在的数据库文件。要求能提示和等待用户指定命令,进行相关操作。 〖提示〗本题目的数据是一组学生的成绩信息,每条学生的成绩信息可由学号、姓名和成绩组成,这组学生的成绩信息具有相同特性,属于同一数据对象,相邻数据元素之间存在序偶关系。由此可以看出,这些数据具有线性表中数据元素的性质,所以该系统的数据采用线性表来存储。本题目的实质是完成对学生成绩信息的建立、查找、插入、修改、删除等功能,可以先构造一个单链表,其结点信息包括字段名、字段类型以及指向下一结点的指针。通过对单链表的创建,达到创建库结构的目标。要能实现打开和关闭数据库操作,将每个功能写成一个函数来完成对数据的相应操作,最后完成主函数以验证各个函数功能并得出运行结果。
最新发布
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值