链表
链表的分类及存储方式
单链表
双链表
双向循环链表
创建一个单链表
//不是链表的结构体
//链表中一个节点的结构体
typedef struct SListNode {
DataType data; // 值
struct SListNode *Next; // 指向下一个结点
} SListNode;
链表要实现的功能
// 初始化 ,构造一条空的链表
void SListInit(SListNode **ppFirst);
//打印链表
void SListInit(SListNode **ppFirst);
// 尾部插入
void SListPushBack(SListNode** ppFirst, DataType data);
// 头部插入
void SListPushFront(SListNode **ppFirst, DataType data);
// 尾部删除
void SListPopBack(SListNode **ppFirst);
// 头部删除
void SListPopFront(SListNode **ppFirst);
// 给定结点插入,插入到结点前
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data);
// 给定结点删除
void SListErase(SListNode **ppFirst, SListNode *pPos);
// 按值删除,只删遇到的第一个
void SListRemove(SListNode **ppFirst, DataType data);
// 按值删除,删除所有的
void SListRemoveAll(SListNode **ppFirst, DataType data);
// 销毁 ,需要销毁每一个节点
void SListDestroy(SListNode **ppFirst);
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
int SListFind(SListNode *pFirst, DataType data);
链表的各种功能具体实现
链表的初始化
void SListInit(SListNode **ppFirst)//初始化
{
assert(ppFirst != NULL);
*ppFirst = NULL;
}
打印链表
//打印链表
void SListPrint(SListNode *First)
{
for (SListNode*cur = First; cur != NULL; cur = cur->Next)
{
printf("%d-->", cur->data);
}
printf("\n");
return 0;
}
尾插
//申请新节点
static SListNode* CreateNode(DataType data)
{
SListNode*node = (SListNode*)malloc(sizeof(SListNode));
node->data = data;
node->Next = NULL;
return node;
}
// 尾部插入
void SListPushBack(SListNode** ppFirst, DataType data)
{
assert(ppFirst != NULL);
SListNode *node = CreateNode(data);
if (*ppFirst == NULL)//判断链表不为空
{
*ppFirst = node;
return;
}
//找链表中的最后一个节点
SListNode* cur = *ppFirst;
while (cur->Next != NULL)
{
cur = cur->Next;
}
cur->Next = node;//插入新申请的节点
}
头插
void SListPushFront(SListNode **ppFirst, DataType data)
{
assert(ppFirst != NULL);
SListNode *node = CreateNode(data);
node->Next = *ppFirst;
*ppFirst = node;
}
尾删
// 尾部删除
void SListPopBack(SListNode **ppFirst)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
if ((*ppFirst)->Next == NULL)
{
free(*ppFirst);
*ppFirst = NULL;
return;
}
SListNode*cur = *ppFirst;
while (cur->Next->Next != NULL)
{
cur = cur->Next;
}
free(cur->Next);
cur->Next = NULL;
}
头删
// 头部删除
void SListPopFront(SListNode **ppFirst)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);//链表不是空链表
SListNode *first = *ppFirst;
*ppFirst = (*ppFirst)->Next;
free(first);
}
给定结点插入,插入到结点前
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
assert(ppFirst != NULL);
if (*ppFirst == pPos)
{
SListPushFront(ppFirst, data);
return;
}
SListNode*newNode = CreateNode(data);
SListNode*cur;
//找到pos前的一个节点
for (cur = *ppFirst; cur->Next != pPos; cur = cur->Next){ }
//改变的是字段内的值,而不是指针的值
cur->Next = newNode;
newNode->Next = pPos;
}
给定结点删除
// 给定结点删除
void SListErase(SListNode **ppFirst, SListNode *pPos)
{
if (*ppFirst == pPos)
{
SListPopFront(ppFirst);
return;
}
SListNode *cur = *ppFirst;
while (cur->Next != pPos)
{
cur = cur->Next;
}
cur->Next = pPos->Next;
free(pPos);
}
按值删除,只删遇到的第一个
// 按值删除,只删遇到的第一个
void SListRemove(SListNode **ppFirst, DataType data)
{
SListNode *cur = *ppFirst;
SListNode *prev = NULL;
assert(ppFirst != NULL);
if (*ppFirst == NULL)
return;
while (cur)
{
if (cur->data == data)
{
//删除
//1.删除的是第一个节点
if (*ppFirst == cur)
{
*ppFirst = cur->Next;
free(cur);
cur = NULL;
}
else//删除中间节点
{
prev->Next = cur->Next;
free(cur);
cur = NULL;
}
break;
}
prev = cur;
cur = cur->Next;
}
}
按值删除,删除所有的
// 按值删除,删除所有的
void SListRemoveAll(SListNode **ppFirst, DataType data)
{
SListNode *cur = NULL;
SListNode *prev = NULL;
assert(ppFirst != NULL);
if (*ppFirst == NULL)
return;
cur = *ppFirst;
while (cur)
{
if (cur->data == data)
{
//删除
//1.删除的是第一个节点
if (*ppFirst == cur)
{
*ppFirst = cur->Next;
free(cur);
cur = *ppFirst;
}
else//删除中间节点
{
prev->Next = cur->Next;
free(cur);
cur = prev;
}
}
prev = cur;
cur = cur->Next;
}
}
销毁 ,需要销毁每一个节点
// 销毁 ,需要销毁每一个节点
void SListDestroy(SListNode **ppFirst)
{
SListNode*cur = NULL;
SListNode*del = NULL;
assert(ppFirst);
cur = *ppFirst;
while (cur)
{
del = cur;
cur = cur->Next;
free(del);
del = NULL;
}
*ppFirst = NULL;
}
按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
SListNode * SListFind(SListNode *pFirst, DataType data)
{
for (SListNode *cur = pFirst; cur != NULL; cur = cur->Next)
{
if (cur->data == data)
{
return cur;
}
}
return NULL;
}
如有不足之处,欢迎指正!!