【数据结构与算法篇】动态顺序表及相关OJ算法题

【数据结构与算法篇】动态顺序表及相关OJ算法题

🥕个人主页:开敲🍉

🔥所属专栏:数据结构与算法🍅

目录

【数据结构与算法篇】动态顺序表及相关OJ算法题

1. 动态顺序表的实现

    1.1 SeqList.h 头文件声明

      1.2 SeqList.c 源文件定义

    1.3 Test.c 源文件测试

2. OJ算法题

     1. 27. 移除元素 - 力扣(LeetCode)

      2. 88. 合并两个有序数组 - 力扣(LeetCode)

1. 动态顺序表的实现

    1.1 SeqList.h 头文件声明

//SeqList.h

#pragma once

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


typedef int SQDataType;

typedef struct
{
    SQDataType* arr;
    int size;
    int capacity;
}SL;

SL sl;


//初始化
void SeqListInit(SL* sl);

//打印
void SeqListPrint(SL* sl);


//增  删  查  改

//尾插
void SeqListPushBack(SL* sl);

//头插
void SeqListPushHead(SL* sl);

//随机插入
void SeqListPushRand(SL* sl);

//尾删
void SeqListPopBack(SL* sl);

//头删
void SeqListPopHead(SL* sl);

//随机删除
void SeqListPopRand(SL* sl);


//查找
void SeqListFind(SL* sl);


//更改
void SeqListChange(SL* sl);

      1.2 SeqList.c 源文件定义

#define _CRT_SECURE_NO_WARNINGS 1


#include "SeqList.h"

//初始化
void SeqListInit(SL* sl)
{
    sl->arr = sl->arr = (SQDataType*)malloc(sizeof(SQDataType));
    sl->size = 0;
    sl->capacity = 1;
}

//打印
void SeqListPrint(SL* sl)
{
    int i = 0;
    for (i = 0; i < sl->size; i++)
    {
        printf("%d ", sl->arr[i]);
    }
    printf("\n");
}

//尾插
void SeqListPushBack(SL* sl,int n)
{
    //扩容
    while (sl->size >= sl->capacity)
    {
        SQDataType* ptr = (SQDataType*)realloc(sl->arr, sizeof(SQDataType) * (sl->capacity) * 2);
        if (ptr == NULL)
        {
            perror("realloc");
            return;
        }
        else
        {
            sl->arr = ptr;
        }
        sl->capacity *= 2;
    }
    sl->arr[sl->size] = n;
    sl->size++;
}


//头插
void SeqListPushHead(SL* sl)
{
    int num = sl->size;
    int input = 0;
    printf("请输入要插入的数据: ");
    scanf("%d", &input);
    //扩容
    while (sl->size >= sl->capacity)
    {
        SQDataType* ptr = (SQDataType*)realloc(sl->arr, sizeof(SQDataType) * (sl->capacity) * 2);
        if (ptr == NULL)
        {
            perror("realloc");
            return;
        }
        else
        {
            sl->arr = ptr;
        }
        sl->capacity *= 2;
    }
    while (num)
    {
        sl->arr[num] = sl->arr[num - 1];
        num--;
    }
    sl->arr[0] = input;
    sl->size++;
}

//随机插入
void SeqListPushRand(SL* sl)
{
    int input = 0;
    int flag = 0;
    printf("请输入要插入的数据:");
    scanf("%d", &input);
    printf("请输入要插入的位置:");
    scanf("%d", &flag);
    //扩容
    while (sl->size >= sl->capacity)
    {
        SQDataType* ptr = (SQDataType*)realloc(sl->arr, sizeof(SQDataType) * (sl->capacity) * 2);
        if (ptr == NULL)
        {
            perror("realloc");
            return;
        }
        else
        {
            sl->arr = ptr;
        }
        sl->capacity *= 2;
    }
    SQDataType* pf = &(sl->arr[flag - 1]);
    SQDataType* pf1 = &(sl->arr[sl->size - 1]);
    while (pf1 >= pf)
    {
        *(pf1 + 1) = *pf1;
        pf1--;
    }
    *pf = input;
    sl->size++;
}

