Bootstrap

数据结构之线性表的实现

数据结构之线性表的实现

数据集

D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}

操作集

1、线性表的构建

Status InitList(SqList &L)
{
	//初始化线性表
	//为L分配Elemtype类型的LIST_INIT_SIZE空间的大小
	L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	//分配失败
	if(!L.elem)
	{
		exit(OVERFLOW);
	}
	//分配成功后的状况
	L.length=0;
	L.listsize=LIST_INIT_SIZE;
	return OK;
}

2、线性表的删除

Status DestroyList(SqList &L)
{
	//释放线性表的元素
	free(L.elem);
	L.length=0;
	L.listsize=0;
	L.elem=NULL;
	return OK;
}

3、线性表的清空

Status ClearList(SqList &L)
{
	L.length=0;
	return OK;
}

4、判断线性表是否为空表

Status IsEmptyList(SqList L)
{
	if(L.length==0)
		return OK;
	else
		return ERROR;
}

5、返回已知元素的前驱

Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{
	int i=2;
	ElemType *p=L.elem+1;

	//循环将p的值对应到i的位置
	while(i<L.length&&*p!=cur_e)
	{
		i++;
		p++;
	}
	//如果索引超出界限
	if(i>L.length)
		return ERROR;
	else
	{
		//前驱为*p--
		pre_e=*(--p);
		return OK;
	}
}

6、返回已知元素的后继

Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{
	//原理同返回前驱
	int i=1;
	ElemType *p=L.elem;
	while(i<L.length&&*p!=cur_e)
	{
		p++;
		i++;
	}
	if(i>L.length)
		return ERROR;
	else
	{
		next_e=*(++p);
		return OK;
	}
}

7、线性表元素的插入

Status ListInsert(SqList &L,int i,ElemType e)
{
	//在i处插入元素e
	ElemType *newbase,*q,*p;

	if(i<1||i>L.length+1)
		return ERROR;
	if(L.length>=L.listsize)
	{
		//长度大于内存,重新分配空间
		newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)
			exit(OVERFLOW);
		L.elem=newbase;
		L.listsize+=LISTINCREMENT;
	}
	//插入位置为q
	q=L.elem+i-1;
	for(p=L.elem+L.length-1;p>=q;--p)
		*(p+1)=*p;
	*q=e;
	++L.length;
	return OK;
}

8、线性表元素的删除

Status ListDelete(SqList &L,int i,ElemType &e)
{
	//删除第i个位置的元素,并用e返回
	ElemType *q,*p;
	if(i<1||i>L.length)
		return ERROR;
	p=L.elem+i-1;
	e=*p;
	q=L.elem+L.length;
	for(++p;p<q;++p)
		*(p-1)=*p;
	--L.length;
	return OK;
}

9、获取线性表当前长度

int GetLength(SqList L)
{
	return L.length;
}

10、返回指定位置的元素

Status GetElem(SqList L,int i,ElemType &e)
{
	//判断是否超界
	if(i<1||i>L.length)
		exit(ERROR);
	e=*(L.elem+i-1);
	return OK;
}

主函数的实现

在这里可以运用循环来对线性表进行循环操作,本例子主要对线性表的插入进行了可以判断的循环,读者可根据需要自行修改

int main()
{
	SqList L;
	Status i;
	//flag为插入元素是否循环,m为线性表的位置
	int flag=1,j,m;
	ElemType e=1,n;
	i=InitList(L);
	printf("初始化线性表,分配状态为%d,当前元素长度为%d,分配长度为%d\n",i,L.length,L.listsize);
	system("pause");


	//线性表的第一个元素位置为1
	//线性表插入操作
	while(flag)
	{
		//在i处插入元素
		printf("输入插入的元素及位置,用空格隔开(比如”1 2“为在线性表第一处插入元素2)\n");
		
		scanf("%d %d",&m,&e);
		i=ListInsert(L,m,e);
		
		printf("当前线性表的元素为");
		for(j=0;j<L.length;++j)
			printf(" %d ",*(L.elem+j));

		printf("插入状态为%d,线性表为的当前长度为%d\n",i,GetLength(L));
		
		
		printf("\n继续输入请按1,停止输入请按0\n");
		scanf("%d",&flag);
		//p++;
	}

	//线性表的删除
	printf("请输入线性表删除的位置\n");
	scanf("%d",&m);
	i=ListDelete(L,m,e);
	printf("删除操作执行结果为%d,删除元素为%d\n当前线性表元素为",i,e);
	
	for(j=0;j<L.length;++j)
		printf(" %d ",*(L.elem+j));
		printf("\n");
	system("pause");

	printf("请输入要查询已知元素\n");
	scanf("%d",&n);
	i=PriorElem(L,n,e);
	printf("查询状态为%d,该元素的先驱为 %d\n",i,e);
	system("pause");

	printf("请输入要查询已知元素\n");
	scanf("%d",&n);
	i=NextElem(L,n,e);
	printf("查询状态为%d,该元素的后继为 %d\n",i,e);
	system("pause");


	return 0;
}
  • 成果图
    在这里插入图片描述
    附源代码一份:(https://download.csdn.net/download/qq_37002607/11439307)
    (https://github.com/idong1e/DataStruct)
;