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

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

#include<stdio.h>
#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;i<L->length ;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;i<L->length ;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<stdio.h>
#include<malloc.h>
#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;
}

 

  • 18
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值