C语言实现单链表

单链表可以说是基础,有利于对指针的使用

结点:

typedef int DataType;
typedef struct SlistNode
{
	DataType data;
	SlistNode* next;
}SListNode;


实现的函数的声明如下:

SListNode* _BuyNode(DataType x);
void PrintSlist(SlistNode* pHead);
void PushBack(SListNode** pHead, DataType x);
void PopBack(SlistNode*& pHead);
void PushFront(SlistNode*& pHead, DataType x);
void PopFront(SlistNode*& pHead);
SlistNode* Find(SlistNode* pHead, DataType x);
void Insert(SlistNode* pos, DataType x);
void Erase(SListNode*& pHead, SlistNode* pos);

具体实现如下:

SListNode* _BuyNode(DataType x)
{
	SlistNode* tmp = (SListNode*)malloc(sizeof(SlistNode));
	tmp->data = x;
	tmp->next = NULL;
	return tmp;
}


void PrintSlist(SlistNode* pHead)
{
	SListNode* cur = pHead;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}


void PushBack(SListNode** pHead, DataType x)
{
	assert(pHead != NULL);
	if (*pHead == NULL)
	{
		*pHead = _BuyNode(x);
	}
	else
	{
		SlistNode* cur = *pHead;
		while (cur->next)
		{
			cur = cur->next;
		}
		SlistNode* tmp = _BuyNode(x);
		cur->next = tmp;
	}
}

void PopBack(SlistNode*& pHead)
{
	if (pHead == NULL)
	{
		return;
	}
	else if (pHead->next == NULL)
	{
		free(pHead);
		pHead = NULL;
	}
	else
	{
		SlistNode* tmp = pHead->next;
		free(pHead);
		pHead = tmp;
	}
}


void PushFront(SlistNode*& pHead, DataType x)
{
	if (pHead == NULL)
	{
		pHead = _BuyNode(x);
	}
	else
	{
		SListNode* tmp = pHead;
		pHead = _BuyNode(x);
		pHead->next = tmp;
	}
}


void PopFront(SlistNode*& pHead)
{
	if (pHead == NULL)
	{
		return;
	}
	else if (pHead->next == NULL)
	{
		free(pHead);
		pHead = NULL;
		return;
	}
	else
	{
		SListNode* tmp = pHead->next;
		free(pHead);
		pHead = tmp;
	}
}


SlistNode*  Find(SlistNode* pHead, DataType x)
{
	SlistNode* cur = pHead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}


void Insert(SlistNode* pos, DataType x)
{
	assert(pos);
	SListNode* next = pos->next;
	SlistNode* tmp = _BuyNode(x);
	pos->next = tmp;
	tmp->next = next;
}


void Erase(SListNode*& pHead, SlistNode* pos)//删除的时候判断:1、删除的是否为头结点2.删除的不是头结点
{
	assert(pHead);
	assert(pos);
	if (pHead == pos)
	{
		PopFront(pHead);
	}
	else
	{
		SListNode* cur = pHead;
		SListNode* prev = pHead;
		while (cur)
		{
			prev = cur;
			cur = cur->next;//上面已经保证cur!=NULL
			if (cur == pos)
			{
				SlistNode* next = cur->next;//因为上面已经保证pos不为NULL
				prev->next = next;
				free(cur);
				return;//Y一定要记得这句话
			}
		}
	}
	
}

测试用例:

只写Erase的测试用例

void Test()
{
	SListNode* list1 = NULL;
	PushBack(&list1, 1);
	PushBack(&list1, 2);
	PushBack(&list1, 3);
	PushBack(&list1, 4);
	PushBack(&list1, 5);
	PrintSlist(list1);
	Erase(list1, list1->next);
	PrintSlist(list1);
	Erase(list1, list1->next);
	PrintSlist(list1);
	Erase(list1, list1->next);
	PrintSlist(list1);
	Erase(list1, list1->next);
	PrintSlist(list1);
	Erase(list1, list1);
	PrintSlist(list1);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值