一、链表的物理介绍
链表的定义:链表是一种常见的数据结构,由一系列节点构成,每个节点包含数据和指向下一个节点的指针。
在物理结构上顺序表相比链表来说是由一连串的不紧密相连的数据构成,但是在我们的实现中利用好指针的特点把在物理上不相连的链表在我们的脑海中相连起来。
二、链表的特点
链表的特点包括:(个人总结,有不完整的请大佬补充)
1. 空间的动态性:链表的长短可以根据需要插入的数据来进行动态变化,不像数组有固定的长度。
2. 空间要求较低:链表节点可以在内存中分散存储,不要求连续的存储空间。
3. 插入和删除操作方便:链表上的指针是上一个直接指向下一个在进行插入和删除时只需要改变指针指向的节点,时间复杂度为O(1)。
三、实现链表的功能介绍
链表的打印,节点的创建,链表的尾插,链表的头插,链表的尾删,链表的头删,链表的查找,链表位置的前置插入和后置插入,任意位置的链表删除等接口需要实现。
四、功能的实现
一、链表的打印
实现的思路:
利用while进行循环并用指针访问打印每个节点的数据,再把指针更新一下就行了。
代码实现:
void SLTPrint(SLNode* phead)
{
SLNode* cut = phead;
while (cut != NULL)
{
printf("%d->", cut->val);
cut = cut->next;
}
printf("NULL\n");
}
二、链表节点的创建
实现的思路:
利用malloc创建空间并赋给需要的值,最后返回创建的空间。
代码实现:
SLNode* CreatNode(SLDataType x)
{
SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
if (newnode == NULL)
{
perror("malloc");
return -1;
}
newnode->next = NULL;
newnode->val = x;
return newnode;
}
三、链表的尾插
实现思路:
利用指针找到最后的一个节点,创建一个需要插入节点,并把地址赋给上一个节点。
思考:当传递的指针是空指针时该怎么应对?
直接把创建的节点赋给指针就行了。
代码实现:
void SLIPushBack(SLNode** pphead, SLDataType x)
{ SLNode*newnode= CreatNode(x);
if (*pphead == NULL)
{
*pphead = newnode;
}
else {
SLNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
因为篇幅过大,下一篇我们继续学习链表功能的实现把剩下的功能搞一搞。