数据结构_链表操作

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

typedef int DataType;

typedef struct SListNode
{
	struct SListNode *pNext;//指向下一空间的地址
	DataType data;
} SListNode;


SListNode *__CreatNewNode(DataType data);//申请空间存放新链表
void SListNodePrint(SListNode **ppfirst);//打印
void SListInit(SListNode **ppfirst);//初始化
void SListPushBack(SListNode **ppfirst, DataType data);//尾插
void SListPushFront(SListNode **ppfirst, DataType data);//头插
void SListPopBack(SListNode **ppfirst);//尾删
void SListPopFront(SListNode **ppfirst);//头删
SListNode *SListFind(SListNode *ppfirst, DataType data);//依照数据找结点
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 SListDestroy(SListNode **ppfirst);//销毁
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 SListInit(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);
		*ppfirst = NULL;
		return;
	}

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

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

void SListPopFront(SListNode **ppfirst)//头删
{
	SListNode *pDel;

	if (*ppfirst == NULL)
		return;

	pDel = *ppfirst;
	*ppfirst = pDel->pNext;
	free(pDel);
}

SListNode *SListFind(SListNode *ppfirst, DataType data)//依照数据找结点
{
	SListNode *pNode;
	assert(ppfirst);

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

void SListInsert(SListNode **ppfirst, SListNode *pos, DataType data)//按给定结点插入
{
	SListNode *pNewNode = __CreatNewNode(data);
	SListNode *pNode;
	assert(*ppfirst);

	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)//给定结点删除
{
	SListNode *pNode;

	if (*ppfirst == pos)
	{
		SListPopFront(ppfirst);
		return;
	}

	for (pNode = *ppfirst; pNode->pNext != pos; pNode = pNode->pNext)
	{
	}

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

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

	SListErase(ppfirst, pNode);
}

void SListremoveAll(SListNode **ppfirst, DataType data)//按值删所有
{
	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 (pNode->data == data)
	{
		*ppfirst = pNode->pNext;
		free(pNode);
	}
}

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


猜你喜欢

转载自blog.csdn.net/yikaozhudapao/article/details/80930450
今日推荐