//尾删
void SeqListPopBack(SL* sl)
{
    sl->size--;
}


//头删
void SeqListPopHead(SL* sl)
{
    if (sl->size)
    {
        int num = 0;
        while (num < sl->size)
        {
            sl->arr[num] = sl->arr[num + 1];
            num++;
        }
    }
}

//随机删除
void SeqListPopRand(SL* sl)
{
    int del = 0;
    printf("请输入要删除的位置:");
    scanf("%d", &del);
    while (del > sl->size)
    {
        printf("该位置无可删除的数据,请重新输入:");
        scanf("%d", &del);
    }
    SQDataType* pf = &(sl->arr[del - 1]);
    SQDataType* pf1 = pf + 1;
    while (pf1 <= &(sl->arr[sl->size - 1]))
    {
        *(pf1 - 1) = *pf1;
        pf1++;
    }
    sl->size--;
}


//查找
void SeqListFind(SL* sl)
{
    SQDataType* pf = sl->arr;
    int find = 0;
    printf("请输入要查找的位置:");
    scanf("%d", &find);
    while (find > sl->size)
    {
        printf("查询失败,该位置无内容,请重新输入:");
        scanf("%d", &find);
    }
    if (find <= sl->size)
    {
        printf("查询成功,该位置内容为:%d\n", sl->arr[find - 1]);
    }

}


//更改
void SeqListChange(SL* sl)
{
    int change = 0;
    int flag = 0;
    printf("请输入要更改的位置:");
    scanf("%d", &flag);
    while (flag > sl->size)
    {
        printf("该位置无数据可更改,请重新输入:");
        scanf("%d", &flag);
    }
    printf("请输入想要更换为的数据:");
    scanf("%d", &change);
    SQDataType* pf = &(sl->arr[flag - 1]);
    *pf = change;
}

    1.3 Test.c 源文件测试

#define _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

void menu()
{
    printf("**********************************************\n");
    printf("**********************************************\n");
    printf("*********** 1. endadd   2. beginadd **********\n");
    printf("*********** 3. randadd  4. endel    **********\n");
    printf("*********** 5. begindel 6. randdel  **********\n");
    printf("*********** 7. find     8. change   **********\n");
    printf("***********        0. exit          **********\n");
    printf("**********************************************\n");
    printf("**********************************************\n");
    printf("请输入要进行的操作:");
}


enum SQ
{
    Exit,
    endadd,
    beginadd,
    randadd,
    enddel,
    begindel,
    randdel,
    find,
    change
}sq;


int main()
{
    SeqListInit(&sl);
    int i = 0;
    int option = 0;
    int input = 0;
    int add = 0;
    do
    {
        menu();
        scanf("%d", &i);
        input = (enum SQ)i;
        switch (input)
        {
        case endadd:
            printf("请输入要插入的数据,以-1结束:");
            do
            {
                scanf("%d", &option);
                if (option != -1)
                {
                    SeqListPushBack(&sl, option);
                }
            } while (option != -1);
            SeqListPrint(&sl);
            break;
        case beginadd:
            SeqListPushHead(&sl);
            SeqListPrint(&sl);
            break;
        case randadd:
            SeqListPushRand(&sl);
            SeqListPrint(&sl);
            break;
        case enddel:
            SeqListPopBack(&sl);
            SeqListPrint(&sl);
            break;
        case begindel:
            SeqListPopHead(&sl);
            SeqListPrint(&sl);
            break;
        case randdel:
            SeqListPopRand(&sl);
            SeqListPrint(&sl);
            break;
        case find:
            SeqListFind(&sl);
            break;
        case change:
            SeqListChange(&sl);
            SeqListPrint(&sl);
            break;
        case Exit:
            printf("退出程序\n");
            break;
        default:
            printf("输入非法,请重新输入:");
            scanf("%d", &input);
            break;
        }
    } while (input);
    return 0;
}

2. OJ算法题

     1. 27. 移除元素 - 力扣(LeetCode)

  这题的最优解是双指针解法:时间复杂度O(N),空间复杂度O(1)。解法:

