头文件
#include"stdio.h"
#include"assert.h"
#include"windows.h"
#ifndef _LINKLIST_H__
#define _LINKLIST_H__
typedef int DataType;
typedef struct SListNode
{
DataType _data;
struct SListNode* _pNext;
}Node, *PNode;
PNode BuySListNode(DataType data);
void SListPushBack(PNode*ppHead, DataType data);
void SListPopBack(PNode* ppHead);
void SListPushFront(PNode*ppHead, DataType data);
void SListPopFront(PNode* ppHead);
PNode Find(PNode pHead, DataType data);
void SListInsert(PNode* ppHead, PNode pos, DataType data);
void SListErase(PNode* ppHead, PNode pos);
size_t Size(PNode pHead);
size_t Empty(PNode pHead);
void SListDestroy(PNode* ppHead);
void SListPrint(PNode pHead);
函数实现
#include"linklist.h"
typedef struct SListNode
{
DataType _data;
struct SListNode* _pNext;
}Node, *PNode;
PNode BuySListNode(DataType data)
{
PNode node = (PNode*)malloc(sizeof(node));
node->_data = data;
node->_pNext = NULL;
return node;
}
void SListPushBack(PNode*ppHead, DataType data)
{
assert(ppHead);
if (*ppHead==NULL)
{
BuySListNode(data);
}
else
{
PNode pcur = *ppHead;
while (pcur->_pNext)
{
pcur = pcur->_pNext;
}
pcur->_pNext = BuySListNode(data);
}
}
void SListPopBack(PNode* ppHead)
{
assert(ppHead);
PNode prev = NULL;
PNode pcur = *ppHead;
if (ppHead == NULL)
{
printf("单链表已空\n");
return;
}
else if (pcur->_pNext == NULL)
{
free(pcur);
pcur = NULL;
}
else
{
while (pcur->_pNext)
{
prev = pcur;
pcur = pcur->_pNext;
}
prev->_pNext = NULL;
free(pcur);
pcur = NULL;
}
}
void SListPushFront(PNode*ppHead, DataType data)
{
assert(ppHead);
PNode newnode=BuySListNode(data);
newnode->_pNext = *ppHead;
}
void SListPopFront(PNode* ppHead)
{
assert(ppHead);
while (ppHead == NULL)
{
printf("单链表已空\n");
return;
}
PNode pdel = *ppHead;
*ppHead = (*ppHead)->_pNext;
free(pdel);
}
PNode Find(PNode pHead, DataType data)
{
assert(pHead);
PNode pcur = pHead;
while (pcur)
{
if (pcur->_data == data)
{
return pcur;
}
pcur = pcur->_pNext;
}
return 0;
}
void SListInsert(PNode* ppHead, PNode pos, DataType data)
{
assert(ppHead);
PNode pcur = *ppHead;
PNode newnode = (DataType*)malloc(sizeof(DataType));
if (pos == pcur)
{
SListPushFront(ppHead, data);
}
else if (pcur->_pNext!=pos)
{
pcur = pcur->_pNext;
}
else
{
pcur->_pNext = newnode;
newnode->_pNext = pos;
}
}
void SListErase(PNode* ppHead, PNode pos)
{
assert(ppHead);
PNode pdel = *ppHead;
PNode prev = NULL;
if (Empty(ppHead))
{
printf("已为空");
return;
}
if (pos==ppHead)
{
SListPopFront(ppHead);
}
else
{
while (pdel)
{
if (pdel->_pNext == pos)
{
prev = pdel;
prev->_pNext = pos->_pNext;
free(pos);
}
else
{
pdel = pdel->_pNext;
}
}
}
}
size_t Size(PNode pHead)
{
assert(pHead);
int size = 0;
PNode pcur = pHead;
while (pcur)
{
pcur = pcur->_pNext;
size++;
}
return 0;
}
size_t Empty(PNode pHead)
{
assert(pHead);
if (pHead == NULL)
{
return 1;
}
else
return 0;
}
void SListDestroy(PNode* ppHead)
{
assert(ppHead);
PNode prev = NULL;
PNode pcur = *ppHead;
while (pcur)
{
prev = pcur;
pcur = pcur->_pNext;
free(prev);
}
*ppHead = NULL;
}
void SListDestroy2(PNode* ppHead)
{
assert(ppHead);
if (*ppHead)
{
SListDestroy2((*ppHead)->_pNext);
free(ppHead);
}
*ppHead = NULL;
}
void SListPrint(PNode pHead)
{
assert(pHead);
PNode pcur = pHead;
while (pcur)
{
printf("%d ", pcur->_data);
pcur = pcur->_pNext;
}
return 0;
}