一.基本介绍:
1.链表的每一个结点都包含两个域:数据域和指针域
2.其实计算机中并没有指针的指向,箭头指向只是人为假象出来的,实际上指针域存储的是下一个结点的地址。
3.链表的种类:链表的种类从三对修饰词中每对修饰词中选出一个,例如我们今天讲的就是不带头单向不循环链表
4.左值和右值问题
5.单链表较动态顺序表:
动态顺序表:
优点:只用通过数组下标访问的方式就可以随机访问某一个数组元素并进行操作,时间复杂度低;
缺点:当要删除或插入元素的时候不得不移动大量元素,时间复杂度高;
单链表(single list 常简写为 SLT)
优点:当要删除或插入元素的时候不用移动大量元素,时间复杂度低;
缺点:当要访问某一个结点并进行操作的时候要从头开始遍历,时间复杂度高;
6.要想学会单链表你得了解这些(上面没有讲到的下面会一一讲到)
🚗🚗🚗🚗🚗🚗🚗这里是正文接口分界线🚗🚗🚗🚗🚗🚗🚗🚗🚗
二.单链表基本操作
1.打印单链表
void SListPrint(SLTNode* plist)
{
SLTNode* cur = plist;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
备注;在对每一个接口进行测试的时候,通过打印结果来观察测试接口的正确与否
2.构造结点
SLTNode* BuySLTNode(SLTDataType x)
{
SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));
node->data = x;
node->next = NULL;
return node;
}
注意:返回类型是SLTNode*类型
3.尾插:在单链表尾部插入一个结点
void SListPushBack(SLTNode** pplist, SLTDataType x)
{
SLTNode* newnode = BuySLTNode(x);
if (*pplist == NULL)
{
*pplist = newnode;
}
else
{
SLTNode* tail = *pplist;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
命名:push 压入 pop弹出
back尾 front 头
4.尾删:删除单链表尾部的最后一个结点
void SListPopBack(SLTNode** pplist)
{
if (*pplist == NULL)
{
return;
}
else if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
SLTNode* prev = NULL;
SLTNode* tail = *pplist;
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);
tail = NULL;
prev->next = NULL;
}
}
5.头插:在存储第一个元素的结点前插入一个结点
void SListPushFront(SLTNode** pplist, SLTDataType x)
{
SLTNode* newnode = BuySLTNode(x);
newnode->next = *pplist;
*pplist = newnode;
}
6.头删:删除存储第一个元素的结点
void SListPopFront(SLTNode** pplist)
{
if (*pplist == NULL)
{
return;
}
else
{
SLTNode* next = (*pplist)->next;
free(*pplist);
*pplist = next;
}
}
7.在pos结点后插入一个结点
void SListInsertAfter(SLTNode* pos, SLTDataType x)
{
assert(pos);
SLTNode* newnode = BuySLTNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
8.在pos位置后删除一个结点
void SListEraseAfter(SLTNode* pos)
{
assert(pos);
if (pos->next == NULL)
{
return;
}
else
{
SLTNode* next = pos->next;
pos->next = next->next;
free(next);
}
}
9.删除pos位置的结点
SLTNode* SListFind(SLTNode* plist, SLTDataType x)
{
SLTNode* cur = plist;
while (cur)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}