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

news2024/11/24 22:51:07

【数据结构与算法篇】动态顺序表及相关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.coloradmin.cn/o/1557804.html

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

相关文章

【C语言终章】预处理详解(上)

【C语言终章】预处理详解&#xff08;上&#xff09; 当你看到了这里时&#xff0c;首先要恭喜你&#xff01;因为这里就是C语言的最后一站了&#xff0c;你的编程大能旅途也将从此站开始&#xff0c;为坚持不懈的你鼓个掌吧&#xff01; &#x1f955;个人主页&#xff1a;开敲…

【Effective Web】文件上传

文章目录 前言一、选择本地文件1.设计一个上传文件按钮2.FileReader读取文件内容 二、使用拖拽方式1.设计一个拖拽容器2.拖拽文件的相关事件回调 三、使用粘贴方式1.设计一个粘贴容器2.paste事件回调 四、总结 前言 前端无法像app一样直接操作本地文件&#xff0c;对本地文件的…

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是&#xff08;&#xff09;。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…

【Java数据结构】关于栈的操作出栈,压栈,中缀表达式,后缀表达式,逆波兰表达式详解

&#x1f525;个人主页&#xff1a;努力学编程’ &#x1f525;内容管理&#xff1a;java数据结构 上一篇文章我们讲过了java数据结构的链表&#xff0c;对于链表我们使用了它的一些基本操作&#xff0c;完成了扑克牌小游戏的操作&#xff0c;如果你感兴趣的话&#xff0c;点…

Optimizer神经网络中各种优化器介绍

1. SGD 1.1 batch-GD 每次更新使用全部的样本&#xff0c;注意会对所有的样本取均值&#xff0c;这样每次更新的速度慢。计算量大。 1.2 SGD 每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本&#xff0c;这使得在梯度下降过程中不需去用所有训…

SpringBoot 整合Redis第1篇

SpringBoot是一个开发框架&#xff0c;Redis是一个高性能的键值存储数据库&#xff0c; 常用于缓存、会话管理、消息队列等应用场景。 定义 Redis是什么&#xff1f; 它是一个存储层级&#xff0c; 在实际项目中&#xff0c;位于关系数据库之上&#xff0c; 类似Android分为5…

(C语言)fread与fwrite详解

1. fwrite函数详解 头文件&#xff1a;stdio.h 函数有4个参数&#xff0c;只适用于文件输出流 作用&#xff1b;将从ptr中拿count个大小为size字节的数据以二进制的方式写到文件流中。返回写入成功的数目。 演示 #include <stdio.h> int main() {FILE* pf fopen(&qu…

相册清理大师-手机重复照片整理、垃圾清理软件

相册清理大师是一款超级简单实用的照片视频整理工具。通过便捷的操作手势&#xff0c;帮助你极速整理相册中的照片和视频、释放手机存储空间。 【功能简介】 向上滑动&#xff1a;删除不要的照片 向左滑动&#xff1a;切换下一张照片 向右滑动&#xff1a;返回上一张照片 整理分…

【shell】select in实现终端交互场景

文章目录 序言1. select in语句及其语法2. select in和case语句相结合3. 执行界面示例 序言 shell脚本实现简单的终端交互功能&#xff0c;根据用户不同输入执行不同功能脚本 1. select in语句及其语法 select in是shell独有的一种循环&#xff0c;非常适合终端交互场景 该语…

链表的极致——带头双向循环链表

​ 文章目录 双向带头循环链表简介&#xff1a;双向&#xff1a;带头&#xff1a;特点&#xff1a;链表带头节点的好处&#xff1a; 循环&#xff1a;特点&#xff1a;循环的好处&#xff1a; 双向带头循环链表的接口函数实现准备工作&#xff1a; 初始化链表&#xff08;头结…

C++:数据类型—布尔(12)

