当前位置: 首页 > article >正文

使用 easyX 库实现顺序表插入操作的可视化

引言

        在数据结构的学习过程中,理解顺序表的基本操作是非常重要的。本文将介绍如何使用 easyX 库来可视化顺序表的插入操作。通过动态展示插入过程,我们可以更直观地了解顺序表的工作原理。

可视化顺序表插入操作

 源码展示:

#undef UNICODE
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "graphics.h"
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

#define MAX_SIZE 10
#define RECT_WIDTH 100
#define RECT_HEIGHT 50
#define START_X 10
#define START_Y 150

void drawArray(int arr[], int size, int position);
void insertElement(int arr[], int* size, int value, int position, int tempArr[]);

int main() {
    int arr[MAX_SIZE] = { 10,20,40,50,60,70,80,90,100 };
    int tempArr[MAX_SIZE];
    int size = 9;
    int value = 30;
    int position = -1;

    mciSendString("open music/music.mp3", NULL, 0, NULL);
    mciSendString("play music/music.mp3", NULL, 0, NULL);

    for (int i = 0; i < size; i++) {
        if (arr[i] > value) {
            position = i;
            break;
        }
    }
    initgraph(1024, 500);

    drawArray(arr, size, position);

    for (int i = 0; i <= size; i++) {
        tempArr[i] = arr[i];
    }
    tempArr[size] = value;

    BeginBatchDraw();
    insertElement(tempArr, &size, value, position, tempArr);
    EndBatchDraw();

    _getch();
    closegraph();
    return 0;
}

void drawArray(int arr[], int size, int position) {
    cleardevice();
    setbkcolor(WHITE);
    setlinecolor(BLACK);

    for (int i = 0; i <= size; i++) {
        if (i < MAX_SIZE) {
            bar(i * RECT_WIDTH + START_X, START_Y, i * RECT_WIDTH + START_X + RECT_WIDTH, START_Y + RECT_HEIGHT);
            line(i * RECT_WIDTH + START_X, START_Y, i * RECT_WIDTH + START_X + RECT_WIDTH, START_Y);
            line(i * RECT_WIDTH + START_X + RECT_WIDTH, START_Y, i * RECT_WIDTH + START_X + RECT_WIDTH, START_Y + RECT_HEIGHT);
            line(i * RECT_WIDTH + START_X, START_Y + RECT_HEIGHT, i * RECT_WIDTH + START_X + RECT_WIDTH, START_Y + RECT_HEIGHT);
            line(i * RECT_WIDTH + START_X, START_Y, i * RECT_WIDTH + START_X, START_Y + RECT_HEIGHT);

            char strNum[16];
            sprintf_s(strNum, "%d", arr[i]);

            int textX = i * RECT_WIDTH + START_X + RECT_WIDTH / 2 - 20;
            int textY = START_Y + RECT_HEIGHT / 2 - 20;

            if (arr[i] == 30) {
                settextcolor(RED);
            }
            else {
                settextcolor(BLACK);
            }

            outtextxy(textX, textY, strNum);
        }
    }

    int titleX = 300;
    int titleY = 20;
    settextcolor(RED);
    settextstyle(45, 0, "楷体");
    outtextxy(titleX, titleY, "可视化顺序表插入操作");
}

void insertElement(int arr[], int* size, int value, int position, int tempArr[]) {
    if (*size == MAX_SIZE || position < 0)return;

    int originalValues[10];

    for (int i = *size; i > position; i--) {
        originalValues[i] = arr[i - 1];
        arr[i] = value;

        drawArray(arr, *size, position);
        getchar();
        if (i == 9)
            outtextxy(150, 250, "我们将实现将30有序表插入正确的位置");
        else {
            outtextxy(160, 250, "每次判断是否大于前一个位置的值");
            outtextxy(25, 325, "如果大于,往前移,L->data[j+1] = L->data[j]");
            outtextxy(150, 400, "否则,为待插入的位置,退出循环");
        }

        FlushBatchDraw();
        arr[i] = originalValues[i];
    }

    arr[position] = value;
    (*size)++;
    drawArray(arr, *size, position);
    getchar();
    outtextxy(125, 250, "30>20,该位置是待插入的位置,结束循环");
    outtextxy(280, 350, "顺序插入元素操作成功");
}


http://www.kler.cn/news/305305.html

相关文章:

  • 并发锁机制之深入理解synchronized
  • Mybatis-plus进阶篇(一)
  • 一种全新的webapi框架C#webmvc初步介绍
  • opencv之傅里叶变换
  • ZYNQ FPGA自学笔记
  • 大屏可视化常用图标效果表达
  • OCR2.0--General OCR Theory
  • 先框架后历元还是先历元后框架?
  • elementui 单元格添加样式的两种方法
  • Web 创建设计
  • RabbitMQ(高阶使用)延时任务
  • 19. 删除链表的倒数第 N 个结点【 力扣(LeetCode) 】
  • 定时任务调用OpenFegin无token认证异常
  • LAMP+WordPress
  • 服务器运维面试题4
  • 【SpringBoot】调度和执行定时任务--Quartz(超详细)
  • Ubuntu 22.04.5 LTS 发布下载 - 现代化的企业与开源 Linux
  • 力扣移除元素(力扣题26)(插空找空位java)
  • Linux上使用touch修改文件时间属性的限制
  • 如何打造智能、高效、安全的智慧实验室
  • 【React源码解析】深入理解react时间切片和fiber架构
  • C++——智能指针
  • CH1-1 引论
  • Rust:Result 和 Error
  • 职场 Death Note
  • Uniapp + Vue3 + Vite +Uview + Pinia 实现提交订单以及支付功能(最新附源码保姆级)
  • MATLAB中who的用法
  • flink增量检查点启动恢复的时间是很久的,业务上不能接受,怎么处理
  • MySQL索引-聚簇索引和非聚簇索引
  • 【Python机器学习】循环神经网络(RNN)——传递数据并训练