在这篇博客介绍一下数据结构线性表链表的几个接口实现,话不多说,进入正题。
头插法
头插法是链表的几大接口之一,在进入头插时也得考虑有没有节点让你头插,如果没有就创造一个节点。所以先给出一个创造节点的函数:
SListNode* BuySListNode(SLDataType x)//创造一个新的节点
{
SListNode *Node = (SListNode*)melloc(sizeof(SListNode));
Node->data = x;
Node->next = NULL;
return Node;
}
如果已经有节点的话,进行正常的头插顺序,代码如下:
void SListPushFront(SListNode**pplist, SLDataType x)//头插法
{
SListNode*newNode = BuySListNode(x);
if (pplist == NULL)
{
*pplist = newNode;
}
else
{
newNode->next = *pplist;
*pplist = newNode;
}
}
头删法:
在头删的时候同样也得考虑节点的数量,如果只有一个直接返回就好了,如果有一个的话,正常删除,释放节点(因为时动态申请开辟的)以及置空。如果有两个及两个以上的节点的话:先保留下一个节点再进行释放置空。代码如下:
void SListPopFront(SListNode**pplist)//头删法
{
//考虑没有节点
//考虑只有一个节点
//考虑两个及以上的节点
SListNode*tail = *pplist;
if (tail == NULL)
{
return;
}
else if (tail->next == NULL)
{
free(tail);
*pplist = NULL;
}
else
{
SListNode*next = tail->next;
free(tail);
*pplist = next;
}
}
尾插法
尾插法,一定要考虑节点的个数,如果一个节点都没有的话,那么和头插的步骤一样。如果不是一个节点的话,判断每个节点的next为不为空,不为空则指向下一个,如果为空的话直接进行尾插,让最后一个节点的next指向新节点就好了。
代码如下:
void SListPushBack(SListNode**pplist, SLDataType x)//尾插法
{
SListNode*newNode = BuySListNode(x);
if (*pplist == NULL)
{
*pplist = newNode;
}
else
{
SListNode*tail = *pplist;
while (tail ->next= NULL)
{
tail = tail->next;
}
tail->next = newNode;
}
}
按理说newNode也应该的next也应该指向空,但是他是经过开辟函数开辟出来的,里面已经直接指向了NULL,所以不用写。
尾删法
考虑节点数量,考虑节点数量,考虑节点数量,重要的事情说三遍,在进行尾删的时候,也应该考虑这个事情,如果只有一个节点应该怎么办呢?如果根本没有节点该怎么办呢?我们大多数内心潜意识中都在做第三钟选择:有两个或者两个以上的节点这种情况。还有在尾删的时候,直接把最后一个节点删除后就可以了么?指向它的前一个的指针还是指向它的啊,这样这个指针不是就成为了野指针了么?在不带头并且不循环的单链表中,删除永远要比插入更加复杂,所以一定要考虑清楚,如果将来面试的时候就因为一种应该考虑的情况没有被考虑在内而被拒之门外,那真的太可惜了。话不多说,附上代码:
void SListPopBack(SListNode**pplist)//尾删法
{ //考虑节点为空或者只有一个节点
//考虑两个以上的节点
//尾删时不仅要删除最后一个,还要找到前一个节点,让前一个节点指针指向空
SListNode*tail = *pplist;
SListNode*prev = NULL;
if (tail ==NULL || tail->next == NULL)
{
free(tail);
*pplist = NULL;
}
else
{
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);
tail = NULL;
prev->next = NULL;
}
}
最后给一下节点的组成
typedef int SLDataType;
typedef struct SListNode
{
SLDataType data;
struct SListNode* next;
}SListNode;
以上就是在数据结构中关于链表四个接口的简单演示。希望给位大佬多多指正,看完的小伙伴可能对于我头插和尾插函数里面的参数有疑问,为什么我给的是二级指针,因为我要修改节点里面的内容,**pplist传过来要使用pplist,必须得解引用看里面的值。所以为plist,如果传plist过来,无法把值送过去也送过来,在这一块指针形参和实参传递这一块以后我也会写一篇小博客介绍一下。