int removeElement(int* nums, int numsSize, int val)

{

    int left = 0;    //左指针,用于保存不等于val的数据

    int right = 0;  //右指针,用于排除等于val的值,并把不等于val的值赋值给左指针

    for(right = 0;right<numsSize;right++)  //右指针遍历

    {

        if(nums[right]!=val)  //如果右指针数据不等于val,右指针的数据复制给左指针

        {

            nums[left] = nums[right];

            left++;    //左右指针都++

        }

               //否则,如果右指针的数据等于val,左指针不动,右指针++

    }

    return left;         //最后数组中元素的个数就等于left的大小

}

      2. 88. 合并两个有序数组 - 力扣(LeetCode)

    这题的思路是用第三个数组来将数组1、2中的内容从小到大排放,然后再按个放进数组1中:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)

{

    int i = 0;  

    int j = 0;  //数组3的下标

    int pf1 = 0;  //数组1的指针

    int pf2 = 0;  //数组2的指针

    int nums3[m+n];  //用于存放数据的数组3

    while(pf1<m||pf2t<n)

    {

        if(pf1==m)  //如果数组1的内容已经全部放进数组3,则直接将数组2中的内容放进数组3

        {

            nums3[j++] = nums2[pf2++];

        }

        else if(pf2==n)  //如果数组2的内容已经全部放进数组3,则直接将数组1中的内容放进数组3

        {

            nums3[j++] = nums1[pf1++];

        }

        else if(nums1[pf1]<nums2[pf2])  //比较两数组中数据的大小,小的先放进数组3

        {

            nums3[j++] = nums1[pf1++];

        }

        else  

        {

            nums3[j++] = nums2[pf2++];

        }

    }

    for(i = 0;i<j;i++)

    {

        nums1[i] = nums3[i];  //将数组3的内容放回数组1中

    }

}

                                                        创作不易,点个赞呗,蟹蟹啦~

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于LSB(最低有效位)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

php将网页用wkhtmltoimage内容生成为图片

php架构ThinkPHP6 1. 安装 knp-snappy架构 composer require knplabs/knp-snappy use Knp\Snappy\Image; use Illuminate\Support\Facades\Storage;// 生成图片 /user/local/bin/wkhtmltoimage为你的wkhtmltoimage的位置。 $snappy new Image(/usr/local/bin/wkhtmltoimage…

智慧城市数字孪生,综合治理一屏统览

现代城市作为一个复杂系统&#xff0c;牵一发而动全身&#xff0c;城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维&#xff0c;从构成城市诸多要素、结构、功能等方面入手&#xff0c;系统推进…

算法学习——LeetCode力扣单调栈篇

算法学习——LeetCode力扣单调栈篇 739. 每日温度 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个…

关系型数据库mysql(7)sql高级语句①

目录 一.MySQL常用查询 1.按关键字&#xff08;字段&#xff09;进行升降排序 按分数排序 &#xff08;默认为升序&#xff09; 按分数升序显示 按分数降序显示 根据条件进行排序&#xff08;加上where&#xff09; 根据多个字段进行排序 ​编辑 2.用或&#xff08;or&…

ESP8266 控制 LED 亮灭

一、引脚对应 二、按键控制 LED 亮灭 2.1样例1 #include <ESP8266WiFi.h>const int ledPin D2; // LED 连接到 D2 引脚 const int keyPin D4; // 按键连接到 D4 引脚volatile bool flag false; // 记录 LED 状态的标志// 外部中断处理函数 ICACHE_RAM_ATTR void han…

重新温习广软puthon爬虫技术。

下面是我不断试错的一个过程&#xff0c;好多知识点全忘记了&#xff0c;只能不断调实例&#xff0c;不断优化&#xff0c;重构&#xff0c;实现自己的需求。下面是我的运行截图。还是导包的问题。 个人感觉关键的还是这几部&#xff0c;被划了下划线的&#xff0c;存在问题&a…

