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.创建双向链表

  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使用双向链表实现图片、音乐、视频的切换和删除功能相关推荐

  1. uni-app: APP端同时选择图片和视频,长按删除并震动提示

    APP端同时选择图片和视频 全部代码: <!-- --> <template><view><view><view><view styl ...

  2. dropzone.js php,Laravel 5.1 中基于 Dropzone.js 实现图片拖拽上传及删除功能

    注:本教程代码适用于Laravel 5.1版本. 1.概述 Dropzone 是目前最好的免费文件拖拽上传库,它拥有很多特性和选项以便你可以使用多种方式来自定义. 在Laravel项目集成Dropzo ...

  3. Android图片,视频,音乐选择播放器

    1.设计目的 为了更加深入的了解Android开发,我最初是打算设计是建立一个相册或视频相关的多媒体的应用,但一次偶然的机会我看到了在github中一个框架,该框架中定义了许多有关图片和视频相关操作的 ...

  4. 微信小程序组件:图片、视频、语音上传

    该组件封装了图片.视频.语音上传功能,也是最近开发过程中的一个收获,如图: 组件相关代码 uploader.wxml <scroll-view class="upload-file&q ...

  5. uniapp----上传图片或者视频到七牛云

    uniapp----上传图片或者视频到七牛云 该功能为借鉴微修(侵删) 1. 先封装七牛云,qiniuyunUploader.js (function () {// 请参考demo的index.js中 ...

  6. 封装一个完整版的uniapp图片和视频上传组件,拿来即用,可进行图片视频切换,可自定义上传按钮样式,删除按钮样式,可单独上传图片或者视频,可限制上传数量

    第一步 components里面新建一个manyImgUpload.vue组件,将以下代码放入 以下代码中需要你改的地方 uni.uploadFile中的参数,url为你公司的上传接口.files为你 ...

  7. Win隐藏 Win10 中的3D对象、文档、音乐、图片、视频、下载、桌面7个文件夹

    Windows 10 的 3D对象.文档.音乐.图片.视频.下载.桌面 这7个自作多情的文件夹,不过出现在[此电脑]里面,还出现在[另存为]对话框里面,烦死了,让它消失! 以下代码保存为 reg 文件 ...

  8. iOS原生推送(APNS)进阶iOS10推送图片、视频、音乐

    代码地址如下: http://www.demodashi.com/demo/13208.html 前言 我们首先要在AppDelegate里面进行iOS的适配,可以参考这篇文章 iOS原生推送(APN ...

  9. 方法简单适合新手!把图片变音乐视频,上月收入7000多

    靠几张图片在自媒体平台就能日赚200多,你能相信吗? 很多新手小白想要通过做自媒体赚取收益,在如何选择适合自己的领域时却非常头疼. 今天大周就来给你们分享一个图片变视频的玩法,操作并不难,相信大家也刷 ...

最新文章

  1. 算法 判断一个数是不是2的n次幂
  2. 银行祖传系统重构实例:创立12年,只支持Python 2,跑着500多个应用程序
  3. 跟着别人的感觉做网络推广之二
  4. Spring JPA
  5. 算法导论( FFT 自动机 最优二叉搜索树 !!!)
  6. Ubuntu使用U盘把从互联网上下载的安装包及其依赖更新到内部机
  7. iptables 从入门到应用
  8. JavaWeb中实现验证码(ssh框架版)
  9. ICP许可证的办理条件
  10. Google Chrome谷歌浏览器繁体字修改为简体字
  11. linux gcc/g++编译参数 -l(大写i)-L(大写l) -l(小写l)
  12. 数据聚合技术Aggregation
  13. 一种基于GRU神经网络的英文诗歌生成系统
  14. python 网络编程模块_详细介绍Python网络编程模块
  15. VMware 磁碟機未備妥
  16. LCD带字符液晶显示I LOVE YOU
  17. HDU 2000 ASII 排序
  18. 八图片在线图片设置付费
  19. 利用平台系统运营店铺五大法则
  20. 木兰天池全新景观2013闪亮登场

热门文章

  1. 大学阶段总结——大四
  2. Conflux 树图区块链 “数字藏品 合约标准和编写规范
  3. mysql怎么创建和调用out参数的存储过程
  4. 小科普 | 什么是MTBF?那MTTF、MTTD、MTTR又是啥?
  5. Null value appeared in non-nullable field java.lang.NullPointerException
  6. mallet java_Mallet 使用说明
  7. QT笔记——Q_PROPERTY了解
  8. 【Android Gradle 插件】DexOptions 配置 ⑤ ( additionalParameters 属性配置 | --minimal-main-dex 参数最小化主 dex 字节码 )
  9. 主角是李逍遥的Java游戏_经典单机游戏仙剑奇侠传一20周年,你所不知道的隐藏剧情...
  10. 如何看待为了进 Google、微软等外企大量刷题?