线性表

线性表的定义:一个线性表是n个数据元素的有限序列。

在复杂的线性表中,一个数据元素可以由若干个数据项组成,这种情况下,通常把数据元素称为记录,含有大量记录的线性表称为文件

在线性表中,数据元素a2有且仅有一个直接前驱元素a1,和一个直接后继元素a3。(a1,a2,a3......ai.....an)

在线性表的顺序存储结构中,逻辑上相邻的数据元素在物理位置上也是相邻的。

下面讨论,在线性表的顺序存储结构中,数据元素的插入和删除:

一般情况下,在第i(1≤i≤n)个元素之前插入一个元素时,需将第n至第i(共n-i+1)个元素向后移动一个位置。

线性表数据元素插入的算法:

Status ListInsert.Sq(SqList &L ,int i ,ElemType e){
	//在顺序线性表L中第i个位置之前插入新的元素e
	//i的合法值为1≤i≤ListLength.Sq(L)+1
	if (1<i || i>L.length+1) return Error;//i值不合法

	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=&(L.elem[i-1]);//q为插入位置
	for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;//插入位置及之后的元素右移

	*q=e;//插入e
	++L.length;//表长增加1
	return OK;
}//ListInsert_Sq

数组指针elem指示线性表的基址;length是线性表的当前长度;listsize是顺序表当前分配的存储空间的大小。

一般情况下,删除第i(1≤i≤n)个元素是,需将第i+1至第n(共n-i)个元素向前移动一个位置。

线性表数据元素删除的算法:

Status ListInsert.Sq(SqList &L ,int i ,ElemType e){
	//在顺序线性表L中删除第i个元素,并用e返回其值
	//i的合法值为1≤i≤ListLength.Sq(L)+1
	if (1<i || i>L.length+1) return Error;//i值不合法
	
	p=&(L.elem[i-1]);//p为被删除元素的位置
	e=*q;//被删除元素的值赋给e
	q=L.elem+L.length-1;//表尾元素的位置

	for(++p;p=<q;++p) *(p-1)=*p;//被删除元素之后的元素左移

	--L.length;//表长减少1
	return OK;
}//ListInsert_Sq

顺序表的合并:

void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
	//已知顺序线性表La和Lb的元素按值非递减排列
	//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
	pa = La.elem;
	pb = Lb.elem;

	Lc.listsize = Lc.length = La.length+Lb.length;

	pc = Lc.elem = (EnemType *)malloc(Lc.listsize * sizeof(EnemType));
	if(!Lc.elem) exit(OVERFLOW);

	pa.last = La.elem + La.length-1;
	pb.last = Lb.elem + Lb.length-1;

	while(pa <= pa.last && pb <= pb.last){//归并
		if (*pa <= *pb) *pc++ == *pa++;

		else *pc++ == *pb++;
	}
	while(pa <= pa.last) *pc++ == *pa++;//插入La剩余的元素
	while(pb <= pb.last) *pc++ == *pb++;//插入Lb剩余的元素
}//MergeList.Sq

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值