数据结构-1.3链表(在任意一个位置删除)

这篇博客介绍了如何在C语言环境下,利用头插法实现链表中任意位置的删除操作。文章提供了删除过程的详细步骤、代码实现以及代码运行结果。代码中对不同删除情况做了注释说明,适用于数据结构学习者。
摘要由CSDN通过智能技术生成

 这里我们使用了作者前面的文章中有关于在任意位置插入的代码

采用头插法,删除也是头删除

删除过程

删除过程的代码

因为我们上面给出了删除的具体过程,这次直接给出相应过程的代码;我们删除存在的几种情况我们也在代码中给出了注释,就不再具体解释

/*
这个代码适用于拥有n-1个节点,即使没有n+1个节点,如果第n+1个节点的我在是NULL,也是适用的
这个也是头删除
[date][next](节点1)->[date][next](节点2)->[date][next](节点3)
删除步骤
(1)遍历到节点1处,使用一个临时变量temp2,先去存储节点2的地址
temp2=节点1.next
(2)我们已经获得了,节点2的地址,接下来,我们要把节点2中存储的节点3的地址给temp2
节点1.next=temp.next
*/
void Delete(int n) {
	//定义一个删除函数,删除链表中相应的节点
	struct Node* temp1 = head;
	if (n == 1) {
		head = temp1->next;
		free(temp1);
		return;
	}
	//我们需要遍历到第n-1个节点
	for (int i = 0; i < n - 2; i++)
	{
		temp1 = temp1->next;
	}

	//使用一个指针去存储n-1的地址,调整连接
	struct Node* temp2 = temp1->next;
	temp1->next = temp2->next;
	free(temp2);//首先他这个是要把temp1跳到节点2上然后确定下temp2也就是3节点最后2节点的指向改为3的指向就完了然后清空3
}

代码运行结果

 全部代码

语言:C语言          平台:VS2019

在代码中我们关于堆栈的区别也给出了解释

/*
功能:在链表的任何地方删除一个节点(我们删除完之后需要把那块空间给释放掉)
动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存。
堆,是由程序员手动完成申请和释放的
栈,是由编译器自动分配和释放的
这里使用的是头插法
*/
struct Node {
	int date;
	struct Node* next;
};
struct Node* head;
void Insert(int date, int n) {
	struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
	temp->date = date;
	temp->next = NULL;
	printf("插入的节点信息为:temp->date=%d  ", temp->date);
	//在头节点处插入
	if (n == 1) {
		temp->next = head;
		head = temp;
		return;
	}

	//在其他位置插入,在第n个节点前插入
	struct Node* readlist;
	readlist = head;
	for (int i = 0; i < n - 2; i++)
	{
		readlist = readlist->next;//遍历到第n-2个节点
	}
	printf("在节点readlist=%d处插入\n", readlist->date);
	/*
	这里的插入逻辑是这样子的,你可以认为我们的节点是这样子的[date][next];[date的地址]=temp,[next的地址]=temp.next
	*/
	temp->next = readlist->next;
	readlist->next = temp;
}
void Print() {
	//定义一个打印函数,打印链表的信息
		//我们需要做的只是遍历链表
	struct Node* tempRead = head;//为什么我们要使用临时变量,因为我们不能使用表头,否则会失去对第一个节点的引用
	printf("链表是:");
	while (tempRead != NULL)
	{
		printf(" %d", tempRead->date);
		tempRead = tempRead->next;//这种方法对节点进行遍历
	}
	printf("\n");
}
/*
这个代码适用于拥有n-1个节点,即使没有n+1个节点,如果第n+1个节点的我在是NULL,也是适用的
这个也是头删除
[date][next](节点1)->[date][next](节点2)->[date][next](节点3)
删除步骤
(1)遍历到节点1处,使用一个临时变量temp2,先去存储节点2的地址
temp2=节点1.next
(2)我们已经获得了,节点2的地址,接下来,我们要把节点2中存储的节点3的地址给temp2
节点1.next=temp.next
*/
void Delete(int n) {
	//定义一个删除函数,删除链表中相应的节点
	struct Node* temp1 = head;
	if (n == 1) {
		head = temp1->next;
		free(temp1);
		return;
	}
	//我们需要遍历到第n-1个节点
	for (int i = 0; i < n - 2; i++)
	{
		temp1 = temp1->next;
	}

	//使用一个指针去存储n-1的地址,调整连接
	struct Node* temp2 = temp1->next;
	temp1->next = temp2->next;
	free(temp2);//首先他这个是要把temp1跳到节点2上然后确定下temp2也就是3节点最后2节点的指向改为3的指向就完了然后清空3
}
int main(void)
{
	head = NULL;//初始时,链表为空
	Insert(2, 1);
	Insert(2,2);
	Insert(4,1);
	Insert(6,4);
	Insert(5,3);
	Print();
	int n;
	printf("请输入要删除那个节点\n");
	scanf_s("%d",&n);
	Delete(n);
	Print();
}

创作不易,希望可以得到各位的点赞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程者也

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

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

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

打赏作者

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

抵扣说明:

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

余额充值