【C语言】单链表

SList.h

#pragma once

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

typedef int DataType;

typedef struct ListNode
{
	DataType data;
	struct ListNode *pNext;
}SListNode, *PSListNode;

//初始化单链表(对于无头结点单链表,该函数没有意义)
void InitList(PSListNode* pHead);

// 销毁单链表
void DestroyList(PSListNode* pHead);

// 尾插
void PushBack(PSListNode* pHead, DataType data);

// 尾出
void PopBack(PSListNode* pHead);

// 头插
void PushFront(PSListNode* pHead, DataType data);

// 头出
void PopFront(PSListNode* pHead);

// 查找元素data
PSListNode Find(PSListNode pHead, DataType data);

// 删除pos位置的结点
void  Erase(PSListNode* pHead, PSListNode pos);

// 在链表的pos位置插入元素data
void  Insert(PSListNode* pHead, PSListNode pos, DataType data);

//打印
void PrintList(PSListNode pHead);

SList.c

#include "SList.h"

//初始化
void InitList(PSListNode* pHead)
{
	*pHead = NULL;
}

//打印
void PrintList(PSListNode pHead)
{
	PSListNode pCurNode = pHead;
	while(pCurNode)
	{
		printf("%d->", pCurNode->data);
		pCurNode = pCurNode->pNext;
	}
	printf("NULL\n");
}

PSListNode BuyNode(DataType data)
{
	PSListNode pTemp = (PSListNode)malloc(sizeof(SListNode));
	if(NULL == pTemp)
	{
		return NULL;
	}
	pTemp->data = data;
	pTemp->pNext = NULL;
	return pTemp;
}

//尾插
void PushBack(PSListNode* pHead, DataType data)
{
	PSListNode pNode = *pHead;
	if (NULL == *pHead)//当链表是空链表时
	{
		*pHead = BuyNode(data);
	}
	else
	{
		while(pNode->pNext)
		{
			pNode = pNode->pNext;
		}

		pNode->pNext = BuyNode(data);
	}
}

// 尾出
void PopBack(PSListNode* pHead)
{
	PSListNode pCurNode = *pHead;//当前结点
	PSListNode pPreNode = pCurNode;//前一个结点
	assert(pHead);
	if(NULL == *pHead)
	{
		return;
	}
	else if((*pHead)->pNext == NULL)//只有一个结点的情况
	{
		free(*pHead);
		*pHead = NULL;
		return;
	}
	while (pCurNode->pNext)//找尾
	{
		pPreNode = pCurNode;
		pCurNode = pPreNode->pNext;
	}

	free(pCurNode);
	pPreNode->pNext = NULL;
}

//头插
void PushFront(PSListNode* pHead, DataType data)
{
	PSListNode pNewNode = NULL;
	assert(pHead);
	if(NULL == *pHead)
	{
		return;
	}
	pNewNode = BuyNode(data);
	if(pNewNode != NULL)
	{
		pNewNode->pNext = *pHead;
		*pHead = pNewNode;
	}
}

// 头出
void PopFront(PSListNode* pHead)
{
	PSListNode pCurNode = *pHead;
	assert(pHead);
	if(NULL == *pHead)
	{
		return;
	}
	*pHead = pCurNode->pNext;
	free(pCurNode);
}

// 查找元素data
PSListNode Find(PSListNode pHead, DataType data)
{
	PSListNode pCurNode = pHead;
	while(pCurNode)
	{
		if(data == pCurNode->data)
		{
			return pCurNode;
		}
		pCurNode = pCurNode->pNext;
	}
	return NULL;
}

// 删除pos位置的结点
void  Erase(PSListNode* pHead, PSListNode pos)
{
	PSListNode pPreNode = *pHead;
	assert(pHead);
	assert(pos);
	if(NULL == *pHead)
	{
		return;
	}
	if(pos == *pHead)//如果pos是头结点
	{
		*pHead =pos->pNext;
		free(pos);
		return;
	}
	while (pPreNode)
	{
		if(pPreNode->pNext == pos)
		{
			pPreNode->pNext = pos->pNext;
			free(pos);
			return;
		}
		pPreNode = pPreNode->pNext;
	}
}

// 在链表的pos位置插入元素data
void  Insert(PSListNode* pHead, PSListNode pos, DataType data)
{
	PSListNode pNewNode = NULL;
	assert(pHead);
	assert(pos);
	if(NULL == *pHead)
	{
		return;
	}
	pNewNode = BuyNode(data);
	if(NULL != pNewNode)
	{
		pNewNode->pNext = pos->pNext;
		pos->pNext = pNewNode;
	}
}

//销毁
void DestroyList(PSListNode* pHead)
{
	PSListNode pPreNode = NULL;
	PSListNode pCurNode = NULL;
	assert(pHead);
	pCurNode = *pHead;
	while (pCurNode)
	{
		pPreNode = pCurNode;
		pCurNode = pCurNode->pNext;
		free(pPreNode);
	}
	*pHead =NULL;
}


你可能感兴趣的:(链表,C语言)