线性表的元素查找、插入与删除

ElemType在数据结构中通常指element type(元素的类型),本文使用typedef自定义ElemType和Status为int类型。

typedef int ElemType;
typedef int Status;

查找:

int LocateElem(SqList L, ElemType e,
	Status(*compare)(ElemType , ElemType )) //查找顺序表中的特定元素
{		
    int i = 1;
	int *p = L.elem;    //p的初值为第一个元素的存储位置
	while (i <= L.length && !(*compare)(*p++, e)) ++i;
	if (i <= L.length) return i;    //若存在,返回元素的位置
	else return 0;    //若不存在,返回假
}
int IsEqual(ElemType a, ElemType b) //两个变量的比较,相同返回真
{
	if (a == b) return 1;
	else return 0;
}

插入:

Status ListInsert(SqList& L, int i, ElemType e) //顺序表的元素插入
{	
	int j;
	for (j = L.length - 1; j >= i - 1; --j)
		L.elem[j + 1] = L.elem[j];    //插入位置及之后的元素向右移
	L.elem[i - 1] = e;                //在指定位置插入新的元素
	++L.length;
	return 0;
}

考虑移动元素的平均情况,线性表长度为n。则:

(1)在第i个元素之前插入的概率为Pi,插入一个元素所需要移动元素次数的期望值为

(2)在任何一个位置上插入的概率相等, 插入一个元素所需要移动元素次数的期望值为

                  Pi=1/(n+1),Eis=n/2

删除:

Status ListDelete(SqList& L,int i,ElemType &e)    //顺序表的元素删除 
{		
	if((i<1)||(i>L.length )) //所选择的删除位置不合法
		return 0;
	int *p=&(L.elem [i-1]);  //删除元素对应地址
	e=*p;                    //删除位置上的元素,可以添加输出语句,增加可读性
	int *q=L.elem+L.length-1;//顺序表尾的地址
	for(++p;p<=q;++p) *(p-1)=*p;
	--L.length;              //表长减一
	return 1;
}

考虑移动元素的平均情况,线性表长度为n。则:

(1)删除第i个元素的概率为Qi,删除一个元素所需移动元素次数的期望值为:

(2)删除任何一个位置上的元素概率相等,移动元素的期望值为:

       Qi=1/n,Edl=(n-1)/2 

主函数:

int main(void) {
	int i,j;
	SqList L;
	InistSqList(L);
	CreateSqList(L);
	i=LocateElem(L, 12, IsEqual);	//查找顺序表中特定元素12 
	cout << i << endl;
	ListInsert(L,2,9);				//在顺序表中第2位插入元素9 
	PrintSqList(L);
	ListDelete(L,2,j);				//在顺序表中删除第2位元素 
	PrintSqList(L);
}

关于SqList,InistSqList,CreateSqList,PrintSqList函数,代码和用法都在《线性表的基本创建和输入输出》一文中

https://blog.csdn.net/qq_56805519/article/details/120061213?spm=1001.2014.3001.5501


版权声明:本文为qq_56805519原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。