线性表 顺序存储

       我从今天开始将回到对基础知识的学习。我打算对数据结构的基础知识进行回顾和整理。

       线性表是一种基础数据结构且常用的数据结构。一个线性表是N个数据元素的有限序列。线性表是一个相当灵活的数据结构,它的长度可根据需要增长或缩短,即对线性表的元素不仅可以进行访问,还可以进行插入和删除。在实际应用中,线性表都是以队列字符串数组等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。

      线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据。

假设线性表的每个元素占用;个存储单元,以所占单元的第一个存储地址为数据元素的存储位置。线性表的第I+1个元素和第I个元素的存储位置LOC(I)之间的关系式:

                                                                                                       LOC(I+1)=LOC(I)+L;

第I个数据元素的存储位置:LOC(I)=LOC(1)+(I-1)*L;

数组类型有随机存储的特性。可以用数组来描述顺序存储结构。

下面是对顺序表定义和一些基本方法的实现:

struct LIST
{
	int *element;
	int length;
	int size;
};
void initList(LIST *list)  //初始化
{
	list->element=(int*)malloc(LIST_LENGTH*sizeof(int));
	list->length=0;
	list->size=LIST_LENGTH;
}
void insertElem(LIST *list,int pos,int i)//在第pos个位置插入第i个元素
{

	if(pos<0||pos>list->length) return;
	/*线性表超出预设空间,分配新空间*/
	if(list->length>=list->size)
	{
		int *newspace=(int*)realloc(list->element,(list->size+NEWSPACE)*sizeof(int));
		list->element=newspace;
	}
	/*pos位置之后的元素一次后移*/	
	int *pr=list->element;
	for(int q=list->length;q>pos;q--)
		*(pr+q)=*(pr+q-1);
	/*pos位置放入i元素*/
	*(pr+pos)=i;
	list->length+=1;
	
}
int getElem(LIST *list,int pos)  //获取第pos个位置的元素
{
	if(pos>list->length-1) return -1;
	return *(list->element+pos);
}
void deleteElem(LIST *list,int pos)//删除第pos个位置的元素
{
	if(pos<0||pos>=list->length)
		return;
	int *pr=list->element;
	for(int q=pos;q<list->length-1;q++)
		*(pr+q)=*(pr+q+1);
	list->length-=1;
}
int locateElem(LIST *list,int e)  //查找列表,若有元素e,则返回e的位置。否则返回-1
{
	for(int i=0;i<list->length;i++)
	{
		if(list->element[i]==e)
			return i;
	}
	return -1;
}
void Union(LIST *La,LIST *Lb)  //合并LA和LB,并将Lb中存在,la不存在的元素插入la
{
	for(int i=0;i<Lb->length;i++)
	{
		int pos=La->length;
		int e=*(Lb->element+i);
		if(locateElem(La,e)<0)
			insertElem(La,pos,e);
	}
} 
void MergeList(LIST la,LIST lb,LIST *lc)  //将la和lb以非递减序列合并到lc中。其中la和lb都是非递减序列。
{
	int i=0,j=0;
	int pos=0;
	while(i<la.length&&j<lb.length)
	{
		if(la.element[i]<lb.element[j])
		{
			insertElem(lc,pos,la.element[i]);
			i++;
		}
		else
		{
			insertElem(lc,pos,lb.element[j]);
			j++;
		}
		pos++;
	}
	while(i<=la.length-1)	
			insertElem(lc,pos++,la.element[i++]);
	while(j<=lb.length-1)	
			insertElem(lc,pos++,lb.element[j++]);		


}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值