头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
void*Init_LinkList();
void Insert_LinkList(void* list,int pos, void* data);
void RemoveByPos_LinkList(void* list, int pos);
void RemoveByVal_LinkList(void* list, void* data, int(*compare)(void*, void*));
void Foreach_LinkList(void* list, void(*_callback)(void*));
int Size_LinkList(void* list);
void Clear_LinkList(void* list);
void Destroy_LinkList(void* list);
代码
#include "LinkList.h"
struct LinkNode
{
void* data;
struct LinkNode* next;
};
struct LinkList
{
struct LinkNode header;
int size;
};
typedef struct LinkList sl;
typedef struct LinkNode sn;
void* Init_LinkList()
{
sl* mylist = malloc(sizeof(sl));
if(!mylist)
return NULL;
mylist->header.data = NULL;
mylist->header.next = NULL;
mylist->size = 0;
return mylist;
}
void Insert_LinkList(void* list,int pos, void* data)
{
if (!list || !data)
return;
sl * mylist= (sl*)list;
if (pos<0 || pos>mylist->size-1)
pos = mylist->size;
sn* pCurrent = &mylist->header;
for (int i = 0; i < pos; ++i)
{
pCurrent = pCurrent->next;
}
sn* newlist =(sn*)malloc(sizeof(sn));
newlist->next = pCurrent->next;
newlist->data = data;
pCurrent->next = newlist;
mylist->size++;
}
void RemoveByPos_LinkList(void* list, int pos)
{
if (!list)
return;
sl* mylist = (sl*)list;
if (pos<0 || pos>mylist->size-1)
return;
sn* pCurrent =& mylist->header;
for (int i = 0; i < pos; ++i)
{
pCurrent = pCurrent->next;
}
sn* pDel = pCurrent->next;
pCurrent->next = pDel->next;
free(pDel);
pDel = NULL;
mylist->size--;
}
void RemoveByVal_LinkList(void* list, void* data, int(*compare)(void*, void*))
{
if (list || !data || !compare)
return;
sl* mylist = (sl*)list;
sn* pCurrent = &mylist->header;
sn* pNext =mylist->header.next;
while(pNext)
{
if (!compare(data, pNext->data))
{
pCurrent->next = pNext->next;
free(pNext);
pNext = NULL;
mylist->size--;
break;
}
pCurrent = pNext;
pNext=pNext->next;
}
}
void Foreach_LinkList(void* list, void(*_callback)(void*))
{
if (!list || !_callback)
return ;
sl* newlist = (sl*)list;
sn* pCurrent = newlist->header.next;
while(pCurrent)
{
_callback(pCurrent->data);
pCurrent = pCurrent->next;
}
}
int Size_LinkList(void* list)
{
if (!list)
return -1;
sl* newlist = (sl*)list;
return newlist->size;
}
void Clear_LinkList(void* list)
{
if (!list)
return;
sl* mylist = (sl*)list;
sn* pCurrent = mylist->header.next;
while(pCurrent)
{
sn* newlink = pCurrent->next;
free(pCurrent);
pCurrent = newlink;
}
mylist->header.next = NULL;
mylist->size = 0;
}
void Destroy_LinkList(void* list)
{
Clear_LinkList(list);
free(list);
list = NULL;
}