C语言电子相册实验项目

项目需求:    


    1、文件夹下有5张图片,按 上下键可以进行图片路径的切换(路径切换即可)
    2、可以添加图片
    3、可以按照路径删除图片
    4、查看所有图片


    
项目分析:


    该项目可以动态添加和删除图片,因此可以使用链表进行保存路径
    为了方便上下切换,可以使用双向循环链表进行操作
    该项目采用无头链表形式,方便数据的保存和切换
    


项目功能点:


    1、准备工作
    2、界面操作显示
    3、初始化链表
    4、图片显示切换
    5、添加图片
    6、删除图片
    7、查看所有图片

功能点实现:


1、准备工作
构造图片节点

typedef struct pnode
{
    struct pnode *next;  //下一个节点
    struct pnode *last;  // 上一个节点
    
    char path[20];  // 图片路径
}PNODE;

图片路径:

char paths[][20] = {
    "./1_cat.jpg",
    "./2_xx.png",
    "./3_y.jpeg",
    "./4_ii.jpg",
    "./5_z.png"
};

头指针:PNODE *h;
为了方便使用,头指针声明为全局

2、界面操作显示

void showUI(void)
{
    system("cls");
    printf("----------这里是信盈达电子相册实验----------\n");
    printf("---------[1]图片显示   [2]添加图片----------\n");
    printf("---------[3]删除图片   [4]查询所有图片------\n");
    printf("---------[0]退出                  ----------\n");
    printf("请选择:"); 
}

3、初始化链表

void initLink(void)
{
    // 申请头结点 
    h = (PNODE *)malloc(sizeof(PNODE)); 
    if(h == NULL)
    {
        printf("申请图片节点失败!\n");
        return ; 
    }
    
    // 计算图片有几张
    int len = sizeof(paths) / sizeof(paths[0]);     
    
    if(len == 0) 
    {
        printf("该相册中还没有图片\n");
        return ;
    }
    
    // 申请成功,先初始化头结点    
    h->next = NULL;
    h->last = NULL;
    strcpy(h->path,paths[0]);
    
    // 循环创建剩余图片的节点,并添加到链表中
    int i; //第一张图片已经添加了,因此i从1开始 
    for(i=1;i<len;i++)
    {
        PNODE *p = (PNODE *)malloc(sizeof(PNODE)); 
        if(p == NULL)
        {
            printf("申请图片节点失败!\n");
            break; 
        }
        
        strcpy(p->path,paths[i]);        
        
        if(i == 1)
        {    
            // 如果是第2个的话和头结点抱团    
            p->last = h;
            p->next = h;
            
            h->last = p;
            h->next = p;
        }        
        else
        {
            // 以后的节点插入到最后 
            p->next = h;
            p->last = h->last;
            h->last->next = p;
            h->last = p;
        }            
    }     
}


4、图片显示切换

void play(void)
{
    char ch; // 接收用户操作的方向键
    // 检测链表上的节点是否>=2,>=2才有循环播放     
    PNODE *curr = h;
    
    // 相册中没有图片 
    if(curr == NULL)
    {
        printf("该相册中还没有图片,请添加图片后重试......\n");
        return ; 
    } 
    // 相册中只有一张图片 
    if(curr->next == NULL)
    {
        printf("该相册中只有一张图片,路径为:%s",curr->path); 
    }
    
    // 相册中多张图片展示并切换
    while(1) 
    {
        system("cls");
        printf("当前图片路径为:%s\n",curr->path);
        printf("(按↑↓键进行图片切换,按q键退出切换)");
        ch = getch();
        // 72为电脑↑键的值,80为下键的值 
        if(ch == 72)
        {
            // ↑键
            curr = curr->last; 
        }
        else if(ch == 80)
        {
            curr = curr->next;
        }
        else if(ch == 'q') 
        {
            break;
        }
    }
}


5、添加图片

void addPic(void)
{
    PNODE *p = (PNODE *)malloc(sizeof(PNODE));
    if(p == NULL)
    {
        printf("申请图片节点失败!\n");
        return ;
    }
    
    printf("请输入图片的路径:");
    scanf("%s",p->path);
    
    if(p == NULL)
    {
        // 第一个节点        
        p->next = NULL;
        p->last = NULL; 
        h = p;
    }
    else if(p->next == NULL)
    {
        // 第2个字节
        p->last = h;
        p->next = h;
        
        h->last = p;
        h->next = p;
    }
    else
    {
        // 以后的节点插入到最后 
        p->next = h;
        p->last = h->last;
        h->last->next = p;
        h->last = p;
    }
    printf("添加成功!");
}


    

6、删除图片
    按照路径进行删除

void delPic(void)
{
    char delPath[20] = {0};
    printf("请输入要删除的图片的名字:");
    scanf("%s",delPath);
    
    if(h == NULL)
    {
        printf("该相册为空,添加图片后再进行操作......\n"); 
        return ;
    } 
    
    PNODE *p = h;
    int flag = 0; // 设置一个标识位,代表是否找到该图片 
    while(1)
    {
        if(strcmp(p->path,delPath) == 0)
        {
            // 找到,设置标识位 
            flag = 1;
            // 删除图片
            // 如果相册中只有一张图片,删除后还要修改头指针的指向,因此传递参数的时候需要使用二级指针
            if(p->next == NULL)
            {
                free(p);
                h = NULL;
            } 
            else
            {
                p->last->next = p->next;
                p->next->last = p->last;
                
                free(p);
                p = NULL;
            }
            printf("删除成功!\n");
            break;            
        }
        
        p = p->next;
        
        if(p == h)
        {
            // 循环一圈,没有找到
            printf("没有找到要删除的图片\n");
            break; 
        }
    }    
}

7、查询所有图片

void showAllPic(void)
{
    PNODE *p = h;
    
    if(p == NULL)
    {
        printf("电子相册为空,请添加图片后再操作......\n"); 
    }
    
    while(1)
    {
        printf("%s\n",p->path);
        p = p->next;
        
        if(p == h)
        {
            break;
        }
    }    
} 


 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小镇做题家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值