C语言顺序表插入删除 尾删 任意删除 任意插入 链表头插

各位少年,大家好我是小敖 ,今天给大家分享 顺序表的头删 尾删,任意删除,任意插入,链表头插。接下来跟大家分享。

在这里插入图片描述

头插的操作

```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,这样就使得成功进行头部插入。
好了 本次分享到这里 希望大家对文章进行指正

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我来回答你的问题。 首先,链表是一种非常常见的数据结构,我们可以用它来实现动态存储数据。链表的每一个节点都包含两个部分:数据部分和指针部分。数据部分用来存储实际数据,指针部分用来指向下一个节点。 对于你的第一个问题,我们可以用下面的代码实现链表的顺序插入: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点 struct Node { int data; struct Node* next; }; // 定义链表节点 struct Node* head = NULL; // 定义函数:插入节点 void insert(int value) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; newNode->next = NULL; if (head == NULL) { head = newNode; return; } struct Node* current = head; while (current->next != NULL) { current = current->next; } current->next = newNode; } // 定义函数:反转链表 void reverse() { struct Node* prev = NULL; struct Node* current = head; struct Node* next = NULL; while (current != NULL) { next = current->next; current->next = prev; prev = current; current = next; } head = prev; } // 定义函数:打印链表 void print() { struct Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } // 主函数 int main() { // 插入节点 insert(1); insert(3); insert(2); insert(5); // 打印链表 printf("原链表:"); print(); // 反转链表 reverse(); // 打印链表 printf("反转后的链表:"); print(); return 0; } ``` 这段代码中,我们定义了一个 `Node` 结构体来表示链表的节点,其中包含一个 `data` 字段和一个 `next` 指针。我们还定义了一个 `head` 指针来表示链表节点。 在 `insert()` 函数中,我们首先创建一个新的节点,然后遍历链表找到最后一个节点,把新节点插入链表的末。 在 `reverse()` 函数中,我们使用三个指针 `prev`、`current` 和 `next` 来实现链表的反转。 在 `main()` 函数中,我们插入了一些数据,并且打印了原链表和反转后的链表。输出结果如下: ``` 原链表:1 3 2 5 反转后的链表:5 2 3 1 ``` 希望这个例子能够帮助你理解链表插入和反转操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小敖探花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值