数据结构_单链表基本操作

在开始前,我先介绍两个函数:malloc()、assert()。

malloc()函数:它是一个参数为size_t(unsigned int)类型返回值为空指针类型的函数,参数size则表示要申请的字节数。

 

 

assert()函数:它是一个参数为int类型且无返回值的断言函数,其参数expression表示返回表达式的真假结果,如果表达式为假,则打印诊断结果并中止程序。

 

关于单链表的一些基本操作,包括头插,尾插,头删,尾删等等

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>

typedef int DataType;    

typedef struct SListNode
{
	DataType data;
	struct SListNode *pNext;
} SListNode;


//申请新空间
SListNode *__CreatNewNode(DataType data)
{
	SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));
	assert(pNewNode);

	pNewNode->data = data;
	pNewNode->pNext = NULL;

	return pNewNode;
}


//打印函数
void SListNodePrint(SListNode **ppfirst)
{
	SListNode *pNode;
	for (pNode = *ppfirst; pNode != NULL; pNode = pNode->pNext)
	{
		printf("%d -> ", pNode->data);
	}
	printf("NULL\n");
}

void SListPushBack(SListNode **ppfirst, DataType data);  //尾插
void SListPushFront(SListNode **ppfirst, DataType data);  //头插
void SListPopBack(SListNode **ppfirst);  //尾删
void SListPopFront(SListNode **ppfirst);  //头删
void SListInsert(SListNode **ppfirst,SListNode *pos, DataType data);  //中间插
void SListErase(SListNode **ppfirst,SListNode *pos);  //中间删
void SListRemove(SListNode **ppfirst, DataType data);  //按值删
void SListRemoveAll(SListNode **ppfirst, DataType data);  //按值删所有
//初始化
void SListNodeInit(SListNode **ppfirst)
{
	*ppfirst = NULL;
}


//尾插
void SListPushBack(SListNode **ppfirst, DataType data)
{
	SListNode *pNewNode = __CreatNewNode(data);
	SListNode *pNode;
	if (*ppfirst == NULL)
	{
		*ppfirst = pNewNode;
		return;
	}
	for (pNode = *ppfirst; pNode->pNext != NULL; pNode = pNode->pNext)
	{}
	pNode->pNext = pNewNode;
}


//头插
void SListPushFront(SListNode **ppfirst, DataType data)
{
	SListNode *pNewNode = __CreatNewNode(data);
	if (*ppfirst == NULL)
	{
		*ppfirst = pNewNode;
		return;
	}
	pNewNode->pNext = *ppfirst;
	*ppfirst = pNewNode;
}


//尾删
void SListPopBack(SListNode **ppfirst)
{
	SListNode *pNode;
	SListNode *pDel;
	if (*ppfirst == NULL)
	{
		return;
	}

	if ((*ppfirst)->pNext == NULL)
	{
		free(*ppfirst);
		return;
	}
	for (pNode = *ppfirst; pNode->pNext->pNext != NULL; pNode = pNode->pNext)
	{

	}
	pDel = pNode->pNext;
	pNode->pNext = NULL;
	free(pDel);
}


//头删
void SListPopFront(SListNode **ppfirst)
{
	SListNode *pNode;
	if (*ppfirst == NULL)
	{
		return;
	}
	if ((*ppfirst)->pNext == NULL)
	{
		free(*ppfirst);
		return;
	}
	pNode = *ppfirst;
	*ppfirst = pNode->pNext;
	free(pNode);
}


//查找函数
SListNode *Find(SListNode **ppfirst, DataType data)
{
	SListNode *pNode;
	for (pNode = *ppfirst; pNode != NULL; pNode = pNode->pNext)
	{
		if (pNode->data == data)
			return pNode;
	}
	return NULL;
}


//中间插
void SListInsert(SListNode **ppfirst, SListNode *pos, DataType data)
{
	assert(*ppfirst);
	SListNode *pNewNode = __CreatNewNode(data);
	SListNode *pNode;
	if (*ppfirst == NULL)
	{
		*ppfirst = pNewNode;
		return;
	}
	if (*ppfirst == pos)
	{
		SListPushFront(ppfirst,data);
		return;
	}
	for (pNode = *ppfirst; pNode->pNext != pos; pNode = pNode->pNext)
	{

	}
	pNode->pNext = pNewNode;
	pNewNode->pNext = pos;
}

//中间删
void SListErase(SListNode **ppfirst,SListNode *pos)
{
	assert(*ppfirst);
	SListNode *pNode;
	for (pNode = *ppfirst; pNode->pNext != pos; pNode = pNode->pNext)
	{

	}
	pNode->pNext = pos->pNext;
	free(pos);
}



//按值删
void SListRemove(SListNode **ppfirst, DataType data)
{
	assert(*ppfirst);
	SListNode *pNode=Find(ppfirst,data);
	assert(pNode);
	SListErase(ppfirst, pNode);


}


//按值删所有
void SListRemoveAll(SListNode **ppfirst, DataType data)
{
	assert(*ppfirst);
	SListNode *pNode=*ppfirst;
	SListNode *pCmp;
	while (pNode->pNext != NULL)
	{
		pCmp = pNode->pNext;
		if (pCmp->data == data)
		{
			pNode->pNext = pCmp->pNext;
			free(pCmp);
		}
		else
		{
			pNode = pNode->pNext;
		}
	}
	if ((*ppfirst)->data == data)
	{
		pNode = *ppfirst;
		*ppfirst = (*ppfirst)->pNext;
		free(pNode);
	}
}


//销毁
void SListDestroy(SListNode **ppfirst)
{
	assert(*ppfirst);
	SListNode *pNode;
	SListNode  *pN;
	for (pNode = *ppfirst; pNode != NULL;)
	{
		pN = pNode;
		pNode = pNode->pNext;
		free(pN);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值