理解
链表,顾名思义就是像链子一样的结构,这种结构就像自行车的车链子一样,一环扣一环,觉得短了,随便找个地方拆开,新加一个环进去,这就延长了,哪一个地方需要被修改找到之后直接换掉,非常方便
链表是针对数组的缺点所创造出来的,数组中间插个数,要么全部后移,要么前移,反正数组不好从中间新长个空间,数组的头上插个数也不方便
。。。
链表可以完美的解决以上的问题
在数据结构中数组也叫顺序表一篇文章搞懂顺序表SL(SeqList)-CSDN博客
概念:
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
对,这是单链表,也就是单向链表
单链表的每个节点,有俩元素:也就是上面的大框,大框里面有俩小框
-
一个是存值的
-
一个是指针,是指向下一个节点的
单链表的实现
也就是节点的定义(SListNode)
typedef int SListDataType;
typedef struct SListNode
{
SListDataType x;
SListNode* next;
}SListNode;
申请一个新的节点
SListNode* BuySListNode(SListDataType x)
{
SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));
if (newNode == NULL)
{
perror("BuySListNode");
exit(-1);
}
newNode->x = x;
newNode->next = NULL;
return newNode;
}
这个函数的作用就是,给它一个值,它会将值放进去放到它申请的空间newNode的x里面去,再把newNode指向的空间置为NULL
尾插
void SListPushBack(SListNode**pphead,SListDataType x)
{
if (*pphead == NULL)
{
*pphead = BuySListNode(x);
return;
}
else
{
SListNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = BuySListNode(x);
return;
}
}
尾插的两种情况:
- 无节点 直接新建就行
- 有节点 找结尾去
分这俩情况就是因为tail->next会不会越界访问
打印单链表
void SListPrint(SListNode** pphead)
{
SListNode* tail = *pphead;