您的位置:首页 > 其它

线性表顺序存储学习

2014-03-23 11:55 405 查看
线性表的顺序存储结构:

定义:用一段地址连续的存储单元一次存储线性表的数据元素。

/*线性表存储的相应代码:
1.结构代码
2.初始化线性表
3.获得元素操作
4.插入操作
5.删除操作
6.判断线性表是否为空
7.线性表清空
8.线性表中元素e首次出现位置
9.遍历线性表:依次对L的每个数据元素输出
10.将所有的在线性表Lb中,但不在La的数据元素插入La
*/
#include<stdio.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;          /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;        /* ElemType类型根据实际情况而定,这里假设为int */

/* 1.线性表的顺序存储的结构代码 */
typedef struct
{
ElemType data[MAXSIZE]; /* 数组存储数据元素,最大值为MAXSIZE */
int length;             /* 线性表当前长度 */
}SqList;

/* 2.初始化线性表 */
Status InitList(SqList *L)
{
L->length = 0;
return OK;
}

/* 3.获得元素操作 */
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length == 0 || i<1 || i> L.length)
return ERROR;
*e = L.data[i-1];
return OK;
}

/* 4.插入操作 */
/* 如果线性表已满,无法插入,抛出异常;如果插入位置不合理,抛出异常;
从最后一个位置向前便利到第i个位置,分别向后移动一个位置;
将要插入的元素填入位置i处;
表长加1;
*/
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if(L->length == MAXSIZE)
return ERROR;
if(i<1 || i> L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
return ERROR;
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;
}

/* 5.删除操作 */
/* 如果线性表为空,抛出异常;如果删除位置不合理,抛出异常;
从删除元素位置开始遍历到最后一个元素位置,分别向前移动一个位置;
表长减1;
*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
int k;
if(L->length == 0)
return ERROR;
if(i<1 || i> L->length)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
return ERROR;
*e = L->data[i-1];
if( i < L->length)  /* 若删除数据位置不在表尾,需进行相应的后移操作 ;在表尾则可以直接删除*/
{
for(k = i; k <= L->length-1;k++)
L->data[k-1] = L->data[k];
}
L->length--;
return OK;
}

/* 6.判断线性表是否为空 ,空返回1,非空返回0*/
Status ListEmpty (SqList L)
{
if ( L.length == 0 )
return TRUE;
else
return FALSE;
}
/* 7.线性表清空*/
Status ClearList(SqList *L)
{
L->length = 0;
return OK;
}

/* 8.线性表中元素e首次出现位置*/
int LocateElem(SqList L,ElemType 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;

}

/* 9.遍历线性表:依次对L的每个数据元素输出 */
Status ListTraverse(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
return OK;
}

/* 10.将所有的在线性表Lb中,但不在La的数据元素插入La */
void unionL(SqList *La,SqList Lb)
{
int La_len,Lb_len,i;
ElemType e;           /*声明La与Lb相同的数据元素 */
La_len = La->length;
Lb_len = Lb.length;
for (i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);
if (!LocateElem(*La,e))
ListInsert(La,++La_len,e);
}
}

int main()
{

SqList L,Lb;
ElemType e;
Status i;
int j,k;
i=InitList(&L);
printf("初始化L后:L.length=%d\n",L.length);
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n\n",i);

for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf("在L的表头依次插入1~5后:L.data=");
ListTraverse(L);
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n\n",i);

ListInsert(&L,1,0);
printf("在L的表头插入0后:L.data=");
ListTraverse(L);
printf("L.length=%d \n\n",L.length);

GetElem(L,5,&e);
printf("第5个元素的值为:%d\n\n",e);

for(j=3;j<=6;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d个元素的值为%d\n",k,j);
else
printf("没有值为%d的元素\n",j);
}
printf("\n");

k=L.length; /* k为表长 */
for(j=k+1;j>=(k-1);j--)
{
i=ListDelete(&L,j,&e); /* 删除第j个数据 */
if(i==ERROR)
printf("删除第%d个数据失败\n",j);
else
printf("删除第%d个的元素值为:%d\n",j,e);
}
printf("依次输出L的元素:");
ListTraverse(L);
printf("\n");

//构造一个有10个数的Lb
//SqList Lb;
i=InitList(&Lb);
for(j=1;j<=10;j++)
i=ListInsert(&Lb,1,j);
unionL(&L,Lb);
printf("依次输出合并后L的元素:");
ListTraverse(L);
printf("\n");

i=ClearList(&L);
printf("清空L后:L.length=%d\n",L.length);
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n\n",i);
}




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