项目需求:
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;
}
}
}