【智能算法】猎人猎物算法(HPO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;Naruei等人受到自然界动物猎食过程启发&#xff0c;提出了猎人猎物算法&#xff08;Hunter-Prey Optimization&#xff0c; HPO&#xff09;。 2.算法原理 2.1算法思想 HPO模拟…

输出1到10的阶乘--C语言

#include<stdio.h> int fac(int n){if(n<1){return 1;}elsereturn fac(n-1)*n; } int main(){int i, result;for(i1;i<10;i){resultfac(i);printf("%d!%d\n",i,result);}} 输出结果&#xff1a;

Java并发编程基础_Thread类

线程 Thread.class 1. 线程的六种状态 NEW 尚未启动的线程处于此状态。RUNNABLE 在Java虚拟机中执行的线程处于此状态。BLOCKED 被阻塞等待监视器锁定的线程处于此状态。WAITING 正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING 正在等待另一个线程执行动作达到…

C++中浅拷贝和深拷贝对象复制概念

1.浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a; 浅拷贝是指在对象复制时&#xff0c;只是复制对象的值&#xff0c;而不会复制对象指向的资源。这意味着对象和其副本会指向同一块内存空间&#xff0c;当一个对象改变时&#xff0c;另一个对象也会受到影响。 #inclu…

回溯算法|216.组合总和III

力扣题目链接 class Solution { private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果// targetSum&#xff1a;目标和&#xff0c;也就是题目中的n。// k&#xff1a;题目中要求k个数的集合。// sum&#xff1a;已经收集…

OpenKylin安装Kafka

一、操作系统 openKylin 1.0.1 X86 二、下载安装包 # 安装依赖jdk sudo apt-get update sudo apt-get install default-jdk # 下载kafka mkdir -p /data/software/kafka wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.13-2.4.1.tgz三、解压安装 # 解压缩Kafka…

springboot项目学习-瑞吉外卖(4)续

1.任务 菜品的添加功能(涉及到两张表的数据添加) 2.菜品添加 功能页面如上&#xff0c;该页面有两个注意点 菜品分类&#xff1a;点击菜品分类后&#xff0c;会展示当前已有菜品&#xff1a;这个功能的实现要从category表里查询数据&#xff0c;然后再做展示口味做法配置&#…

算法题->移动零的C语言和JAVA的双指针解法

使用C语言和JAVA代码通过双指针进行解题 题目描述:给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 理解题意:不改变数组中非零元素的顺序,并把0元素放在非零元素后面. 链接: https://leetcode.cn/problems/m…

Linux——将云服务器作为跳板机,frp实现内网穿透

文章目录 操作步骤1. 准备工作&#xff1a;2. 配置frp服务器端&#xff1a;3. 配置frp客户端&#xff1a;4. 启动frp客户端&#xff1a;5. 测试连接&#xff1a;6. 安全注意事项&#xff1a; 云服务器性能分析阿里云具体操作步骤1. 购买&#xff1a;2. 登录&#xff1a;3. 首次…

springboot企业级抽奖项目业务四 (缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…

CrossOver软件2024免费 最新版本详细介绍 CrossOver软件好用吗 Mac电脑玩Windows游戏

CrossOver是一款由CodeWeavers公司开发的软件&#xff0c;它可以在Mac和Linux等操作系统上运行Windows软件&#xff0c;而无需在计算机上安装Windows操作系统。这款软件的核心技术是Wine&#xff0c;它是一种在Linux和macOS等操作系统上运行Windows应用程序的开源软件。 Cross…

大语言模型---强化学习

本文章参考&#xff0c;原文链接&#xff1a;https://blog.csdn.net/qq_35812205/article/details/133563158 SFT使用交叉熵损失函数&#xff0c;目标是调整参数使模型输出与标准答案一致&#xff0c;不能从整体把控output质量 RLHF&#xff08;分为奖励模型训练、近端策略优化…

HarmonyOS 应用开发之FA模型绑定Stage模型ServiceExtensionAbility

本文介绍FA模型的三种应用组件如何绑定Stage模型的ServiceExtensionAbility组件。 PageAbility关联访问ServiceExtensionAbility PageAbility关联访问ServiceExtensionAbility和PageAbility关联访问ServiceAbility的方式完全相同。 import featureAbility from ohos.ability…