#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);
}