dlist.h #ifndef _DLIST_H #define _DLIST_H typedef struct _node { void* data; struct _node* prev; struct _node* next; }NODE; typedef struct { NODE* head; NODE* last; int length; }DLIST;; DLIST* dlist_init(); int node_ins(DLIST* dlist, void* data, int size); int node_del(DLIST* dlist, int n); void dlist_print(DLIST* dlist, int page, int num, void (*pmethod)(void*)); void dlist_clear(DLIST* dlist); void dlist_clear(DLIST* dlist); void dlist_destory(DLIST** dlist); #endif dlist.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "dlist.h" /* 初始化双链表 */ DLIST* dlist_init() { DLIST* dlist = (DLIST*)malloc(sizeof(DLIST)); if(dlist == NULL) { exit(0); } dlist->head = (NODE*)malloc(sizeof(NODE)); if(dlist->head == NULL) { //free(dlist); exit(0); } memset(dlist->head, 0, sizeof(NODE)); dlist->last=(NODE*)malloc(sizeof(NODE)); if(dlist->last == NULL) { //free(dlist); exit(0); } memset(dlist->last, 0, sizeof(NODE)); //dlist->head->prev = NULL; dlist->head->next = dlist->last; dlist->last->prev = dlist->head; //dlist->last->next = NULL; dlist->length = 0; return dlist; } /* 在尾哨兵前插入结点 */ int node_ins(DLIST* dlist, void* data, int size) { NODE* node = NULL; if(dlist == NULL || data == NULL) { return 0; } node = (NODE*)malloc(sizeof(NODE)); if(node == NULL) { return 0; } node->data = malloc(size); if(node->data == NULL) { free(node); return 0; } memcpy(node->data, data,size); node->next = dlist->last; node->prev = dlist->last->prev; dlist->last->prev->next = node; dlist->last->prev = node; dlist->length++; return 1; } /* 删除结点 */ int node_del(DLIST* dlist, int n) { NODE* node = NULL; int i = 0; if(dlist == NULL || n < 1 || n > dlist->length) { return 0; } node = dlist->head->next; while(i < dlist->length) { ++i; if(i == n) { break; } node = node->next; } node->prev->next = node->next; node->next->prev = node->prev; free(node->data); free(node); dlist->length --; return 0; } /* 打印链表结点数据 */ void dlist_print(DLIST* dlist, int page, int num, void (*pmethod)(void*)) { int start, end, templen; NODE* node = NULL; if(dlist == NULL || pmethod == NULL) { return; } start = (page -1 ) * num + 1; end = page * num; node = dlist->head->next; templen = 0; while(templen < dlist->length && node->next != NULL) { ++templen; if(templen == start) { break; } node = node->next; } for(; templen <= end && node->next != NULL; templen++ ) { pmethod(node->data); node = node->next; } } /* 请空链表 */ void dlist_clear(DLIST* dlist) { if(dlist == NULL) { return; } while(dlist->length) { node_del(dlist, 1); } } /* 销毁链表 */ void dlist_destory(DLIST** dlist) { DLIST* p = *dlist; if(p == NULL) { return; } dlist_clear(p); free(p->head); free(p->last); free(p); *dlist = NULL; } main.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include "dlist.h" double d[5]={15.23, 34.12, 35.16, 89.13, 45.27}; void double_data_print(void* data) { double* d = (double*)data; printf("d=%lf/n",*d); } int main(int argc, char* argv[]) { int i = 0; DLIST* dlist = dlist_init(); for(i = 0; i < 5; i++) { node_ins(dlist, &d[i], sizeof(d[i])); } dlist_print(dlist,2,3,double_data_print); dlist_destory(&dlist); if(dlist == NULL) { printf("dlist is null./n"); }else { printf("dlist is not null./n"); } return 0; }