c语言单向链表(方式一)

头文件

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值