双向循环链表小改进

//双向循环链表
#include<stdio.h>
#include<Stdio.h>
#include<windows.h>
typedef struct node
{
int data;
struct node *next, *pre;
}link;
//生成该链表
link *creat(link *head,int n)
{
link *p, q;
//初始化
p= head = (link
)malloc(sizeof(link));
head->pre = head;
head->next = head;

while(n--)
{
    q= (link*)malloc(sizeof(link));
    printf("输入一个数据:");
    scanf("%d",&q->data);
    p->next = q;
    q->pre =p;
    q->next = head;
    head->pre = q;
    p =q;
}
return head;

}
void Display(link *head)
{
link *p;
p = head->next;
while(p!=head)
{
printf("%d",p->data);
p= p->next;;
}
printf("\n");
system(“pause”);
}
void main()
{
link *head;
int n;
printf(“有几个数据?”);
scanf("%d",&n);
head = creat(head,n);
Display(head);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴回答您的问题。以下是一个使用交叉开发原理、文件IO接口函数和双向循环链表实现的模块化GEC6818电子相册C语言代码示例: ```c // 头文件 album.h #ifndef ALBUM_H #define ALBUM_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <linux/fb.h> #include <sys/mman.h> #include <sys/ioctl.h> typedef struct { char name[20]; char path[100]; int width; int height; unsigned char *data; } Image; typedef struct node { Image *image; struct node *prev; struct node *next; } Node; typedef struct { Node *head; Node *tail; int count; } Album; int openTouchScreen(); int readTouchEvent(int fd, int *x, int *y); void closeTouchScreen(int fd); Album createAlbum(int count); void addImage(Album *album, char *name, char *path); void showImage(Image *image); void showAlbum(Album *album, int fbfd); void destroyAlbum(Album *album); #endif // 源文件 album.c #include "album.h" #define BMP_HEADER_SIZE 54 #define BMP_WIDTH_OFFSET 18 #define BMP_HEIGHT_OFFSET 22 #define BMP_DATA_OFFSET 54 int openTouchScreen() { int fd = open("/dev/input/event0", O_RDONLY); if (fd < 0) { printf("Failed to open touch screen device\n"); exit(1); } return fd; } int readTouchEvent(int fd, int *x, int *y) { struct input_event event; int n = read(fd, &event, sizeof(event)); if (n < sizeof(event)) { printf("Failed to read touch event\n"); return -1; } if (event.type == EV_ABS && event.code == ABS_X) { *x = event.value; } else if (event.type == EV_ABS && event.code == ABS_Y) { *y = event.value; } else if (event.type == EV_KEY && event.code == BTN_TOUCH && event.value == 0) { return 1; } return 0; } void closeTouchScreen(int fd) { close(fd); } Album createAlbum(int count) { Album album; album.head = NULL; album.tail = NULL; album.count = 0; for (int i = 0; i < count; i++) { Image *image = (Image *) malloc(sizeof(Image)); image->name[0] = '\0'; image->path[0] = '\0'; image->width = 0; image->height = 0; image->data = NULL; Node *node = (Node *) malloc(sizeof(Node)); node->image = image; node->prev = NULL; node->next = NULL; if (album.tail == NULL) { album.head = node; album.tail = node; node->prev = node; node->next = node; } else { album.tail->next = node; node->prev = album.tail; node->next = album.head; album.head->prev = node; album.tail = node; } album.count++; } return album; } void addImage(Album *album, char *name, char *path) { for (Node *node = album->head; node != album->tail; node = node->next) { if (node->image->name[0] == '\0') { sprintf(node->image->name, "%s", name); sprintf(node->image->path, "%s", path); int fd = open(path, O_RDONLY); if (fd < 0) { printf("Failed to open image file\n"); exit(1); } char header[BMP_HEADER_SIZE]; int n = read(fd, header, BMP_HEADER_SIZE); if (n < BMP_HEADER_SIZE) { printf("Failed to read BMP header\n"); exit(1); } node->image->width = *(int *) (header + BMP_WIDTH_OFFSET); node->image->height = *(int *) (header + BMP_HEIGHT_OFFSET); int size = node->image->width * node->image->height * 3; node->image->data = (unsigned char *) malloc(size); n = read(fd, node->image->data, size); if (n < size) { printf("Failed to read BMP data\n"); exit(1); } close(fd); break; } } } void showImage(Image *image, int fbfd) { struct fb_var_screeninfo vinfo; ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo); unsigned char *fbp = (unsigned char *) mmap(NULL, vinfo.yres_virtual * vinfo.xres_virtual * vinfo.bits_per_pixel / 8, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); unsigned char *bmp = image->data; int bmpWidth = image->width; int bmpHeight = image->height; int fbWidth = vinfo.xres; int fbHeight = vinfo.yres; int xoffset = (fbWidth - bmpWidth) / 2; int yoffset = (fbHeight - bmpHeight) / 2; for (int y = 0; y < bmpHeight; y++) { for (int x = 0; x < bmpWidth; x++) { int fbIndex = ((y + yoffset) * fbWidth + (x + xoffset)) * vinfo.bits_per_pixel / 8; int bmpIndex = (y * bmpWidth + x) * 3; unsigned char b = bmp[bmpIndex]; unsigned char g = bmp[bmpIndex + 1]; unsigned char r = bmp[bmpIndex + 2]; unsigned int color = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3); *((unsigned int *) (fbp + fbIndex)) = color; } } munmap(fbp, vinfo.yres_virtual * vinfo.xres_virtual * vinfo.bits_per_pixel / 8); } void showAlbum(Album *album, int fbfd) { int x1 = 0, y1 = 0, x2 = 0, y2 = 0; int touchfd = openTouchScreen(); Node *node = album->head; showImage(node->image, fbfd); while (1) { int ret = readTouchEvent(touchfd, &x2, &y2); if (ret == 1) { int dx = x2 - x1; int dy = y2 - y1; if (dx > 0 && abs(dx) > abs(dy)) { node = node->next; showImage(node->image, fbfd); } else if (dx < 0 && abs(dx) > abs(dy)) { node = node->prev; showImage(node->image, fbfd); } } x1 = x2; y1 = y2; } closeTouchScreen(touchfd); } void destroyAlbum(Album *album) { for (Node *node = album->head; node != album->tail; node = node->next) { free(node->image->data); free(node->image); free(node); } free(album->tail->image->data); free(album->tail->image); free(album->tail); album->head = NULL; album->tail = NULL; album->count = 0; } // 主程序 main.c #include "album.h" int main() { int fbfd = open("/dev/fb0", O_RDWR); if (fbfd < 0) { printf("Failed to open framebuffer device\n"); return 1; } Album album = createAlbum(10); addImage(&album, "Image1", "/path/to/image1.bmp"); addImage(&album, "Image2", "/path/to/image2.bmp"); showAlbum(&album, fbfd); destroyAlbum(&album); close(fbfd); return 0; } ``` 这个示例程序定义了一个`Image`结构体表示图片,以及一个`Node`结构体表示双向循环链表中的节点,以及一个`Album`结构体表示相册,其中`Album`结构体包含头尾指针和节点数量。`createAlbum`函数用于创建相册和节点,`addImage`函数用于向相册中添加图片,并使用文件IO接口函数读取BMP图片文件的信息,`showImage`函数用于将图片数据正确显示到开发板上,`showAlbum`函数用于打开触摸屏设备文件,捕捉触摸事件的产生并判断手指滑动的方向来实现图片的切换。在主程序中,我们创建一个包含10张图片的相册,并向其中添加两张图片,最后使用双向循环链表实现图片文件的存储。需要注意的是,这个示例程序只是一个简单的模块化代码示例,实际开发中需要根据实际需求进行改进和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值