Linux使用双向链表实现图片、音乐、视频的切换和删除功能
Linux使用双向链表实现图片、音乐、视频的切换和删除功能
- Linux检索目录下的后缀文件(.bmp .avi .mp3),并将文件名存入链表中
- 一、双向链表的实现
- 1.创建双向链表
- 2.链表节点添加
- 3.链表删除
- 4.链表数据显示
- 5.链表销毁
- 二、查找所需要的文件
- 1.检索目录下.bmp图片文件并保存到双向链表中,成功返回0
- 2.检索目录下.avi视频文件,并保存到双向链表中,成功返回0
- 2.检索目录下.mp3音乐文件,并保存到双向链表中,成功返回0
- 三、双向链表实现的功能
- 1.实现图片的切换和删除功能
- 2.视频和音乐的切换和删除功能和图片的一样的操作
- 四、实现的难点和总结
Linux检索目录下的后缀文件(.bmp .avi .mp3),并将文件名存入链表中
一、双向链表的实现
1.创建双向链表
- 创建双向链表 结构体
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>//创建链表结构体
typedef struct bmp_node{char data[32]; //数据域 struct bmp_node *prev; //指针域 struct bmp_node *next;
}BmpNode;
2.创建链表头结点
//创建双向链表头
BmpNode *D_R_List_Create(void)
{ //申请堆空间 BmpNode *list=(BmpNode *)malloc(sizeof(BmpNode));if(list == NULL){ perror("malloc failed");return NULL; }list->prev=list;list->next=list; return list;
}
2.链表节点添加
//双向链表节点添加(尾插法)
bool list_add_node_tail(BmpNode *head,char *data)
{//申请堆空间 BmpNode *newnode=(BmpNode *)malloc(sizeof(BmpNode));if(newnode == NULL){ perror("malloc failed"); return false;} //对新结点赋值 strcpy(newnode->data,data); newnode->prev=newnode; newnode->next=newnode; //处理后继指针 head->prev->next=newnode; newnode->next=head; //处理前继指针 newnode->prev=head->prev; head->prev=newnode;return true;
}
3.链表删除
//链表节点删除
bool list_node_remove(BmpNode *head,char *data)
{ BmpNode *p=head->next; while(p != head) { if(p->data == data) { printf("删除节点成功\n"); p->prev->next=p->next; p->next->prev=p->prev; free(p); return true; } p=p->next; } printf("删除节点失败:没有这个节点\n"); return false;
}
4.链表数据显示
//链表数据显示
void D_R_List_Show_Data(BmpNode *head)
{ BmpNode *p=head->next; printf("链表数据为:"); while(p!=head) { printf("%s",p->data); p=p->next; } printf("\n");
}
5.链表销毁
//链表销毁
void list_destory(BmpNode *head)
{ int i; BmpNode *p=head->next; while(p != head) { i++; p=p->next; free(p->prev); } printf("一共释放%d个节点",i); free(head); printf("链表销毁成功\n");
}
二、查找所需要的文件
1.检索目录下.bmp图片文件并保存到双向链表中,成功返回0
int Search_Dir(BmpNode *head,char *dirpath)
{ DIR *dp=opendir(dirpath); //打开目录 if(NULL == dp) { perror("opendir false"); return -1; } struct dirent *fp; char bmp_buf[32]; while(fp=readdir(dp)) { if(strstr(fp->d_name,".bmp")) //检索bmp文件 { sprintf(bmp_buf,"%s/%s",dirpath,fp->d_name); //字符串打包 list_add_node_tail(head,bmp_buf);//尾插法插入链表 memset(bmp_buf,0,sizeof(bmp_buf)); //清空数组 } } D_R_List_Show_Data(head); //显示链表节点数据 closedir(dp); //关闭文件 return 0;
}
2.检索目录下.avi视频文件,并保存到双向链表中,成功返回0
//检索目录里AVI文件并存入链表
int Search_Dir_Avi(BmpNode *head,char *dirpath)
{ DIR *dp=opendir(dirpath); //打开目录 if(NULL == dp) { perror("opendir false"); return -1; } struct dirent *fp; char bmp_buf[32]; while(fp=readdir(dp)) { if(strstr(fp->d_name,".avi")) //检索文件 { sprintf(bmp_buf,"%s/%s",dirpath,fp->d_name); //字符串打包 list_add_node_tail(head,bmp_buf); //尾插法插入链表 memset(bmp_buf,0,sizeof(bmp_buf)); //清空数组 } } D_R_List_Show_Data(head); //显示链表节点数据 closedir(dp); //关闭文件 return 0;
}
2.检索目录下.mp3音乐文件,并保存到双向链表中,成功返回0
//检索目录里MP3文件数据并存入链表
int Search_Dir_Mp3(BmpNode *head,char *dirpath)
{ DIR *dp=opendir(dirpath); //打开目录 if(NULL == dp) { perror("opendir false"); return -1; } struct dirent *fp; char bmp_buf[32]; while(fp=readdir(dp)) { if(strstr(fp->d_name,".mp3")) //检索文件 { sprintf(bmp_buf,"%s/%s",dirpath,fp->d_name); //字符串打包 list_add_node_tail(head,bmp_buf); //尾插法插入链表 memset(bmp_buf,0,sizeof(bmp_buf)); //清空数组 } } D_R_List_Show_Data(head); //显示链表节点数据 closedir(dp); //关闭文件 return 0;
}
三、双向链表实现的功能
1.实现图片的切换和删除功能
(1)切换上一张、下一张图片
BmpNode *list=D_R_List_Create(); //创建链表
Search_Dir(list,"./picture"); //检索目录
if(...)
{p=p->next; if(p==list) { p=p->next; }show_bmp(800,480,0,0,p->data);
}
if(...)
{p=p->prev;if(p==list){p=p->prev;}show_bmp(800,480,0,0,p->data);
}
(2)删除图片功能
if(...)
{remove(p->data); printf("删除图片成功!\n"); list_node_remove(list,p->data); p=p->next; if(p==list) { p=p->next; } Show_Bmp(640,480, 0, 0, p->data);
}
2.视频和音乐的切换和删除功能和图片的一样的操作
四、实现的难点和总结
(1)strcpy()和“=”直接赋值的区别,个人认为strcpy用于对字符串的堆空间进行拷贝,不改变自身的地址,“=”直接赋值是把字符串的首地址赋值给变量,自身的地址会发生改变。
详情可参考:https://blog.csdn.net/qq_40737025/article/details/103951297
(2)注意双向链表的前指针和尾指针,应指针内容较为抽象,建议画图加深理解双向链表
(3)常用的函数和作用
malloc(sizeof(BmpNode)) :
//申请和BmpNode一样大的栈空间strcpy(newnode->data,data);
//把data的内容拷贝到newnode->data中free(p);
//释放p节点的栈空间perror("opendir false");
//打印错误信息DIR *dp=opendir(dirpath);
//打开dirpath路径下的目录,成功则返回__dirstream 的结构体,失败返回一个空的指针strstr(fp->d_name,".bmp");
//若".bmp"是fp->d_name的子串,则返回".bmp"在fp->d_name的首次出现的地址;否则,则返回NULLmemset(bmp_buf,0,sizeof(bmp_buf));
//清空bmp_buf数组
Linux使用双向链表实现图片、音乐、视频的切换和删除功能相关推荐
- uni-app: APP端同时选择图片和视频,长按删除并震动提示
APP端同时选择图片和视频 全部代码: <!-- --> <template><view><view><view><view styl ...
- dropzone.js php,Laravel 5.1 中基于 Dropzone.js 实现图片拖拽上传及删除功能
注:本教程代码适用于Laravel 5.1版本. 1.概述 Dropzone 是目前最好的免费文件拖拽上传库,它拥有很多特性和选项以便你可以使用多种方式来自定义. 在Laravel项目集成Dropzo ...
- Android图片,视频,音乐选择播放器
1.设计目的 为了更加深入的了解Android开发,我最初是打算设计是建立一个相册或视频相关的多媒体的应用,但一次偶然的机会我看到了在github中一个框架,该框架中定义了许多有关图片和视频相关操作的 ...
- 微信小程序组件:图片、视频、语音上传
该组件封装了图片.视频.语音上传功能,也是最近开发过程中的一个收获,如图: 组件相关代码 uploader.wxml <scroll-view class="upload-file&q ...
- uniapp----上传图片或者视频到七牛云
uniapp----上传图片或者视频到七牛云 该功能为借鉴微修(侵删) 1. 先封装七牛云,qiniuyunUploader.js (function () {// 请参考demo的index.js中 ...
- 封装一个完整版的uniapp图片和视频上传组件,拿来即用,可进行图片视频切换,可自定义上传按钮样式,删除按钮样式,可单独上传图片或者视频,可限制上传数量
第一步 components里面新建一个manyImgUpload.vue组件,将以下代码放入 以下代码中需要你改的地方 uni.uploadFile中的参数,url为你公司的上传接口.files为你 ...
- Win隐藏 Win10 中的3D对象、文档、音乐、图片、视频、下载、桌面7个文件夹
Windows 10 的 3D对象.文档.音乐.图片.视频.下载.桌面 这7个自作多情的文件夹,不过出现在[此电脑]里面,还出现在[另存为]对话框里面,烦死了,让它消失! 以下代码保存为 reg 文件 ...
- iOS原生推送(APNS)进阶iOS10推送图片、视频、音乐
代码地址如下: http://www.demodashi.com/demo/13208.html 前言 我们首先要在AppDelegate里面进行iOS的适配,可以参考这篇文章 iOS原生推送(APN ...
- 方法简单适合新手!把图片变音乐视频,上月收入7000多
靠几张图片在自媒体平台就能日赚200多,你能相信吗? 很多新手小白想要通过做自媒体赚取收益,在如何选择适合自己的领域时却非常头疼. 今天大周就来给你们分享一个图片变视频的玩法,操作并不难,相信大家也刷 ...
最新文章
- 算法 判断一个数是不是2的n次幂
- 银行祖传系统重构实例:创立12年,只支持Python 2,跑着500多个应用程序
- 跟着别人的感觉做网络推广之二
- Spring JPA
- 算法导论( FFT 自动机 最优二叉搜索树 !!!)
- Ubuntu使用U盘把从互联网上下载的安装包及其依赖更新到内部机
- iptables 从入门到应用
- JavaWeb中实现验证码(ssh框架版)
- ICP许可证的办理条件
- Google Chrome谷歌浏览器繁体字修改为简体字
- linux gcc/g++编译参数 -l(大写i)-L(大写l) -l(小写l)
- 数据聚合技术Aggregation
- 一种基于GRU神经网络的英文诗歌生成系统
- python 网络编程模块_详细介绍Python网络编程模块
- VMware 磁碟機未備妥
- LCD带字符液晶显示I LOVE YOU
- HDU 2000 ASII 排序
- 八图片在线图片设置付费
- 利用平台系统运营店铺五大法则
- 木兰天池全新景观2013闪亮登场
热门文章
- 大学阶段总结——大四
- Conflux 树图区块链 “数字藏品 合约标准和编写规范
- mysql怎么创建和调用out参数的存储过程
- 小科普 | 什么是MTBF?那MTTF、MTTD、MTTR又是啥?
- Null value appeared in non-nullable field java.lang.NullPointerException
- mallet java_Mallet 使用说明
- QT笔记——Q_PROPERTY了解
- 【Android Gradle 插件】DexOptions 配置 ⑤ ( additionalParameters 属性配置 | --minimal-main-dex 参数最小化主 dex 字节码 )
- 主角是李逍遥的Java游戏_经典单机游戏仙剑奇侠传一20周年,你所不知道的隐藏剧情...
- 如何看待为了进 Google、微软等外企大量刷题?