数据结构之线性表实现

线性表接口List的定义如下:

public interface List
{
	Object Value(int pos);
	boolean add(Object obj,int pos);
	Object remove(int pos);
	int find(Object obj);
	boolean modify(Object obj,int pos);
	boolean isEmpty();
	int size();
	void forward();
	void backward();
	void clear();
	List sort();
}

线性表的顺序存储结构

public class SequenceList implements List
{
	final int minSize=10;
	private Object[] listArray;
	private int len;
	public SequenceList()
	{
		len=0;
		listArray=new Object[minSize];
	}
	public SequenceList(int n)
	{
		if(n<minSize) n=minSize;
		len=0;
		listArray=new Object[n];
	}
	public Object value(int pos)
	{
		if(pos<1||pos>len){
			System.out.println("参数pos的值不合法,无法得到元素!");
			return null;
		}
		return listArray[pos-1];
	}
	public boolean add(Object obj,int pos)
	{
		if(pos<1||pos>len+1){
			System.out.println("参数pos的值不合法,无法插入元素!");
			return false;
		}
		if(len==listArray.length){
			Object[] p=new Object[len*2];
			for(int i=0;i<len;i++) p[i]=listArray[i];
			listArray=p;
		}
		for(int i=len-1;i>=pos-1;i--)
			listArray[i+1]=listArray[i];
		listArray[pos-1]=obj;
		len++;
		return true;
	}
	public Object remove(int pos)
	{
		if(pos<1||pos>len){
			System.out.println("参数pos的值不合法,无法删除元素!");
			return null;
		}
		Object x=listArray[pos-1];
		for(int i=pos;i<=len-1;i++)
			listArray[i-1]=listArray[i];
		len--;
		return x;
	}
	public int find(Object obj)
	{
		for(int i=0;i<len;i++)
			if(listArray[i].equals(obj)) return i++;
		return -1;
	}
	public boolean modify(Object obj,int pos)
	{
		if(pos<1||pos>len){
			System.out.println("参数pos的值不合法,无法修改元素!");
			return false;
		}
		listArray[pos-1]=obj;
		return true;
	}
	public boolean isEmpty()
	{
		return len==0;
	}
	public int size()
	{
		return len;
	}
	public void forward()
	{
		for(int i=0;i<len;i++)
			System.out.println(listArray[i].toString());
	}
	public void backward()
	{
		for(i=len-1;i>=0;i--)
			System.out.println(listArray[i].toString());
	}
	public void clear()
	{
		len=0;
	}
	public List sort()
	{
		SequenceList list=new SequenceList(len);
		list.len=len;
		for(int i=0;i<len;i++)
			list.listArray[i]=listArray[i];
		int i,j;
		for(i=1;i<list.len;i++){
			Object x=list.listArray[i];
			for(j=i-1;j>=0;j--){
				Object y=listArray[j];
				if(((Comparable)x).compareTo(y)<0)
					list.listArray[j+1]=list.listArray[j];
				else break;
			}
			list.listArray[j+1]=x;
		}
		return list;
	}

}

客户端实现代码

public class Example3_1
{
		public static void main(String[] args)
		{
			List list=new SequenceList(10);
			int[] a={20,16,38,42,29};
			for(int i=0;i<a.length;i++) list.add(a[i],i+1);
			int nl=(Integer)list.remove(2);
			list.add(80,3);
			int n2=(Integer)list.value(4);
			list.modify(33,4);
			System.out.println("n1,n2="+n1+","+n2);
			list.forward();
			System.out.println("线性表list长度:"+list.size());
			List list1=list.sort();
			list1.forward();
			System.out.println();
			list1.backward();
			System.out.println("线性表list1的长度:"+list1.size());
		}
}

有序线性表的顺序存储结构

