删除顺序表中所有值为X的元素

题目描述:删除顺序表中所有值为X的元素,要求时间复杂度为O(n),空间复杂度为O(1)。

#include
#include"sqlist.cpp"
/*已知长度为n的线性表A采用顺序存储结构,
编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,
该算法删除线性表中所有值为x的数据元素。
*/
void DeleteNode1(SqList *&L,ElemType x)
{
	int k=0;//k记录元素值不等于x的个数
	for(int i=0;ilength ;i++)
	{
		if(L->data [i]!=x)//若当前元素不为x,则将其插入到L中 
		{
			L->data[k]=L->data[i];
			k++;
		}
	} 
	L->length = k;
}
//算法1类似于建顺序表

void DeleteNode2(SqList *&L,ElemType x)
{
	int k=0;
	for(int i=0;ilength ;i++)
	{
		if(L->data [i]==x)//当前元素为x时k增1 
		{
			k++;
		}
		else
		{
			L->data [i-k]=L->data [i];//当前元素不为x时将其前移k个位置 
		}
	}
	L->length -= k;//顺序表L的长度减K 
}
int main(int argc,char *argv[])
{
	ElemType x;
	ElemType a[]={1,2,2,1,0,2,4,2,3,1};
	SqList *L;
	InitList(L);//初始化线性表
	CreateList(L,a,10);//数组名代表数组元素的首地址 
	printf("L:");
	DisplayList(L);
	printf("请输入要删除元素的值:");
	scanf("%d",&x);
	printf("删除值为%d的元素 \n",x);
//	DeleteNode1(L,x); 
	DeleteNode2(L,x);
	printf("L:");
	DisplayList(L);
	DestroyList(L);
	return 0;
}

顺序表的实现代码

#include
#include
#define MaxSize 100
typedef int ElemType;
//顺序表的类型定义 
typedef struct{
	ElemType data[MaxSize];
	int length;
}SqList;
//建立顺序表 
void CreateList(SqList *& L, ElemType a[], int  n)
{
	L = (SqList *)malloc(sizeof(SqList));
	for (int i = 0; i < n; i++)
		L->data[i] = a[i];
	L->length = n;
}
//初始化线性表 本算法的时间复杂度为O(1) 
void InitList(SqList  * & L)
{
	//初始化线性表,只需要将其长度设置为0即可
	L = (SqList *)malloc(sizeof(SqList));
	L->length = 0;
}
//销毁线性表 本算法的时间复杂度为O(1) 
void DestroyList(SqList *&L)
{
	//释放线性表L的内存空间
	free(L);
}
//判断线性表是否为空 本算法的时间复杂度为O(1) 
bool ListEmpty(SqList *L)
{
	return (L->length == 0);
}
//求线性表的长度 本算法的时间复杂度为O(1) 
int ListLength(SqList *L)
{
	return (L->length);
}
//输出线性表   本算法的时间复杂度为O(L->length) 
void DisplayList(SqList * L)
{
	if (ListEmpty(L))
		return;
	for (int i = 0; i < L->length; i++)
		printf("%2d", L->data[i]);
	printf("\n");
}
//求线性表中某个数据元素的值 本算法的时间复杂度为O(1) 
bool GetElem(SqList * L, int i, ElemType & e)
{
	if (i<1 || i>L->length)
		return false;
	e = L->data[i - 1];
	return true;
}
//按元素值查找 本算法的时间复杂度为O(L->length) 
int LocateElem(SqList * L, ElemType e)
{
	int i = 0;
	while (i < L->length && L->data[i] != e)
		i++;
	if (i >= L->length)
		return 0;
	else
		return i + 1;
}
//插入顺序表的元素 本算法的时间复杂度为O(n) 
bool ListInsert(SqList *& L, int i, ElemType e)
{
	if (i<1 || i>L->length + 1)
		return false;
	i--;//将顺序表的逻辑序号转化为物理序号
	for (int j = L->length; j > i; j--)
		L->data[ j ] = L->data[ j- 1];//将元素后移一个位置
	L->data[i] = e;//插入元素e
	L->length ++;//顺序表的元素增加1
	return true;
}
//删除顺序表的元素  本算法的时间复杂度为O(n) 
bool ListDelete(SqList *& L, int i, ElemType &e)
{
	if (i<1 || i>L->length)
		return false;
	i--;//将顺序表的逻辑序号转化为物理序号
	e = L->data[i];
	for (int j = i; j < L->length;j++)
		L->data[ j ] = L->data[ j + 1];//将元素左移一个位置
	L->length--;//顺序表的元素增加1
	return true;
}

 

你可能感兴趣的:(算法)