/**************************************************************************
* Linux C double linked for any data type
* 声明:
* 提供一种双链接口,可以保存保存任何类型的数据。
*
* 2015-12-25 晴 深圳 南山平山村 曾剑锋
*************************************************************************/ \\\\\\\\-*- 目录 -*-////////
| 一、cat double_linked.h
| 二、cat myerror.h
| 三、cat doulbe_linked.c
| 四、cat main.c
--------------------------- 一、cat double_linked.h
#ifndef __DOUBLE_LINK_H__
#define __DOUBLE_LINK_H__ #include <stdio.h>
#include <stdlib.h>
#include "myerror.h"
#include <string.h> typedef struct DOUBLE_LINKED{
void* datap;
int size;
struct DOUBLE_LINKED* pre;
struct DOUBLE_LINKED* next;
} double_linked; typedef void(*double_linked_print)(double_linked* data);
typedef int(*double_linked_delete)(void* data, double_linked* linked_data); void init_double_linked_node(double_linked* node);
int check_data_size(void* data, int size);
void empty_double_linked(double_linked* header);
void _delete_double_linked_node(double_linked* pre, double_linked* next);
void delete_double_linked_node(double_linked* node);
/**
* create a double linked for user
*/
double_linked* create_double_linked(void* data, int size);
void _add_double_linked(double_linked* current, double_linked* pre, double_linked* next);
/**
* top add doulbe linked
*/
int top_add_double_linked(void* data, int size, double_linked* header);
/**
* tail add double linked
*/
int tail_add_double_linked(void* data, int size, double_linked* header);
/**
* print all data in double linked
*/
void print_double_linked(double_linked* header, double_linked_print func);
/**
* empty all data in double linked
*/
void empty_double_linked(double_linked* header);
/**
* delete a element in the double linked
*/
void delete_double_linked(void* data, double_linked* header, double_linked_delete func);
/**
* free all data in the double linked
*/
void free_double_linked(double_linked* header);
#endif 二、cat myerror.h
#ifndef _MYERROR_H
#define _MYERROR_H //serial error 1
// error 2
// warning 3
// information 4 #define DEBUG1(...) fprintf(stderr,"SERI ERR: " __VA_ARGS__);
#define DEBUG2(...) fprintf(stderr,"ERR: " __VA_ARGS__);
#define DEBUG3(...) fprintf(stdout,"WARNING: " __VA_ARGS__);
#define DEBUG4(...) fprintf(stdout,"INFORMATION: " __VA_ARGS__);
#define DEBUG() fprintf(stdout,"\033[32mbug at func( %s ) : %d\033[0m\n", __func__, __LINE__); #define ERR(lever ,con, ret , ...) \
do \
{ \
if(con) \
{ \
DEBUG##lever(__VA_ARGS__) \
ret; \
} \
}while() #endif //_MYERROR_H 三、cat doulbe_linked.c
#include "double_linked.h"
void init_double_linked_node(double_linked* node){
node->next = node;
node->pre = node;
node->datap = NULL;
node->size = ;
} int check_data_size(void* data, int size){
return ((data != NULL) && (size > ));
}
/**
* create a double linked for user
*/
double_linked* create_double_linked(void* data, int size){
double_linked* header = malloc(sizeof(double_linked));
ERR(, NULL == header, goto err, "create double linked fail\n"); init_double_linked_node(header); if(check_data_size(data, size)){
void* new_data = malloc(size);
ERR(, NULL == new_data, goto err, "create double linked data fail\n");
memcpy(new_data, data, size);
header->size = size;
header->datap = new_data;
} return header;
err:
return NULL;
}
void _add_double_linked(double_linked* current, double_linked* pre, double_linked* next){
pre->next = current;
current->next = next;
next->pre = current;
current->pre = pre;
}
/**
* top add doulbe linked
*/
int top_add_double_linked(void* data, int size, double_linked* header){
if(check_data_size(data, size)){
double_linked* node = malloc(sizeof(double_linked));
ERR(, NULL == header, goto err, "create note fail.\n"); init_double_linked_node(node); void* new_data = malloc(size);
ERR(, NULL == new_data, goto err, "create note data fail.\n");
memcpy(new_data, data, size);
node->size = size;
node->datap = new_data;
_add_double_linked(node, header, header->next);
return ;
}
err:
return -;
}
/**
* tail add double linked
*/
int tail_add_double_linked(void* data, int size, double_linked* header){
if(check_data_size(data, size)){
double_linked* node = malloc(sizeof(double_linked));
ERR(, NULL == header, goto err, "create note fail.\n"); init_double_linked_node(node); void* new_data = malloc(size);
ERR(, NULL == new_data, goto err, "create note data fail.\n");
memcpy(new_data, data, size);
node->size = size;
node->datap = new_data;
_add_double_linked(node, header->pre, header);
return ;
}
err:
return -; }
/**
* print all data in double linked
*/
void print_double_linked(double_linked* header, double_linked_print func){
double_linked* tmp = header->next;
while(tmp != header){
func(tmp);
tmp = tmp->next;
}
}
void _delete_double_linked_node(double_linked* pre, double_linked* next){
pre->next = next;
next->pre = pre;
}
void delete_double_linked_node(double_linked* node){
_delete_double_linked_node(node->pre, node->next);
if(node->datap){
free(node->datap);
}
init_double_linked_node(node);
free(node);
}
/**
* empty all data in double linked
*/
void empty_double_linked(double_linked* header){
double_linked* tmp = header->next;
double_linked* pre = header;
while(tmp != header){
pre = tmp;
tmp = tmp->next;
delete_double_linked_node(pre);
}
init_double_linked_node(header);
if(header->datap)
free(header->datap);
header->datap = NULL;
header->size = ;
}
/**
* delete a element in the double linked
*/
void delete_double_linked(void* data, double_linked* header, double_linked_delete func){
double_linked* tmp = header->next;
double_linked* pre = header;
while(tmp != header){
pre = tmp;
tmp = tmp->next;
if(func(data, pre)){
delete_double_linked_node(pre);
}
}
}
void free_double_linked(double_linked* header){
double_linked* tmp = header->next;
double_linked* pre = header;
while(tmp != header){
pre = tmp;
tmp = tmp->next;
delete_double_linked_node(pre);
} init_double_linked_node(header);
if(header->datap)
free(header->datap);
header->datap = NULL;
header->size = ;
free(header);
} 四、cat main.c
#include "double_linked.h" #define NR(x) ((sizeof(x))/sizeof(x[0])) /**
* test struct
*/
typedef struct STUDENT{
int id;
int score;
}student; /**
* callback function
*/
void print(double_linked* node);
int delete(void* data, double_linked* node); int main(int argc, char** argv){
/**
* demo data
*/
student students[] = {
{,},
{,},
{,},
{,},
};
double_linked* header = create_double_linked(NULL, ); printf("--------------source--------------->\n");
int i = ;
for(i = ; i < NR(students); i++){
printf("student: id = %d, score = %d\n", students[i].id, students[i].score);
} printf("------------top add--------------->\n");
for(i = ; i < NR(students); i++){
top_add_double_linked(&students[i],sizeof(student), header);
}
print_double_linked(header, print); empty_double_linked(header); printf("-----------tail add-------------->\n");
for(i = ; i < NR(students); i++){
tail_add_double_linked(&students[i],sizeof(student), header);
}
print_double_linked(header, print); printf("-----------delete-------------->\n");
student stu = {,};
delete_double_linked(&stu, header, delete);
print_double_linked(header, print); printf("-------------free-------------->\n");
free_double_linked(header);
}
/**
* impelement of the client print
*/
void print(double_linked* node){
student* stu = (student*)(node->datap);
printf("student: id = %d, score = %d\n", stu->id, stu->score);
}
/**
* impelement of the client delete
*/
int delete(void* data, double_linked* node){
student* stu = (student*)(node->datap);
return (((student*)data)->id == stu->id) && (((student*)data)->score == stu->score);
}

