刷B站看到的,做个玩玩。IDE:Visual Studio 2022。依赖EsayX图形库

1-效果

2-程序

/*
链表流星雨单文件版本
依赖EsayX图形库
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <graphics.h> typedef struct Rain
{
int x;
int y;
char str[20];
}ElemType;
//定义节点
typedef struct LNode
{
struct LNode* next;
ElemType data;
}Node, * LinkList; //链表函数
LinkList createList();
void push_back(LinkList list, ElemType val);
void pop_back(LinkList list);
void showAll(LinkList list);
bool empty(LinkList);
//数字雨函数 //初始化数字雨
void initRain(LinkList list, int size)
{
for (int i = 0; i < size; i++)
{
struct Rain newRain;
newRain.x = i * 15;
newRain.y = rand() % getheight();
for (int i = 0; i < 19; i++)
{
newRain.str[i] = rand() % 26 + 'A';
} push_back(list, newRain);
} }
//绘制数字雨
void drawRain(LinkList list)
{
LinkList curNode = list->next;
while (curNode)
{
for (int i = 0; i < 19; i++)
{
settextcolor(RGB(0, 255 - i * 13, 0));
outtextxy(curNode->data.x, curNode->data.y - i * 15, curNode->data.str[i]);
}
curNode = curNode->next;
}
}
//移动一根数字雨
void moveRain(LinkList node)
{
node->data.y++;
if (node->data.y > getheight())
{
node->data.y = 0;
}
}
typedef void(*FUN)(LinkList node);//函数指针
//移动所有数字雨
void moveAllRain(LinkList list, FUN fun)
{
LinkList curNode = list;
while (curNode)
{
fun(curNode);
curNode = curNode->next;
}
} int main()
{
//创建一个图形窗口
initgraph(960, 640);
//初始化一个链表
LinkList list = createList();
//初始化数字雨,70根
initRain(list, 70); BeginBatchDraw();
while (true)
{
cleardevice();
//绘制数字雨
drawRain(list);
//移动所有数字雨
moveAllRain(list, moveRain);
FlushBatchDraw();
}
EndBatchDraw();
} //创建带头节点的链表
LinkList createList()
{
LinkList headNode = (LinkList)calloc(1, sizeof(Node));
if (!headNode)
return NULL;
return headNode;
}
//往链表中插入元素
void push_back(LinkList list, ElemType val)
{
LinkList newNode = (LinkList)calloc(1, sizeof(Node));
if (!newNode)
return;
newNode->data = val; LinkList curNode = list;
while (curNode->next != NULL)
{
curNode = curNode->next;
}
curNode->next = newNode; }
//删除尾部元素
void pop_back(LinkList list)
{
if (empty(list))
return;
LinkList curNode = list;
while (curNode->next->next != NULL)
{
curNode = curNode->next;
}
free(curNode->next);
curNode->next = NULL;
}
//遍历所有元素
void showAll(LinkList list)
{
LinkList curNode = list->next;
while (curNode)
{
//printf("%d ", curNode->data);
curNode = curNode->next;
}
//printf("\n");
}
//判断链表是否为空
bool empty(LinkList list)
{
return list->next == NULL;
}

C语言-链表流星雨(EsayX)的更多相关文章

  1. C语言 链表

    原文:C语言 链表 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能. ...

  2. C语言链表操作模板(添加,删除,遍历,排序)

    C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...

  3. ZT C语言链表操作(新增单向链表的逆序建立)

    这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html ZT 链表逆序http://www.cnblogs.com/ ...

  4. C语言链表结构体(学习笔记)

    #include <stdio.h> #define LENTEST 100 // 采取逐步删除的方法求的素数 //先假设1-100都是素数,然后剔除2的倍数, //3的倍数,直到剔除所有 ...

  5. C语言链表实例--玩转链表

    下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...

  6. c语言-链表VS数组

    数组和链表的区别   数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要 ...

  7. 再次复习数据结构:c语言链表的简单操作

    最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...

  8. [数据结构]C语言链表实现

    我学数据结构的时候也是感觉很困难,当我学完后我发现了之所以困难时因为我没有系统的进行学习,而且很多教授都只是注重数据结构思想,而忽略了代码方面,为此我写了这些博文给那些试图自学数据结构的朋友,希望你们 ...

  9. [C语言]链表实现贪吃蛇及部分模块优化

    在继上篇[C语言]贪吃蛇_结构数组实现大半年后,链表实现的版本也终于出炉了.两篇隔了这么久除了是懒癌晚期的原因外,对整个游戏流程的改进,模块的精简也花了一些时间(都是借口). 优化模块的前沿链接: · ...

  10. 玩转C语言链表-链表各类操作详解

    链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个"头指针"变量,以head表示,它存放一个地址.该地址指向一个元素 ...

随机推荐

  1. Android 添加shape, selector等资源文件

    右键点击drawable文件夹,选择new -> Drawable Resource file 在弹出的New Resource file界面中,将Root element定义为shape,就可 ...

  2. CVE-2013-2566 SSL/TLS RC4 信息泄露漏洞 修复方案

    详细描述 安全套接层(Secure Sockets Layer,SSL),一种安全协议,是网景公司(Netscape)在推出Web浏览器首版的同时提出的,目的是为网络通信提供安全及数据完整性.SSL在 ...

  3. C#-out和ref 参数修饰符

    参数修饰符: 无参数修饰符:如果一个参数没有任何参数修饰符修饰,那么认为它是值传递,意味着方法内部收到的是实参数据的副本 out:输出参数由方法内部进行赋值,(引用传递),如果方法内部没有给被out修 ...

  4. git 修改commit 备注

    1.没有push 1.修改最后一次的提交备注 git commit --amend 输入 i 进行编辑模式,修改好以后 esc 退出编辑模式 :wq 保存并退出. 2.修改之前的备注 git reba ...

  5. 简单的自动清理TIM/QQ聊天垃圾文件方案

    我平时喜欢在后台挂着Tim,时间一长,我发现数据文件夹会越来越大,即使我没有看过这些消息(多为群聊消息),为了不再惦记清理垃圾文件,我整理了以下方案,可以每天清理一次7天前的文件. 1. 在磁盘任意位 ...

  6. js获取各种高度的方法

    js获取各种高度的方法 源文章:https://www.cnblogs.com/MrzhangRecord/p/9185868.html 目录 js获取各种高度的方法 1.获取元素的高度 模板:htm ...

  7. C语言的qsort函数

    C函数----qsort 函数 qsort()看起来和C++的sort()差不多,但是其实差别很大, qsort的cmp函数,传入的是指针,返回值是int sort的则传入值,返回值是bool 当qs ...

  8. OS复盘

    OS复盘 OS课设已经结课一段时间了,我也从其他课程中抽身出来,有了一段能够好好反思的时光. 说实话,完成OS课设的过程是很痛苦的,指导书蜻蜓点水.注释模棱两可.各种函数和文件调用杂乱无章.每次在完成 ...

  9. C - Frog Jumps

    C - Frog Jumps 思路:青蛙跳的问题,青蛙只能跳'R',不能跳'L',问青蛙至少跳多少可以跳过,我们可以这么想这个问题,找到所有R之间的L,看看哪个L多,计算数量即可 代码: #inclu ...

  10. GIS空间分析和建模复习重点4

    27.三维地形分析的方法 常用的有 ·坡度分析 ·坡向分布 ·填挖方分析 ·山体阴影分析 ·通视分析 28.空间分析实际应用 (1)城市应急避难场所是城市防灾减灾规划的重要组成部分,应急避难场所的建设 ...