线性表顺序存储学习



线性表的顺序存储结构:

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


/*线性表存储的相应代码:
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);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值