单链表的基本操作
初始化
void SListInit(SListNode **ppFirst)
{
assert(ppFirst != NULL);
*ppFirst = NULL;
}
从头部插入
首先需要开辟空间,因为在以后的操作中还需要动态开辟空间故把开辟空间独立封装为一个函数。
开辟空间函数
static SListNode* CreatNode(DataType data)
{
SListNode *newnode = (SListNode*)malloc(sizeof(SListNode));
newnode->data = data;
newnode->next = NULL;
return newnode;
}
头插函数
动态开辟一个新的空间,使newnode->next 指向原来的头节点,ppFirst指向newnode
void SListPushFront(SListNode** ppFirst, DataType data)
{
assert(ppFirst);
SListNode *newnode = CreatNode(data);
newnode->next = *ppFirst;
*ppFirst = newnode;
}
从尾部插入
分两种情况
1)链表为空链表:直接添加一个新节点在后面即可。
2)链表中有节点:循环找到尾节点,然后在尾节点后面插入一个新节点即可。
void SListPushBack(SListNode **ppFirst, DataType data)
{
SListNode *newnode = CreatNode(data);
assert(ppFirst);
if (*ppFirst == NULL)
{
*ppFirst = newnode;
}
SListNode *cur = *ppFirst;
for (cur; cur->next != NULL; cur = cur->next)
{
;
}
cur->next = newnode;
}
从尾部删除
首先创建两个指针,一个指向当前位置,一个指向当前位置的下一个位置,循环下一个位置的下一个位置 判断他是否为尾节点。然后将尾节点删除,尾节点的前一个节点的地址域(Next->next)置于空。
void SListPopBack(SListNode **ppFirst)
{
SListNode *cur = *ppFirst;
SListNode *Next = cur->next;
while (Next->next != NULL)
{
Next = Next->next;
cur = cur->next;
}
free(Next);
cur->next = NULL;
}
从头部删除
将头节点暂存(防止找不到源头节点),然后让链表的起始位置指向第二个节点,最后删除掉头节点。
void SListPopFront(SListNode **ppFirst)
{
SListNode *cur = *ppFirst;
ppFirst = cur->next;
free(cur);
}
从中间插入
首先开辟一个新空间,然后使插入位置的前一个节点的next指向新节点,然后新节点的next指向插入位置的节点即可。
void SListInsert(SListNode **ppFirst, SListNode *pos, DataType data)
{
SListNode *cur = *ppFirst;
SListNode *newnode = CreatNode(data);
for (cur; cur->next != pos; cur = cur->next){ ; }
cur->next = newnode;
newnode->next = pos;
}
删除任意位置的节点
循环找到要删除的节点,然后删除它,将删除位置的前一个节点next指向要删除的后一个节点
void SListErase(SListNode **ppFirst, SListNode *pos)
{
SListNode *cur = *ppFirst;
for (cur; cur->next != pos; cur = cur->next){ ; }
cur->next = pos->next;
free(pos);
}
按值删除,只删遇到的第一个
循环找到要删除的数据的位置,然后删除它,将删除位置的前一个节点next指向要删除的后一个节点
void SListRemove(SListNode **ppFirst, DataType data)
{
SListNode *cur = *ppFirst;
SListNode *Next = cur->next;
SListNode *del = NULL;
while (Next->data != data)
{
Next = Next->next;
cur = cur->next;
}
del = Next->next;
Next->next = del->next;
free(del);
return;
}