- list.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 *InitList();
- int InsertList(LIST *l,void *data,int size);
- NODE * FindNodeByKey(LIST *l,void *key,int (*compare)(void *,void *));
- #endif
- list.c 链表的实现
- --------------------------------------
- NODE * FindNodeByKey(LIST *l,void *key,int (*compare)(void *,void *)) //函数指针
- {
- NODE *p=NULL;
- if(l==NULL||key==NULL||compare==NULL)
- return NULL;
- p=l->head;
- while(p)
- {
- if(compare(p->data,key)==1)
- return p;
- p=p->next;
- }
- return NULL;
- }
为了通用性,我们将查找的一些条件condition信息放在应用层,给链表只是传递一个函数指针就OK.
主要是考虑到大型系统数据量大,链表中可能存放不同类型的数据。
链表实际上就是一个内存数据库,并且我们给赋予了一些操作。
应用层:client端
- //为了通用性,比较就由应用层来决定
- int CompareByName(void *info,void *key) //仔细体会无类型参数的好处:为了通用性
- {
- struct STU *stu=(struct STU *)info; //将传进来的数据域强制转换成我们的数据类型
- char *name=(char *)key;
- return strcmp(stu->name,name)==0 ? 1:0;
- }
- int CompareBySno(void *info,void *key)
- {
- struct STU *stu=(struct STU *)info;
- char *sno=(char *)key;
- return strcmp(stu->sno,sno)==0 ? 1:0;
- }
main函数的调用:
- void main()
- {
- int i;
- NODE *res=NULL; //定义临时的指针来存放返回的结果
- char name[]="wang wu",sno[]="S101";
- LIST *list=InitList();
- for(i=0;i<3;i++)
- InsertList(list,&s[i],sizeof(s[i]));
-
-
- res=FindNodeByKey(list,name,CompareByName); //函数名称就代表了这个函数的首地址
- if(res==NULL) //函数参数传递错误或者是没找到
- printf("Not Find!\n");
- else
- printf("Find!\n");
- if(DeleteListByKey(list,sno,CompareBySno))
- printf("delete success!\n");
- else
- printf("delete fail!\n");
-
- }
阅读(827) | 评论(0) | 转发(0) |