各位少年,大家好我是小敖 ,今天给大家分享 顺序表的头删 尾删,任意删除,任意插入,链表头插。接下来跟大家分享。
头插的操作
```c
void SLPushFront(SL*psl, SLDatatype x)
{
SLCheckCapacity(psl);
int end = psl->size - 1;
while (end >= 0)
{
psl->a[end + 1] = psl->a[end];
--end;
}
psl->a[0] = x;
psl->size++;
}
这段代码是一段头插入 原理如下图
下面代码就是一组 顺序表 由于顺序表是连续的 我就没有画箭头 上面的空间已经预留好了,可以认为肯定有足够的空间向后移动,然后插入这个0,这就是头插思路 从原先只有五个数据的数组里头 头插以后变成6个数据。
我们可以知道的是代码 是前往后移动的 图如下
以此内推 最后第一个位置位置空出来,那么我们就在下标0的位置插入x,让代码成功实现头部插入 等。
顺序表头删
头删就是把头部位置进行覆盖掉,这就是头删的思路 我们的思路是 覆盖,把后面的数据往前面覆盖
代码如下
void SLPopFront(SL* psl)
{
int n = 0;
for (int i = 0; i < psl->size - 1; i++)
{
psl->a[n] = psl->a[n + 1];
n++;
}
psl->size--;
}
这段代码把第一个位置覆盖了,实现了顺序表 成功覆盖掉了 第一个位置 从前往后移动即可,下次再进行插入直接覆盖掉就好。
顺序表尾删
尾删就很简单了 我们直接进行尾部删除就好 这里就不画图了 ,下次尾部插入进行覆盖就好了。
```c
void SLPopBack(SL* psl){
psl->size--;
}
``
顺序表插入
我们写顺序表的时候 如果想在第三个数据里插入数据,我们需要怎么做呢?首先我们得确认第三个数据元素的下标 然后进行移动 是从后往前移动 跟头插差不多。看代码
void SLInsert(SL* psl, int pos, SLDatatype x)
{
assert(0 <= pos && pos <= psl->size);
SLCheckCapacity(psl);
int end = psl->size - 1;
while (end >= pos)
{
psl->a[end + 1] = psl->a[end];
--end;
}
psl->a[pos] = x;
psl->size++;
}
这就是任意插入的原理,以及如何实现 顺序表的任意插入。
顺序表的查找
int SLFind(SL* psl, SLDatatype x)
{
assert(psl);
for (int i = 0; i < psl->size; i++)
{
if (psl->a[i] == x)
{
return i;
}
}
return -1;
}
这里 我们要查到下标 我们需要便利这个数组 如果我们输入3,那需要和数组里的i位置进行比较,然后如果没有返回-1,如果找到了返回i。
顺序表的改变任意位置数字
void SLModify(SL* psl, int pos, SLDatatype x)
{
assert(psl);
assert(0 <= pos && pos<psl->size);
psl->a[pos] = x;
}
这个就很简单直接覆盖就好,不出做任何解释。
链表
一块连续的物理空间 链表初始化如下
分为两种结构
逻辑结构是自己想象出来的 物理结构是实际内存中,真实的样子
#include"SList.h"
void SLTPrint(SLTNode* phead)
{
SLTNode* cur = phead;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL");
}
打印代码的data元素 cur next指向下一个 每次进行更新 覆盖,进行循环打印。
头插创建节点
void SLPushFront(SLTNode** pphead, SLDatatype x)
{
SLTNode* newnode=(SLTNode*)malloc(sizeof(SLTNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->data = x;
newnode->next = NULL;
newnode->next = *pphead;
*pphead = newnode;
}
这里进行创造了节点,这里进行了二级指针 是因为要交换地址,这里后面两句意思把next赋值给新头节点,然后把头节点地址重新赋给了newnode,这样就使得成功进行头部插入。
好了 本次分享到这里 希望大家对文章进行指正