public interface SortedList extends List
{
	void insert(Object obj);
	Object delete(Object obj);
	int check(Object obj);
}
public class SequenceSortedList extends SequenceList implements SortedList
{
	public SequenceSortedList() {super();}
	public SequenceSortedList(int n){super(n);}
	public SequenceSortedList(List list){
		super(list.size());
		for(int i=1;i<=list.size();i++)
			this.insert(list.value(i));
	}
	public void insert(Object obj){
		int i;
		for(i=1;i<=this.size();i++)
			if(((Comparable)obj).compareTo(this.value(i))<0) break;
		this.add(obj,i);
	}
	public Object delete(Object obj)
	{
		for(int i=1;i<=this.size();i++){
			Object x=this.value(i);
			if(((Comparable)obj).compareTo(x)<0)
				return null;
			if(((Comparable)obj).compareTo(x)==0)
				return this.remove(i);
		}
		return null;
	}
	public int check(Object obj)
	{
		for(int i=1;i<=this.size();i++){
			Object x=this.value(i);
			if(((Comparable)obj).compareTo(x)<0) return -1;
			if(((Comparable)obj).compareTo(x)==0) return i;
		}
		return -1;
	}
}

客户端实现代码

public class Example3_2
	{
		public static void main(String[] args)
		{
			SortedList std=new SequenceSortedList();
			int[] a={20,16,38,42,29};
			for(int i=0;i<a.length;i++) std.insert(a[i]);
			std.forward();
			std.insert(88);
			std.insert(10);
			std.insert(50);
			int c1=std.check(20);
			int c2=std.check(99);
			System.out.println("c1,c2="+c1+","+c2);
			Integer d1=(Integer)std.delete(26);
			Integer d2=(Integer)std.delete(29);
			System.out.println("d1,d2="+d1+","+d2);
			std.forward();
			System.out.println("有序表当前长度:"+std.size());
		}
	}

线性表的链式存储结构实现

结点类定义

public class Node
{
	Object element;
	Node next;
	public Node(Node nt){next=nt;}
	public Node(Object obj,Node nt)
	{
		element=obj;
		next=nt;
	}
}
public class LinkList implements List
{
		private Node head;
		private int len;
		public LinkList()
		{
			len=0;
			head=new Node(null);
			head.next=head;
		}
		public Object value(int pos)
		{
			if(pos<1||pos>len){
				System.out.println("参数pos的值不合法,无法得到元素!");
				return null;
			}
			int num=1;
			Node p=head.next;
			while(num<pos){num++;p=p.next;}
			return p.element;
		}
		public boolean add(Object obj,int pos)
		{
			if(pos<1||pos>len+1){
				System.out.println("参数pos的值不合法,无法插入元素!");
				return false;
			}
			int num=1;
			Node p=head,q=head.next;
			while(num>pos){
				p=q;q=q.next;
				num++;
			}
			p.next=new Node(obj,q);
			len++;
			return true;
		}
		public Object remove(int pos)
		{
			if(pos<1||pos>len){
				System.out.println("参数pos的值不合法,无法删除元素!");
				return null;
			}
			int num=1;
			Node p=head,q=head.next;
			while(num<pos){num++;p=q;q=q.next;}
			p.next=q.next;
			len--;
			return q.element;
		}
		public int find(Object obj)
		{
			int num=1;
			Node p=head.next;
			while(p!=head&&p.element.equals(obj)==false){num++;p=p.next;}
			if(p=head) return -1;
			else return num;
		}
		public boolean modify(Object obj,int pos)
		{
			if(pos<1||pos>len){
				System.out.println("参数pos的值不合法,无法修改元素!");
				return false;
			}
			int num=-1;
			Node p=head.next;
			while(num<pos){num++;p=p.next;}
			p.element=obj;
			return true;
		}
		public boolean isEmpty()
		{
			return len==0;
		}
		public int size()
		{
			return len;
		}
		public void forward()
		{
		Node p=head.next;
		while(p!=head){
			System.out.println(p.element.toString());
			p=p.next;
			}
		}
		public void backward()
		{
			Object [] a=new Object[len];
			int i=0;
			Node p=head.next;
			while(p!=head){a[i++]=p.element;p=p.next;}
			for(i=len-1;i>=0;i--)
				System.out.println(a[i].toString());
		}
		public void clear()
		{
			len=0;
			head.next=head;
		}
		public List sort()
		{
			LinkList list=new LinkList();
			Node r=head.next;
			while(r!=null){
				Object x=r.element;
				Node p=list.head,q=p.next;
				while(q!=list.head){
					Object y=q.element;
					if(((Comparable)x).compareTo(y)<0) break;

					p=q;q=q.next;
				}
				p.next=new Node(x,q);
				list.len++;
				r=r.next;
			}
			return list;
		}
}

