1.链表的初始化
2.尾插
3.头插
4.尾删
5.头删
6.给定节点删除
7.按值查找
8.按值删除,只删除遇到的第一个
9.按值删除,删除所有
10.销毁
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 值类型
typedef int DataType;
typedef struct SListNode {
DataType data; // 值
struct ListNode *pNext; // 指向下一个结点
} SListNode;
// 初始化
void SListInit(SListNode **ppFirst)
{
assert(ppFirst != NULL);
*ppFirst = NULL;
}
// 尾部插入
void SListPushBack(SListNode** ppFirst, DataType data)
{
SListNode *newNode = (SListNode*)malloc(sizeof(SListNode));
assert(newNode);
newNode->data = data;
newNode->pNext= NULL;
if (*ppFirst == NULL)
{
*ppFirst = newNode;
return;
}
SListNode *cur = *ppFirst;
while (cur->pNext != NULL)
{
cur = cur->pNext;
}
cur->pNext = newNode;
}
// 头部插入
void SListPushFront(SListNode **ppFirst, DataType data)
{
assert(ppFirst != NULL);
//特殊情况,链表为空,*ppFirst==NULL:
SListNode * newNode = (SListNode *)malloc(sizeof(SListNode));
assert(newNode);
newNode->data = data;
newNode->pNext = NULL;
newNode->pNext = *ppFirst;
*ppFirst = newNode;
}
// 尾部删除
void SListPopBack(SListNode **ppFirst)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
if ((*ppFirst)->pNext == NULL)
{
free(*ppFirst);
*ppFirst = NULL;
return;
}
SListNode *del;
SListNode *cur = *ppFirst;
while (cur->pNext != NULL)
{
cur = cur->pNext;
}
del = cur->pNext;
cur->pNext = NULL;
free(del);
}
// 头部删除
void SListPopFront(SListNode **ppFirst)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
SListNode *del = *ppFirst;
*ppFirst = (*ppFirst)->pNext;
free(del);
}
// 给定结点插入,插入到结点前
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
assert(ppFirst != NULL);
SListNode * newNode = (SListNode *)malloc(sizeof(SListNode));
assert(newNode);
newNode->data = data;
newNode->pNext = pPos;
if (*ppFirst == pPos)
{
SListPushFront(*ppFirst, data);
return;
}
while ((*ppFirst)->pNext == pPos)
{
*ppFirst = (*ppFirst)->pNext;
}
(*ppFirst)->pNext = newNode;
free(newNode);
}
// 给定结点删除
void SListErase(SListNode **ppFirst, SListNode *pPos)
{
if (*ppFirst == pPos)
{
ListPopFront(ppFirst);
return;
}
SListNode *cur = *ppFirst;
while (cur->pNext != pPos)
{
cur = cur->pNext;
}
cur->pNext = pPos->pNext;
free(pPos);
}
// 按值删除,只删遇到的第一个
void SListRemove(SListNode **ppFirst, DataType data)
{
SListNode *pPos;
assert(ppFirst != NULL);
pPos = SListFind(*ppFirst, data);
if (pPos == NULL)
{
printf("不存在\n");
}
else
{
SListErase(ppFirst, pPos);
}
}
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
int SListFind(SListNode *pFirst, DataType data)
{
for (SListNode *cur = pFirst; cur != NULL; cur = cur->pNext)
{
if (data == cur->data)
{
return cur;
}
}
return NULL;
}
// 按值删除,删除所有的
void SListRemoveAll(SListNode **ppFirst, DataType data)
{
SListNode *pPos, *x;
assert(ppFirst != NULL);
x = SListFind(*ppFirst, data);
if (x == NULL)
{
printf("要删除的节点为空\n");
}
else
{
for (pPos = *ppFirst; pPos != NULL; pPos = pPos->pNext)
{
if (pPos->data == data)
{
SListErase(ppFirst, pPos);
}
}
}
}
// 销毁
void SListDestroy(SListNode **ppFirst)
{
SListNode *y;
SListNode *cur = *ppFirst;
for (SListNode *cur = ppFirst; cur != NULL; cur = y)
{
y = cur->pNext;
free(cur);
}
*ppFirst = NULL;
}