链表:
尾插
//尾插
void SListPushBack(SListNode** head, SLDataType data)
{
assert(head);
//空链表
//先申请节点
SListNode* newNode = BuySListNode(data);
if (NULL == *head)
{
*head = newNode;
}
else
{
//1 找到链表中的最后一个节点
SListNode* cur = *head;
while (cur->next)
{
cur = cur->next;
//cur++;err
}
//2 插入到新节点
cur->next = newNode;
}
}
尾删
//尾删
void SListPopback(SListNode** head)
{
assert(head);
//1 空链表 直接返回
if (NULL == *head)
return;
//2 只有一个节点
else if (NULL == (*head)->next)
{
free(*head);
*head = NULL;
}
//3 链表非空 - 至少一个节点
else
{
SListNode* cur = *head;
SListNode* prev = NULL;//标记cur的前一个节点
while (cur->next)
{
prev = cur;
cur = cur->next;
}
//最后一个节点已经找到,并删除该节点,同时让cur的前一个的节点指向NULL
prev->next = NULL;
//或者prev->next = cur->next;
free(cur);
}
}
头插
void SListPushFront(SListNode** head, SLDataType data)
{
assert(head);
SListNode* newNode = BuySListNode(data);
newNode->next = *head;//新节点的next指向原来头节点的地址
*head = newNode;//头指针指向新节点
//1 空链表
//if (NULL == *head)
//{
// *head = newNode;
//}
//
2 链表中有多个节点
//else
//{
// newNode->next = *head;//新节点的next指向原来头节点的地址
// *head = newNode;//头指针指向新节点
//}
}
头删
void SListPopFront(SListNode** head)
{
assert(head);
if (NULL == *head)
return;
SListNode* delNode = *head;
*head = delNode->next;
free(delNode);
//有一个节点,也就是*head->next为空,然后直接free,置位NULL
//else if (NULL == (*head)->next)
//{
// free(*head);
// *head = NULL;
//}
不止一个节点,先标记,再移动,后删除
//else
//{
// SListNode* delNode = *head;
// *head = delNode->next;
// free(delNode);
//}
}
查找数据
//查找
SListNode* SListFind(SListNode* head, SLDataType data)
{
SListNode* cur = head;
while (cur)
{
if (cur->data == data)
return cur;
cur = cur->next;
}
return NULL;
}
插入
void SListInsertAfter(SListNode* pos, SLDataType data)
{
if (NULL == pos)
return;
SListNode* newNode = BuySListNode(data);
newNode->next = pos->next;
pos->next = newNode;
}
删除
void SListErase(SListNode* pos)
{
if (NULL == pos && pos->next == NULL)
return;
SListNode* delNode = pos->next;
pos->next = delNode->next;
free(delNode);
}