您的位置:首页 > 编程语言 > Java开发

用Java实现线性表中的顺序存储的学习和源码(合并两个线性表)

2016-04-13 16:46 555 查看
线性表的优点:

无须为表示表中元素之间的逻辑关系而额外的增加存储空间

可以快速的存取表中任一位置的元素

线性表的缺点:

插入和删除操作需要移动大量的元素

当线性表的长度变化太大时,难以确定存储空间的容量

造成存储空间的碎片
public class ShunXu {

final int MAXSIZE = 20;

final int OK = 1;

final int ERORR = 0;

final int TRUE = 1;

final int FALSE = 0;

public static void main(String[] args)
{

// TODO Auto-generated method stub

ShunXu shunxu = new ShunXu();

SqList La = new SqList();

SqList Lb = new SqList();

int e,j,k;

int i=shunxu.InitList(La);

System.out.println("初始化La后 ,La.length="+La.length);

for(j=1;j<=5;j++)

i=shunxu.ListInsert(La,1,j);

System.out.printf("在La的表头依次插入1~5后:La.data=");

shunxu.ListShow(La);

System.out.printf("La.length=%d
\n",La.length);

i=shunxu.ListEmpty(La);

System.out.printf("La是否空:i=%d(1:是
0:否)\n",i);

i=shunxu.ClearList(La);

System.out.printf("清空La后:La.length=%d\n",La.length);

i=shunxu.ListEmpty(La);

System.out.printf("La是否空:i=%d(1:是
0:否)\n",i);

for(j=1;j<=10;j++)

shunxu.ListInsert(La,j,j);

System.out.printf("在La的表尾依次插入1~10后:La.data=");

shunxu.ListShow(La);

System.out.printf("La.length=%d
\n",La.length);

shunxu.ListInsert(La,1,0);

System.out.printf("在La的表头插入0后:La.data=");

shunxu.ListShow(La);

System.out.printf("La.length=%d
\n",La.length);

e=shunxu.GetElem(La,5);

System.out.printf("第5个元素的值为:%d\n",e);

for(j=3;j<=4;j++)

{

k=shunxu.LocalElem(La,j);

if(k!=0)

System.out.printf("第%d个元素的值为%d\n",k,j);

else

System.out.printf("没有值为%d的元素\n",j);

}

k=shunxu.ListLength(La); /* k为表长
*/

for(j=k+1;j>=k;j--)

{

i=shunxu.ListDelet(La,j);
/* 删除第j个数据 */

if(i==shunxu.ERORR)

System.out.printf("删除第%d个数据失败\n",j);

else

System.out.printf("删除第%d个的元素值为:%d\n",j,i);

}

System.out.printf("依次输出La的元素:");

shunxu.ListShow(La);

j=5;

shunxu.ListDelet(La,j); /* 删除第5个数据
*/

System.out.printf("删除第%d个的元素值为:%d\n",j,e);

System.out.printf("依次输出La的元素:");

shunxu.ListShow(La);

//构造一个有10个数的Lb

i=shunxu.InitList(Lb);

for(j=6;j<=15;j++)

i=shunxu.ListInsert(Lb,1,j);

System.out.printf("依次输出Lb的元素:");

shunxu.ListShow(Lb);

shunxu.UnionL(La,Lb);

System.out.printf("依次输出合并了Lb的La的元素:");

shunxu.ListShow(La);

}

//初始化顺序线性表

public int InitList(SqList L)

{

L.data = new int[MAXSIZE];

L.length=0;

return OK;

}

//初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE

public int ListEmpty(SqList L)

{

if(L.length==0)

return TRUE;

else

return FALSE;

}

//初始条件:顺序线性表L已存在。操作结果:将L重置为空表

public int ClearList(SqList L)

{

L.length=0;

return OK;

}

//初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数

public int ListLength(SqList L)

{

return L.length;

}

// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
*/

//操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始
*/

public int GetElem(SqList L,int i)

{

if(L.length==0||i<1||i>L.length)

return ERORR;

else

return (Integer) L.data[i-1];

}

/* 初始条件:顺序线性表L已存在 */

/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */

/* 若这样的数据元素不存在,则返回值为0 */

public int LocalElem(SqList L,int
e)

{

int i;

if (L.length==0)

return 0;

for(i=0;i<L.length;i++)

{

if(L.data[i]==e)

{

break;

}

}

if(i>=L.length)

return 0;

return i+1;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L),
*/

/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
*/

public int ListInsert(SqList L,int
i,int e)

{

int k;

if (L.length==MAXSIZE) /* 顺序线性表已经满
*/

return ERORR;

if (i<1 || i>L.length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时
*/

return ERORR;

if (i<=L.length) /* 若插入数据位置不在表尾
*/

{

for(k=L.length-1;k>=i-1;k--) /* 将要插入位置之后的数据元素向后移动一位
*/

L.data[k+1]=L.data[k];

}

L.data[i-1]=e; /* 将新元素插入
*/

L.length++;

return OK;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
*/

/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
*/

public int ListDelet(SqList L,int
i)

{

int k;

if (L.length==0)
/* 线性表为空 */

return ERORR;

if (i<1 || i>L.length)
/* 删除位置不正确 */

return ERORR;

int temp = L.data[i-1];

if (i<L.length) //如果删除不是最后位置
*/

{

for(k=i;k<L.length;k++) //
将删除位置后继元素前移 */

L.data[k-1]=L.data[k];

}

L.length--;

return temp;

}

/* 初始条件:顺序线性表L已存在 */

/* 操作结果:依次对L的每个数据元素输出 */

public int ListShow(SqList L)

{

for(int i=0;i<L.length;i++)

{

visit(L.data[i]);

}

System.out.println();

return OK;

}

public int visit(int c)

{

System.out.print(c+" ");

return OK;

}

public void UnionL(SqList La,SqList
Lb)

{

int La_len,Lb_len,i;

int e;

La_len=ListLength(La);

Lb_len=ListLength(Lb);

for (i=1;i<=Lb_len;i++)

{

e=GetElem(Lb,i);

if (LocalElem(La,e)==0)

ListInsert(La,++La_len,e);

}

}

}

class SqList

{

int data[] ;

int length;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: