题目描述:删除顺序表中所有值为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;
}