C语言实现单链表的简单操作【完整版】

#ifndef __LIST__H_
#define __LIST__H_


typedef int  DataType;
typedef unsigned int size_t;

typedef struct Node
{
	DataType _data;
    struct Node *_pNext;
}Node, *PNode;

void InitList(PNode* pHead);
void PushBack(PNode* pHead, DataType data);
Node* BuyNode(DataType data);
void PopBack(PNode* pHead);
void PushFront(PNode* pHead, DataType data);
void PopFront(PNode* pHead);
Node* Find(PNode pHead, DataType data);
void Insert(PNode pos, DataType data);
void Erase(PNode* pHead, PNode pos);
void Remove(PNode* pHead, DataType data);
void RemoveAll(PNode* pHead, DataType data);
size_t Size(PNode pHead);
int Empty(PNode pHead);
PNode Back(PNode pHead);
void PrintList(PNode pHead);
void PrintFromTail2Head(PNode pHead);


#endif

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

Node* BuyNode(DataType data)   //获取一个新节点
{
	PNode PTemp = (PNode)malloc(sizeof(Node));
	if (NULL == PTemp)
	{
		exit(0);
	}
		PTemp ->_data = data;
		PTemp ->_pNext = NULL;
		return PTemp;
	
}

void InitList(PNode* pHead)  //初始化链表
{
	assert(pHead);
	(*pHead) = NULL; 
}

void PushBack(PNode* pHead, DataType data)  //头删
{
	PNode pTail = NULL;
	assert(pHead);
	if ((*pHead) == NULL)
		(*pHead) = BuyNode(data);
	else
	{
		pTail = (*pHead);
		while (pTail ->_pNext)
		{
			pTail = pTail ->_pNext;
		}
		pTail ->_pNext = BuyNode(data);
	}
}

void PopBack(PNode* pHead)  //尾删
{
	PNode pTail = NULL;
	assert(pHead);
	if  (NULL == (*pHead))
	{
		return;
	}
	else if (NULL == (*pHead)->_pNext)
	{
		free(*pHead);
		(*pHead) = NULL;
	}
	else
	{
		PNode pPre = NULL;
		pTail = (*pHead);
		while (pTail ->_pNext ->_pNext)
		{
			pTail = pTail ->_pNext;
		}
		free(pTail ->_pNext);
		pTail ->_pNext = NULL;
	}
}

void PushFront(PNode* pHead, DataType data)  //头插
{
	assert(pHead);
	if (NULL == (*pHead))
	{
		(*pHead) = BuyNode(data);
	}
	else
	{
		PNode pTemp = BuyNode(data);
		pTemp ->_pNext = (*pHead);
		(*pHead) = pTemp;
	}
}

void PopFront(PNode* pHead)  //尾删
{
	assert(pHead);
	if (NULL == (*pHead))
	{
		return;
	}
	else if (NULL == (*pHead) ->_pNext)
	{
		free(*pHead);
		(*pHead) = NULL;
	}
	else 
	{
		PNode pTemp = (*pHead);
		(*pHead) = (*pHead) ->_pNext;
		free(pTemp);
		pTemp = NULL;
	}

}

Node* Find(PNode pHead, DataType data)   //查找值为data的第一个节点
{
	PNode pTemp = NULL;
	pTemp = pHead;
	while (pTemp)
	{
		if (pTemp ->_data == data)
			return pTemp;
		pTemp = pTemp ->_pNext;
	}
	return NULL;
}

void Insert(PNode pos, DataType data)  //pos位置添加值为data的节点
{
	PNode pTemp = NULL;
	if (NULL == pos)
		return ;
	pTemp = BuyNode(data);
	pTemp ->_pNext = pos->_pNext;
	pos ->_pNext = pTemp;
}

void Erase(PNode* pHead, PNode pos)   //移除pos位置的节点
{
	assert(pHead);
	if (NULL == pos)
		return;
	if ((*pHead) == pos)
	{
		PopFront(pHead);
	}
	else if (NULL == (pos->_pNext))
	{
		PopBack(pHead);
	}
 	else  //这里并使用没有遍历,把后一个节点的值赋给pos,用pos指向pos->_pNext->_pNext
	{
		pos->_data = pos->_pNext->_data;
		pos->_pNext = pos->_pNext->_pNext;
	}
}

void Remove(PNode* pHead, DataType data) //移除单链表中第一个值为data的节点
{
	PNode pTemp = NULL;
	assert(pHead);
	pTemp = Find(*pHead, data);
	Erase(pHead, pTemp);
}

void RemoveAll(PNode* pHead, DataType data)  //删除所有值为data的节点
{
	PNode pTemp = NULL;
	assert(pHead);
    while (pTemp = Find(*pHead, data))
		Erase(pHead, pTemp);	
}

size_t Size(PNode pHead) //单链表节点个数
{
	size_t size = 0;
	PNode pTemp = pHead;
	while (pTemp)
	{
		size++;
		pTemp = pTemp ->_pNext;
	}
	return size;
}

int Empty(PNode pHead) //判空
{
	return (NULL == pHead);
}

PNode Back(PNode pHead)  //返回尾节点
{
	PNode pTail = pHead;
	if (Empty(pHead))
		return NULL;
	while (pTail ->_pNext)
	{
		pTail = pTail ->_pNext;
	}
	return pTail;
}

PNode Front(PNode pHead)  //返回头节点
{
	return pHead;
}

void PrintList(PNode pHead)  //顺序打印单链表
{
	PNode pTemp = pHead;
	while (pTemp)
	{
		printf("%d->",pTemp->_data);
		pTemp = pTemp->_pNext;
	}
	printf("NULL\n");
	
}

void PrintFromTail2Head(PNode pHead)   //倒序打印单链表(用递归实现)
{
	PNode pTemp = pHead;
	if (NULL== pTemp)
	{
		printf("NULL");
		return ;
	}
	PrintFromTail2Head(pTemp->_pNext);
	printf("->%d",pTemp->_data);

}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏尔肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值