简单的通用链表实现
来源:互联网 发布:金石造价格软件 编辑:程序博客网 时间:2024/05/12 22:27
最近项目需要用到链表, 并且是建立三个不同的专用链表,为了对代码加以简化,特采用通用链表来实现代码功能!
本链表是在linux下运行的,因此含有部分系统函数。
本人对指针理解较为粗糙,不能保证代码正确性,仅作自己总结而用!
代码未加封装,只有简单的实现函数。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdbool.h>typedef struct listnode{ struct listnode *next; struct listnode *prev; void *data;}List;//新建链表头List *createNode(void){ List *head = (List *)malloc(sizeof(List)); if(NULL == head) { printf("Usage : malloc error !\n"); return NULL; } head->next = head->prev = head; return head;}//尾插法List *tailInsert(List *head, void *data){ List *node = (List *)malloc(sizeof(List)); if(NULL == node) { printf("Usage : malloc error !\n"); return NULL; } node->data = data; head->prev->next = node; node->prev = head->prev; head->prev = node; node->next = head; return head;}//摧毁链表void destroyList(List **head){ List *tmp = NULL; List *next = NULL; if((*head)->next == *head) { return; } for(tmp=*head; tmp->next!=*head; tmp=next) { next = tmp->next; free(tmp); } *head = NULL;}//按compare函数来检索链表节点List *searchList(List *head, void *key, bool (*compare)(void *, void *)){ List *ptr = head; while(ptr->next != head) { ptr = ptr->next; if(compare(ptr->data, key)) { return ptr; } } return NULL;}//删除compare函数检索到的节点List *deleteList(List *head, void *key, bool(*compare)(void *, void*)){ List *ptr = head; while(ptr->next != head) { ptr = ptr->next; if(compare(ptr->data, key)) { ptr->prev->next = ptr->next; ptr->next->prev = ptr->prev; free(ptr); break; } } return head;}//打印链表void printList(List *head, void (*print)(void *)){ List *ptr = head; while(ptr->next != head) { ptr = ptr->next; print(ptr->data); }}//把链表存入文件void saveList(List *head, const char *filename, size_t size){ int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0777); if(-1 == fd) { printf("Usage : open error !\n"); return; } List *ptr = head; while(ptr->next != head) { ptr = ptr->next; write(fd, ptr->data, size); } close(fd); destroyList(&head);}//从文件读入链表List *readList(const char *filename, size_t size){ int fd, ret; List *head = createNode(); if(access(filename, F_OK) != 0) { close(open(filename, O_CREAT | O_APPEND, 0777)); } fd = open(filename, O_RDONLY); if(-1 == fd) { printf("Usage : open error !\n"); return NULL; } while(1) { void *data; data = malloc(size); ret = read(fd, data, size); if(0 == ret) { break; } tailInsert(head, data); } close(fd); return head;}
简单测试:
typedef struct action{ char name[20]; int id;}action_t;//比较函数bool compare(void *data, void *key){ action_t *act = (action_t *)data; int id = (int)key; if(act->id == id) { return true; } return false;}//打印函数void print(void *data){ action_t *act = (action_t *)data; printf("id = %d\t", act->id); printf("name = %s\n", act->name);}int main(void){ char *filename = "action.txt"; action_t test1 = {"zhao", 1}; action_t test2 = {"qian", 2}; action_t test3 = {"yang", 3}; action_t test4 = {"ling", 4}; action_t test5 = {"zhou", 5}; List *head = createNode(); tailInsert(head, (void *)(&test1)); tailInsert(head, (void *)(&test2)); tailInsert(head, (void *)(&test3)); tailInsert(head, (void *)(&test4)); tailInsert(head, (void *)(&test5)); printList(head, print); //存入文件 saveList(head, filename, sizeof(action_t)); //从文件读取 List *list = readList(filename, sizeof(action_t)); if(deleteList(list, (void *)1, compare)) { printf("删除id为1的节点,成功则打印!\n"); } //检验是否删除成功 printList(list, print); return 0;}
0 0
- 一个通用链表的简单实现
- 简单的通用链表实现
- 一个通用链表的简单实现
- 简单通用的双向链表
- 简单、通用的JQuery Tab实现
- C++ 实现简单通用的线程池
- 一个简单的通用Makefile实现
- 一个简单的通用Makefile实现
- 通用链表的设计与实现
- 通用链表的设计与实现
- 通用链表,队列的实现
- 实现通用的双向链表(c语言实现)
- hbase的CoprocessorProtocol及一个简单的通用扩展实现
- JSP实现的Java通用简单分页算法
- 又一种JSP实现的Java通用简单分页算法
- JSP实现的Java通用简单分页算法之三
- 非常简单的实现LINQ通用分页绑定方法
- c语言实现一个简单的通用动态数组
- iOS修改导航栏的返回按钮的内容
- 清除缓存
- 非常有用的50个CSS代码片段
- gradle使用
- Linux自旋锁
- 简单的通用链表实现
- onethink开发中遇到的问题
- 热塑性弹性与天然橡胶的一些区别
- yii框架session cookie的使用
- centOS7问题,因此发布最新版centOS6.6
- 亚马逊高管:Fire Phone定价过高 我们赔惨了
- Android Junit
- 深入认识热塑性硫化橡胶TPV性能
- 第10周项目1(3)