无头单向非循环链表的简单介绍
结构简单,常用作其他数据结构的子结构,如哈希桶,图的邻接表等等
该类型常出现在笔试面试中
在下列的学习中,无头单向非循环链表的头结点指针 plist 很关键
‘查’操作和‘改’操作
查找到了自然可以修改,这是较为基础的操作
SLTNode* SLTFind(SLTNode* phead, SLTDataType x) //查找单链表结点
{
SLTNode* cur = phead;
while (cur)
{
if ((cur->data) == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
‘增’操作
此处内容包含三个部分,分别如下
头插法
void SLTPushFront(SLTNode** pphead, SLTDataType x) //单链表头插法
{
SLTNode* newnode = CreateSLTNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
尾插法
void SLTPushBack(SLTNode** pphead, SLTDataType x) //单链表尾插法
{
SLTNode* newnode = CreateSLTNode(x);
if (*pphead == NULL)
{
*pphead = newnode;
}
else
{
SLTNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
随机插入结点
void SLTInsertAfter(SLTNode* pos, SLTDataType x) //在pos之后插入
{
assert(pos);
SLTNode* newnode = CreateSLTNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
‘删’操作
此处内容包含4个部分,分别如下
头删法
void SLTPopFront(SLTNode** pphead) //单链表头删法
{
assert(*pphead);
SLTNode* del = *pphead;
*pphead = (*pphead)->next;
free(del);
del = NULL;
}
尾删法
void SLTPopBack(SLTNode** pphead) //单链表尾删法
{
assert(*pphead);
if ((*pphead)->next == NULL)
{
*pphead = NULL;
}
else
{
SLTNode* tail = *pphead;
SLTNode* prev = NULL;
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);
prev->next = NULL;
}
}
删除pos处的结点
void SLTErase(SLTNode** pphead,SLTNode* pos) //删除pos位置的值
{
assert(pphead);
assert(pos);
if (pos == (*pphead)) //头删法
{
SLTPopFront(pphead);
}
else
{
SLTNode* prev = *pphead;
while ((prev->next) != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
}
}
删除pos之后的结点
void SLTEraseAfter(SLTNode* pos) //删除pos之后的值
{
assert(pos);
assert(pos->next);
SLTNode* del = pos->next;
pos->next = del->next;
free(del);
}
其他辅助操作
此处包含两部分,分别如下
遍历打印链表
void SLTPrint(SLTNode* phead) //单链表遍历打印
{
SLTNode* cur = phead;
while (cur)
{
printf("%d->", cur->data);
cur = cur->next;//
}
printf("NULL\n");
}
创建新结点
SLTNode* CreateSLTNode(SLTDataType x) //创建单链表结点
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
总结:无头单向非循环链表的使用配合上述操作便可在一定程度上有效完成