FLinkList.h头文件:
#ifndef _FLINKLIST_H_ #define _FLINKLIST_H_ typedef void LinkList; //利用void指针来接受任意类型的数据 typedef struct _tag_LinkListNode FLinkListNode; struct _tag_LinkListNode { FLinkListNode* next; } LinkList* LinkList_Create(); void LinkList_Destroy(LinkList* list); void LinkList_Clear(LinkList* list); int LinkList_Length(LinkList* list); int LinkList_Insert(LinkList* list, LinkListNode* node, int pos); LinkListNode* LinkList_Get(LinkList* list, int pos); LinkListNode* LinkList_Delete(LinkList* list, int pos); #endif
FLinkList.c实现:
#include <stdio.h> #include <malloc.h> #include "FLinkList.h" typedef struct _tag_LinkList { FLinkListNode header; int length; }FLinkList; FLinkList* LinkList_Create() { FLinkList* ret=(FLinkList*)malloc(sizeof(FLinkList)); if(ret!=NULL) { ret->length=0; ret->header.next=NULL; } } void LinkList_Destroy(LinkList* list) { free(list); } void LinkList_Clear(LinkList* list) { FLinkList* ret=(FLinkList*)list; if(ret!=NULL) { ret->length=0; ret->header.next=NULL; } } int LinkList_Length(LinkList* list) { FLinkList* flist=(FLinkList*)list; int ret=-1; if(ret!=NULL) { return flist->length; } return ret; } int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) { FLinkList* flist=(FLinkList*)list; int ret=((flist!=NULL)&&(pos>=0)&& (node!=NULL)); int i=0; if(ret) { FLinkListNode* current=(FLinkListNode*)flist; for(;(i<pos)&&(current->next!=NULL);i++) { current=current->next; } node->next=current->next; current->next=node; flist->length++; } return ret; } LinkListNode* LinkList_Get(LinkList* list, int pos) { FLinkList* flist=(FLinkList*)list; FLinkListNode* ret=NULL; int i=0; if((flist!=NULL)&&(pos>=0)&& (pos<=flist->length)) { FLinkListNode* current=(FLinkListNode*) flist; for(;(i<pos);i++) { current=current->next; } ret=current->next; } return ret; } LinkListNode* LinkList_Delete(LinkList* list, int pos) { FLinkList* flist=(FLinkList*)list; FLinkListNode* ret=NULL; int i=0; if((flist!=NULL)&&(pos>=0)&& (pos<=flist->length)) { FLinkListNode* current=(FLinkListNode*) flist; for(;(i<pos);i++) { current=current->next; } ret=current->next; current->next=ret->next; flist->length--; } return ret; }
链表功能检测:
#include <stdio.h> #include <stdlib.h> #include "LinkList.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct Value { LinkListNode header; int v; }; int main(int argc, char *argv[]) { int i = 0; LinkList* list = LinkList_Create(); struct Value v1; struct Value v2; struct Value v3; struct Value v4; struct Value v5; v1.v = 1; v2.v = 2; v3.v = 3; v4.v = 4; v5.v = 5; LinkList_Insert(list, (LinkListNode*)&v1, LinkList_Length(list)); LinkList_Insert(list, (LinkListNode*)&v2, LinkList_Length(list)); LinkList_Insert(list, (LinkListNode*)&v3, LinkList_Length(list)); LinkList_Insert(list, (LinkListNode*)&v4, LinkList_Length(list)); LinkList_Insert(list, (LinkListNode*)&v5, LinkList_Length(list)); for(i=0; i<LinkList_Length(list); i++) { struct Value* pv = (struct Value*)LinkList_Get(list, i); printf("%d\n", pv->v); } while( LinkList_Length(list) > 0 ) { struct Value* pv = (struct Value*)LinkList_Delete(list, 0); printf("%d\n", pv->v); } LinkList_Destroy(list); return 0; }