布尔类型代表就是真和假&#xff08;bool&#xff09; 真就是1&#xff08;true&#xff09; 假就是0&#xff08;false&#xff09; 也可以任务非0即为真 bool 直占用1个字节大小 语法&#xff1a;bool 变量名 (true | false&#xff09; 提示&#xff1a;bool在后期判断也是…

深度学习pytorch——经典卷积网络之ResNet(持续更新)

错误率前五的神经网络&#xff08;图-1&#xff09;&#xff1a; 图-1 可以很直观的看到&#xff0c;随着层数的增加Error也在逐渐降低&#xff0c;因此深度是非常重要的&#xff0c;但是学习更好的网络模型和堆叠层数一样简单吗&#xff1f;通过实现表明&#xff08;图-2&…

《自动机理论、语言和计算导论》阅读笔记:p49-p67

《自动机理论、语言和计算导论》学习第4天&#xff0c;p49-p67总结&#xff0c;总计19页。 一、技术总结 1.Deterministic Finite Automata(DFA) vs Nondeterministic Finite Automata(NFA) (1)DFA定义 (2)NFA定义 A “nonedeterministic” finite automata has the power t…

python之绘制曲线

以同一种型号的钻头&#xff0c;钻21种类型的板材&#xff0c;每种板材使用3根钻头&#xff0c;分别在钻第一个孔、2001孔、4001孔和6001孔前测量钻头外径&#xff0c;收集数据。 1、测试方法 采用激光钻径分选机测量微钻钻径以评估微钻外径磨损&#xff0c;测量从钻尖起始间…

C语言-文件

目录 1.什么是文件&#xff1f;1.1 程序文件1.2 数据文件 2.二进制文件和文本文件&#xff1f;3.文件的打开和关闭4.文件的顺序读写5.文件的随机读写5.1 fseek5.2 ftell5.3 rewind 6.文件读取结束的判定7.文件缓冲区 1.什么是文件&#xff1f; 磁盘上的文件就是文件 一般包含两…

使用pytorch构建带梯度惩罚的Wasserstein GAN(WGAN-GP)网络模型

本文为此系列的第三篇WGAN-GP&#xff0c;上一篇为DCGAN。文中仍然不会过多详细的讲解之前写过的&#xff0c;只会写WGAN-GP相对于之前版本的改进点&#xff0c;若有不懂的可以重点看第一篇比较详细。 原理 具有梯度惩罚的 Wasserstein GAN (WGAN-GP)可以解决 GAN 的一些稳定性…

caffe源码编译安装

一、前置准备 (1)vs2015 目前不要想着2019这些工具了,成功率太低了,就老老实实用vs2015吧 解决“VS2015安装包丢失或损坏“问题_vs2015跳过包会影响使用吗-CSDN博客 注意在安装vs2015过程中老是出现这个问题,其实就是缺少两个证书,安装完后就可以正常安装vs2015了,注意…

大数据面试专题 -- kafka

1、什么是消息队列&#xff1f; 是一个用于存放数据的组件&#xff0c;用于系统之间或者是模块之间的消息传递。 2、消息队列的应用场景&#xff1f; 主要是用于模块之间的解耦合、异步处理、日志处理、流量削峰 3、什么是kafka&#xff1f; kafka是一种基于订阅发布模式的…

AE——重构数字(Pytorch+mnist)

1、简介 AE&#xff08;自编码器&#xff09;由编码器和解码器组成&#xff0c;编码器将输入数据映射到潜在空间&#xff0c;解码器将潜在表示映射回原始输入空间。AE的训练目标通常是最小化重构误差&#xff0c;即尽可能地重构输入数据&#xff0c;使得解码器输出与原始输入尽…

什么是nginx正向代理和反向代理?

什么是代理&#xff1f; 代理(Proxy), 简单理解就是自己做不了的事情或实现不了的功能&#xff0c;委托别人去做。 什么是正向代理&#xff1f; 在nginx中&#xff0c;正向代理指委托者是客户端&#xff0c;即被代理的对象是客户端 在这幅图中&#xff0c;由于左边内网中…