Linux C double linked for any data type的更多相关文章

  1. Linux C single linked for any data type

    /************************************************************************** * Linux C single linked ...

  2. 关于Linux和Windows下部署mysql.data.dll的注册问题

    mysql ado.net connector下载地址: http://dev.mysql.com/downloads/connector/net/ 选择版本: Generally Available ...

  3. PHP 笔记一(systax/variables/echo/print/Data Type)

    PHP stands for "Hypertext Preprocessor" ,it is a server scripting language. What Can PHP D ...

  4. SQL Server error "Xml data type is not supported in distributed queries" and workaround for it

    Recently while working with data migration,got an error while running a following query where Server ...

  5. 数据结构(C++)之Double Linked List实践

    //double linked list (type int),the position starts from 0 #include <iostream> using namespace ...

  6. 数据类型(data type)

    基本数据类型(primitive data type):字符型(2个字节),布尔型(一位),byte(1个字节),short(两个字节),int(4个字节),long(8个字节),float(2个字节 ...

  7. mysql data type <----> java data type (数值)

    https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +----------------------------+---- ...

  8. MySql and Oracle Data Type Mappings

    the default settings used by SQL Developer to convert data types from MySQL to Oracle. SQL Developer ...

  9. C++数据类型(data type)介绍

    在编写程序时,数据类型(data type)定义了使用存储空间的(内存)的方式. 程序员通过定义数据类型(data type),告诉特定存储空间这里要存储的数据类型是什么,以及你即将操作他的方式.(注 ...

随机推荐

  1. ArrayList和Iterator的用法

    import java.util.ArrayList; import java.util.Iterator; public class ArrayListTest { public static vo ...

  2. FZU2165 v11(带权的重复覆盖)

    题意:有n个boss,m种武器,每种武器选用的时候需要有一定的花费ci,然后这个武器可以消灭掉其中一些BOSS,问你消灭完所有的BOSS,需要的最少花费是多少. 当时比赛的时候,看到这题以为是什么网络 ...

  3. 深入浅出ES6(十一):生成器 Generators,续篇

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 欢迎回到深入浅出ES6专栏,望你在ES6探索之旅中收获知识与快乐!程序员们在工作 ...

  4. java 关于mysql

    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after co ...

  5. 【poj1061-青蛙的约会】拓展欧几里得-不定方程

    http://poj.org/problem?id=1061 题意:裸题.注意负数. //poj1061 #include<cstdio> #include<cstdlib> ...

  6. 叠罗汉I

    叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上.同时我们应该让下面的人比上面的人更高一点.已知参加游戏的每个人的身高,请编写代码计算通过选择参与游戏的人,我们多能叠多少个人.注意这里的人都 ...

  7. lintcode: 最长连续序列

    最长连续序列 给定一个未排序的整数数组,找出最长连续序列的长度. 说明 要求你的算法复杂度为O(n) 样例 给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3 ...

  8. P2P通信标准协议(一)之STUN

    前一段时间在P2P通信原理与实现中介绍了P2P打洞的基本原理和方法,我们可以根据其原理为自己的网络程序设计一套通信规则, 当然如果这套程序只有自己在使用是没什么问题的.可是在现实生活中,我们的程序往往 ...

  9. schtasks确实可以绕过UAC,简直不可思议啊~~

    https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx

  10. Hibernate笔记——(ONE TO ONE)一对一

    转自:http://ryxxlong.iteye.com/blog/622652 ================= 一对一(one-to-one)实例(Person-IdCard) 一对一的关系在数 ...