Day23 算法题-32题:顺序表元素删除 及 33题:顺序表的逆置

103 阅读2分钟

题目描述:

  • 32题:删除顺序表中最小的元素,由最后一个元素补充*

  • 33题:逆转顺序表的元素*

思路:

  • 32题:遍历一遍顺序表采用key记录当前最小元素,用flag记录位置,每次用key和顺序表里元素比较,找到更小的就更新key和flag,最后顺序表长度自减1。因为遍历了只一遍顺序表,时间复杂度为O(n)。*

  • 33题:直接用left和right指向顺序表首尾向中间遍历并交换元素即可,除变量外未申请和顺序表表长相关空间,故空间复杂度为O(1),遍历一半顺序表,时间复杂度为O(n)。*

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//32-删除顺序表中最小的元素,由最后的一个元素补充
//33-逆置顺序表
#define MaxSize 50
typedef int ElemType;//定义顺序表
typedef struct{
    ElemType *data;
    int len;
}SqList;

void InitList(SqList &L,int n){//初始化
    L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);
    L.len = n;
    srand(time(NULL));
    for (int i = 0; i < n; i++)
    {
        L.data[i] = rand()%100;//随机初始化0~99之间数值
    }
}

void Print_List(SqList L)   //打印函数
{
    for (int i = 0;i<L.len;i++)
    {
        printf("%-3d",L.data[i]);
    }
    printf("\n");
}

int DeletMinElem(SqList &L)  //删除最小元素
{
    ElemType key=L.data[0];  //记录当前最小值
    int flag = 0;            //记录最小元素位置
    for (int i = 0;i<L.len;i++)
    {
        if(L.data[i] < key){
            key=L.data[i];
            flag = i;}
    }
    if(flag != L.len-1)    //若最小元素不是末尾元素就将末尾元素补充到最小元素位置
        {L.data[flag] = L.data[L.len-1];}
    L.len = L.len-1;    //删除元素,直接顺序表长度自减
    return flag+1;      //返回被删除位置
}

SqList ReverseList(SqList &L)//逆置顺序表
{
    int left=0,right=L.len-1;
    int mid = (left+right)/2;
    for (int i = 0;i<=mid;i++){
        //用i遍历顺序表,因为逆置具有对称的特点故只需遍历一半即可
        ElemType val = L.data[left+i];
        L.data[left+i] = L.data[right-i];
        L.data[right-i] = val;  //交换相应位置的元素
    }
    return L;
}

int main() {
    SqList L;
    InitList(L,10);//初始化顺序表,随机赋值
    printf("顺序表删除前:\n");
    Print_List(L);      //打印初始表做对照
    printf("-----------------------------\n");
    int a = DeletMinElem(L);
    printf("最小元素位置为:%d\n",a);
    printf("删除最小元素后:\n");
    Print_List(L);      //打印删除最小元素后的函数
    printf("-----------------------------\n");
    ReverseList(L);     //逆置顺序表
    printf("逆置顺序表后:\n");
    Print_List(L);      //打印逆置后的函数
    return 0;
}

输出结果:

结果1:

99999999999999999.png

结果2:

8888888888888888.png