数据结构-第二章线性表-算法设计题10

算法设计题

问题描述

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

算法分析

        此题的关键点在于:在时间复杂度为O(n)、空间复杂度为O(1)条件的限定下,不能另外开辟空间,且只能通过遍历一趟顺序表来完成。

算法步骤

        1.用k值记录不等于item的元素个数,k初始为0。 
        2.从前向后扫描顺序表,查找值不为item的元素。
        3.如果找到,利用原表的空间记录值不为item的元素。 
        4.遍历结束后,顺序表中前k个元素即为值不为item的元素。 

算法描述

        主要代码

void DeleteItem(SqList &L,int item)
{
	//删除线性表L中所有值为item的数据元素
	int k=0;	//k值记录不等于item的元素个数
	for(int i=0;i<L.length;i++)	//从前向后扫描顺序表 
	{
	
		if(L.elem[i] != item)	//查找值不为item的元素 
		{
			L.elem[k]=L.elem[i];//利用原表的空间记录值不为item的元素 
			k++; 			//不等于item的元素增1 
		} 
	}
	L.length=k;			//顺序表L的长度等于k 
 } 

        完整代码

//******************************数据结构-第二章线性表-算法设计题10******************************// 
#include<stdio.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
//------顺序表的存储结构------//
#define MAXSIZE 100     //顺序表可能达到的最大长度
typedef struct
{
	ElemType *elem;    //或ElemType elem[MAXSIZE]  存储空间的基地址  
	int length;	 //当前长度 
}SqList;         //顺序表的结构类型为SqList 


//------顺序表的初始化------//
 //-----【算法步骤】 -----// 
  //1.为顺序表 L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
  //2.将表的当前长度设为0。
bool InitList(SqList &L)
{
	//构造一个空的顺序表L
	L.elem=new int[MAXSIZE];     //为顺序表分配一个大小为MAXSIZE的数组空间 
	if(!L.elem)	return false;   //存储分配失败退出 
	L.length=0;                 //空表长度为0 
	return true; 
}

//------顺序表初始化前n个数据------//
bool CreateList(SqList &L,int n) 
{
	if(n<0||n>MAXSIZE) return false; //n值不合法
	for(int i=0; i<n; i++){
		scanf("%d",&L.elem[i]);
		L.length++;
	} 
	return true;
}

//------删除线性表中所有值为item的数据元素------//
  //-----算法步骤-----//
  //1.用k值记录不等于item的元素个数,k初始为0。 
  //2.从前向后扫描顺序表,查找值不为item的元素。
  //3.如果找到,利用原表的空间记录值不为item的元素。 
  //4.遍历结束后,顺序表中前k个元素即为值不为item的元素。 
void DeleteItem(SqList &L,int item)
{
	//删除线性表L中所有值为item的数据元素
	int k=0;	//k值记录不等于item的元素个数
	for(int i=0;i<L.length;i++)	//从前向后扫描顺序表 
	{
	
		if(L.elem[i] != item)	//查找值不为item的元素 
		{
			L.elem[k]=L.elem[i];//利用原表的空间记录值不为item的元素 
			k++; 			//不等于item的元素增1 
		} 
	}
	L.length=k;			//顺序表L的长度等于k 
 } 
//------输出打印顺序表  按位置从小到大输出顺序表所有元素------//
void PrintList(SqList L)
{
	printf("当前顺序表中所有元素为:");
	for(int i=0; i<L.length; i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
 } 

//------创建顺序表函数------//
void Create(SqList &L) 
{
	int n;
	bool flag;
	L.length=0;
	printf("请输入要创建的顺序表的长度:");
	scanf("%d",&n);
	printf("请输入依次输入%d个数(空格隔开):",n);
	flag=CreateList(L,n);
	if(flag){
		printf("顺序表L创建成功!\n");
		PrintList(L);
	}
	else
		printf("输入长度不合法!\n"); 
}

//------删除线性表L中所有值为item的数据元素------//
void Delete(SqList &L,int item)
{
	
	printf("请输入要删除的item的值为:");
	scanf("%d",&item);
	DeleteItem(L,item);
	printf("删除元素%d成功!\n",item);
	PrintList(L);
}

//------创建主函数------//
int main()
{
	int item;
	SqList L;
	InitList(L);
	Create(L);
	Delete(L,item);
	
}

        运行结果

请输入要创建的顺序表的长度:5
请输入依次输入5个数(空格隔开):1 2 2 4 5
顺序表L创建成功!
当前顺序表中所有元素为:1 2 2 4 5
请输入要删除的item的值为:2
删除元素2成功!
当前顺序表中所有元素为:1 4 5

--------------------------------
Process exited after 11.71 seconds with return value 0
请按任意键继续. . .

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值