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

线性表的优点:

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

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

线性表的缺点:

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

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

造成存储空间的碎片

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值