在顺序表L中删除值最小的元素

在顺序表L中删除值最小的元素
【问题描述】在顺序表L中找到值最小的元素,并将其删除,显示删除前后的顺序表

#include<stdlib.h>

#include<iostream>

using namespace std;

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

typedef int ElemType;

#define  MAXSIZE 100     //最大长度

typedef  struct {

  ElemType  *elem;     //指向数据元素的基地址

  int  length;   //线性表的当前长度度

}SqList;

Status InitList_Sq(SqList &L){    //构造一个空的顺序表L

    L.elem=new ElemType[MAXSIZE];  //为顺序表分配空间

    if(!L.elem) exit(OVERFLOW);   //存储分配失败

    L.length=0;             //空表长度为0

    return OK;

}

int main()

{  //先创建具有n个元素的顺序表

return 0;

}

【输入形式】元素个数

【输出形式】原顺序表和删除后的顺序表。元素之间隔一个空格

【样例输入】

5

6 4 1 9 8

【样例输出】

6 4 1 9 8

6 4 9 8

#include<stdlib.h>

#include<iostream>

using namespace std;

 

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

typedef int ElemType;

#define  MAXSIZE 100     //最大长度

  

typedef  struct {

  ElemType  *elem;     //指向数据元素的基地址

  int  length;   //线性表的当前长度度

 }SqList;

  

Status InitList_Sq(SqList &L){    //构造一个空的顺序表L

    L.elem=new ElemType[MAXSIZE];  //为顺序表分配空间

    if(!L.elem) exit(OVERFLOW);   //存储分配失败

    L.length=0;             //空表长度为0

    return OK;
}

int main()

{ //先创建具有n个元素的顺序表
SqList LA;
InitList_Sq(LA);
LA.length=10;
int i;
cin>>LA.length;
for(i=0;i<LA.length;i++)
 cin>>LA.elem[i];
for(i=0;i<LA.length;i++)
 {cout<<LA.elem[i]<<" ";
 }
 cout.put('\n');
 //found the min number
int min=LA.elem[0];
int minindex=0;
for(i=0;i<LA.length;i++)
 if(min>=LA.elem[i])
    {min=LA.elem[i];
    minindex=i;
    }
//delete the min number
int j;
for(j=minindex;j<LA.length;j++)
LA.elem[j]=LA.elem[j+1];
--LA.length; 
for(i=0;i<LA.length;i++)
 cout<<LA.elem[i]<<" ";
return 0;}

为了在一个有序列表(顺序表L)删除最小元素并返回其,我们可以采用如下的算法: 1. **初始化**:首先,我们需要确定当前列表的第一个元素即是最小,因为已知列表有唯一的最小。 2. **删除操作**: a. 创建一个变量`min_val`,存储当前找到的最小。 b. 初始化一个指针`prev`,指向第一个元素前的一个空位置(如果有的话),以便于后续的移动。 c. 使用另一个指针`curr`从头开始遍历列表。 - 当遇到比`min_val`大的元素时,说明找到了新的最小,将它赋给`min_val`,同时更新`prev`指针指向当前位置。 d. 遍历完成后,`min_val`就是最小,此时`prev`指向的就是它的前一个位置。 3. **删除**: - 如果`prev`不是列表开头(即列表长度大于1),将`prev`指向的元素替换到`curr`处,然后`prev`和`curr`都向前移动一位,直到`curr`到达原`min_val`的位置。 - 如果`prev`是列表开头,直接将`curr`移至下一个元素即可,因为列表只有一个元素最小)。 4. **返回**:由于已经删除最小,所以可以返回`min_val`作为结果。 5. **处理边界条件**:在实际操作前,需要检查列表是否为空。如果为空,则无需删除,直接返回一个默认或者抛出异常。 以下是伪代码描述: ```python function delete_min(L): if L.isEmpty(): return None # 或者抛出异常 min_val = L[0] prev = null curr = 0 while curr < len(L) and L[curr] != min_val: prev = curr min_val = L[curr] curr += 1 if prev == null: # 如果最小是列表的第一个元素 L.remove(min_val) else: L[prev] = L[curr] # 移动最小后的元素到前面 del L[curr] # 删除当前最小 return min_val ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值