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