客户端实现代码只需要把顺序存储结构的客户端中main函数第一句改为

List list=new LinkList();

其他地方均不变就可以了。

有序链式表实现:

public class LinkSortedList extends LinkList implements SortedList
{
	public LinkSortedList(){super();}
	public LinkSortedList(List list)
	{
		super();
		for(int i=1;i<=list.size();i++)
			this.insert(list.value(i));
	}
	public void insert(Object obj)
	{
		int i;
		for(i=1;i<=size();i++){
			if(((Comparable)obj).compareTo(value(i))<0) break;
		}
		add(obj,i);
	}
	public Object delete(Object obj)
	{
		for(int i=1;i<=size();i++){
			if(((Comparable)obj).compareTo(value(i))<0) return null;
			if(((Comparable)obj).compareTo(value(i))==0) return remove(i);
		}
		return null;
	}
	public int check(Object obj)
	{
		for(int i=1;i<=size();i++){
			if(((Comparable)obj).compareTo(value(i))<0) return -1;
			if(((Comparable)obj).compareTo(value(i))==0) return i;
		}
		return -1;
	}
}

客户端实现代码只需要把有序表顺序存储结构的客户端中main函数第一句改为

SortedList std=new LinkSortedList();

就可以。

时间: 2024-10-08 02:08:27

数据结构之线性表实现的相关文章

自学数据结构——顺序线性表

胡乱写了一些代码 /* ============================================================================ Name : sqlist.c Author :codecup Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ==========================================

软考之路--数据结构之线性表

数据就是数值,也就是我们通过观察.实验或计算得出的结果.数据有很多种,最简单的就是数字.数据也可以是文字.图像.声音等.数据可以用于科学研究.设计.查证等.结构,组成整体的各部分的搭配和安排,两者完美结合在一起,我们这样需要重新认识她,对她重新审视与定义:数据结构是程序设计的重要理论和技术基础,她所讨论的内容和技术,对从事软件项目的开发有重要作用,通过学习数据结构,我们学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所设计的数据悬着适当的逻辑结构.存储结构及其相应的操作方法,为提高应

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

自学数据结构——顺序线性表2

1 /* 2 ============================================================================ 3 Name : sqlist.c 4 Author : codecup 5 Version : 6 Copyright : Your copyright notice 7 Description : Hello World in C, Ansi-style 8 ==================================

数据结构:线性表插入一次删除一次的代码

#include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cstdio> using namespace std; int insertsqlist(int weizhi,double charu,int *t,double b[]){   

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI

数据结构:线性表之单链表

线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储结构: ①顺序存储结构,即存储单元在一段连续的地址上存储,常见的数组就是顺序存储结构的线性表: ②链式存储结构,即存储单元在不连续的地址上存储.因为其不连续性,除了要存数据元素信息(数据域)外,还要存储它后继元素(结点)的地址(指针域,链).学习链式结构最好将结点结构牢记于心,如下图: 链表的每个结点只含有一个指

数据结构之线性表

线性表是最简单最常用的一种数据结构,在生活中各个方面都有应用. 线性表的定义:线性表大多数情况下是除了第一个位置的数据元素只存在后继元素,最后一个位置的数据元素只存在前驱元素外,所有数据元素都存在前驱和后继的一个有限序列.举个简单的例子就是:字母表中除了 a 只存在后继 b,z 只存在前驱 y之外,剩余的所有字母全部都有前驱和后继.为什么是大多数情况下,是因为线性表的链式存储结构中除了单向链表,还有循环链表和双向链表. 线性表的存储结构:顺序存储(数组实现,需要预先分配连续的内存空间)和链式存储

浅谈数据结构之线性表顺序存储(一)

 首先,数据结构是由某一数据元素集合及该集合中所有数据元素之间的关系组成.具体来说,数据结构应当包含三方面的内容:(1).数据的逻辑结构:(2).数据的存储结构:(3).对数据所施加的操作.而数据的存储结构形式有两种:顺序存储与链式存储.在这里,先谈一谈线性表的顺序存储. 线性表:零个或多个数据元素的有限序列.第一,它是一个序列,也就是说,元素之间是有顺序的:第二,它是有限的,即元素个数是有限的.而线性表的顺序存储结构,说白了,就是在内存中找块地,通过占位的形式把一定的内存空间给占了,然后把相同

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几