list1.h #ifndef _LIST_H #define _LIST_H typedef struct _node { void* data; struct _node* next; }NODE; typedef struct { NODE* head; NODE* last; int length; }LIST; LIST* list_init(); int list_free(LIST* list); int node_insert(LIST* list, void* data, int size); NODE* node_find_by_key(LIST* list, void* key, int (*compare)(void*, void*)); int node_delete(LIST* list, void* key, int (*compare)(void*, void*)); #endif list1.c #include <stdlib.h> #include <string.h> #include <stdio.h> #include "list1.h" /* 初始链表 */ LIST* list_init() { LIST* list = (LIST*)malloc(sizeof(LIST)); if(list == NULL) exit(0); memset(list,0,sizeof(LIST)); /* 为链表所有成员附初值0 */ return list; } /* 释放链表所占资源 */ int list_free(LIST* list) { free(list); return 0; } /* 在链表末尾插入结点 */ int node_insert(LIST* list, void* data, int size) { NODE* n = NULL; if(list == NULL || data == NULL) { return 0; } n = (NODE*)malloc(sizeof(NODE)); if(n == NULL) { return 0; } n->data = malloc(size); if(n->data == NULL) { free(n); return 0; } memcpy(n->data, data, size); n->next = NULL; if(list->head == NULL) { list->head = n; }else { list->last->next = n; } list->last = n; list->length ++; return 0; } /* 通过关键词查找结点 */ NODE* node_find_by_key(LIST* list, void* key, int (*compare)(void*, void*)) { NODE* p = NULL; if(list == NULL || key == NULL || compare ==NULL) { return NULL; } p = list->head; while(p) { if(compare(p->data,key) == 1) { return p; } p = p->next; } return NULL; } /* 通过关键词查找结点并记录其前一个结点的位置 */ NODE* node_find(LIST* list, void* key, int (*compare)(void*, void*),NODE** prev) { NODE* p = NULL; if(list == NULL || key == NULL || compare ==NULL || prev == NULL) { return NULL; } p = list->head; *prev = NULL; while(p) { if(compare(p->data,key) == 1) { return p; } *prev = p; p = p->next; } return NULL; } /* 删除链表结点 */ int node_delete(LIST* list, void* key, int (*compare)(void*, void*)) { NODE* p = NULL, *q = NULL; if(list == NULL || key == NULL || compare == NULL) { return NULL; } p = node_find(list,key,compare,&q); if(p == NULL) { return 0; } if(q == NULL) { list->head = p->next; }else { q->next = p->next; } if(p == list->last) { list->last = q; } free(p->data); free(p); list->length --; return 1; } main.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "list1.h" struct STU { char sno[5]; char name[20]; char sex[6]; int age; }student[3]= { {"0001","zhan san","man",21}, {"0002","li shi","man",22}, {"0003","wang wu","woman",25} }; int compare_by_name(void* info, void* key) { struct STU* student = (struct STU*)info; char* name = (char*)key; return strcmp(student->name,name) == 0 ? 1: 0; } int del_by_sno(void* info, void* key) { struct STU* student = (struct STU*)info; char* sno = (char*)key; return strcmp(student->sno,sno) == 0 ? 1: 0; } int main(int argc, char* argv[]) { int i = 0; LIST* list = NULL; NODE* result = NULL; char name[]="li shi"; char sno[]="0001"; list = list_init(); for(i = 0; i < 3; i++) { node_insert(list,&student[i],sizeof(student[i])); } result = node_find_by_key(list,name,compare_by_name); if(result == NULL) { printf("Not find!/n"); }else { printf("Find!/n"); } if(node_delete(list,sno,del_by_sno)) { printf("delete suscess!/n"); }else { printf("delete fail!/n"); } list_free(list); return 0; }