• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wchenfeng

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

已知长度为n的线性表A采用顺序存储结构,请写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法可删除线性表中所有值为item的数据元素。

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef int dataType;
typedef struct {
	int data[100];//数据
	int length;//长度
}SeqList;

SeqList *init();
void fill(SeqList *L);
void show(SeqList *L);
void delSeqList(SeqList *L,int i);
void destorylist(SeqList *L);

//主函数
int main(){
	SeqList *L;
	int e;
	L=init();
	fill(L);
	show(L);
	printf("\n你要进行删除的数据的值为:");
	scanf("%d",&e);
	printf("进行删除表中所有值位%d的数据\n",e);
	delSeqList(L,e);
	show(L);
	destorylist(L);
}
//初始化表格
SeqList *init()
{
	SeqList *L;
	//申请空间
	L=(SeqList *)malloc(sizeof(SeqList));
	//长度为0
	L->length=0;
	return L;
}
//内容填充
void fill(SeqList *L)
{
	int i=0;
	printf("以下开始填充内容\n");
	printf("数组的数量:");
	scanf("%d",&L->length);
	while(i<L->length)
	{
			printf("第【%d】位:",i);
			scanf("%d",&L->data[i]);
			i++;
	}
}
	
//展示表格
void show(SeqList *L)
{
	int i;
	//依次展示数组内容
	for(i=0;i<L->length;i++)
	    printf("第[%d]位为%d   ",i,L->data[i]);
}
//销毁表
void destorylist(SeqList *L)
{
	free(L);//释放空间
}

//删除所有值为e的数据
void delSeqList(SeqList *L,int e)
{
  int j = 0,i=0;
    for(; i<L->length;i++)
    {
		//如果不等于就按顺序排下去,等于就不执行
		if(L->data[i] != e)
        {
            L->data[j] = L->data[i];
            j++;
        }
    }
    L->length = j;
}

时间复杂度为O(n):说明只能用依次循环。

O(1)是最低的空间复杂度,也就是耗耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 表示该程序所占用的空间和所用数据量无关。

空间复杂度:一个算法在运行过程中临时占用的存储空间的度量。 

代码思路:

原本是想先寻找目标值,将数组依次向前覆盖,但发现如果有多个跟目标值一样的数,算法会出错。后来进行更改,发现完善之后,算法的时间复杂度会是O(n2)。

然后就想到把不是目标值的数,全部重新排到数组中,去除目标值,时间复杂度便成为了O(n)。

 

 输出

 输入

6
2
3
2
6
2
5

posted on 2022-04-12 20:02  王陈锋  阅读(2341)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3