前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链表指定位置插入,指定位置删除,逆置链表的练习

链表指定位置插入,指定位置删除,逆置链表的练习

作者头像
大忽悠爱学习
发布2021-03-02 14:29:21
9830
发布2021-03-02 14:29:21
举报
文章被收录于专栏:c++与qt学习

指定位置插入: insert_pos_val(lk headNode, int pos, int val);

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
	int num;
	LinkNode* next;
}Lk, * lk;
//初始化头节点
lk init_headNode()
{
	lk headNode = (lk)malloc(sizeof(Lk));
	if (headNode == NULL)
	{
		return NULL;
	}
	headNode->next = NULL;
	//指针遍历输出
	lk endNode = headNode;
	//输入-1结束向链表赋值
	int val = -1;
	while (1)
	{
		printf("请输入:\n");
		scanf("%d", &val);
		if (val == -1)
		{
			break;
		}
		lk newNode = (lk)malloc(sizeof(Lk));
		newNode->num = val;
		newNode->next = NULL;
		//尾插法
		endNode->next = newNode;
		endNode = newNode;
	}
	return headNode;
}
//遍历输出
void foreach_linkList(lk headNode)
{
	if (headNode == NULL)
	{
		return;
	}
	lk curNode = headNode->next;
	while (curNode)
	{
		printf("%d\n", curNode->num);
		curNode = curNode->next;
	}
}
//指定位置插入一个值
void insert_pos_val(lk headNode, int pos, int val)
{
	if (headNode == NULL)
	{
		return;
	}
	lk prveNode = headNode;
	lk curNode = headNode->next;
	//索引
	int index = 0;
	while (curNode)
	{
		if (index == pos)
		{
			break;
		}
		prveNode = curNode;
		curNode = curNode->next;
		index++;
	}
	if (pos > index)
	{
		printf("无法插入当前位置\n");
		return;
	}
	lk newNode = (lk)malloc(sizeof(Lk));
	newNode->num = val;
	newNode->next = NULL;
	prveNode->next = newNode;
	newNode->next = curNode;
}
int main()
{
	lk headNode = init_headNode();
	printf("打印输出链表:\n");
	foreach_linkList(headNode);
	printf("插入后打印输出链表:\n");
	insert_pos_val(headNode, 10, 521);
	foreach_linkList(headNode);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

指定位置删除:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
	int num;
	LinkNode* next;
}Lk, * lk;
//初始化头节点
lk init_headNode()
{
	lk headNode = (lk)malloc(sizeof(Lk));
	if (headNode == NULL)
	{
		return NULL;
	}
	headNode->next = NULL;
	//指针遍历输出
	lk endNode = headNode;
	//输入-1结束向链表赋值
	int val = -1;
	while (1)
	{
		printf("请输入:\n");
		scanf("%d", &val);
		if (val == -1)
		{
			break;
		}
		lk newNode = (lk)malloc(sizeof(Lk));
		newNode->num = val;
		newNode->next = NULL;
		//尾插法
		endNode->next = newNode;
		endNode = newNode;
	}
	return headNode;
}
//遍历输出
void foreach_linkList(lk headNode)
{
	if (headNode == NULL)
	{
		return;
	}
	lk curNode = headNode->next;
	while (curNode)
	{
		printf("%d\n", curNode->num);
		curNode = curNode->next;
	}
}
//指定位置删除
void delete_pos_val(lk headNode, int pos, int val)
{
	if (headNode == NULL)
	{
		return;
	}
	lk prveNode = headNode;
	lk curNode = headNode->next;
	//索引:跟据curNode位置移动
	int index = 1;
	while (curNode)
	{
		if (index == pos)
		{
			break;
		}
		prveNode = curNode;
		curNode = curNode->next;
		index++;
	}
	if (pos > index)
	{
		printf("没有当前元素可供删除\n");
		return;
	}
	//改变prveNode指针指向
	prveNode->next = curNode->next;
	//释放curNode节点在堆区开辟的数据
	free(curNode);
}
int main()
{
	lk headNode = init_headNode();
	printf("打印输出链表:\n");
	foreach_linkList(headNode);
	printf("删除后打印输出链表:\n");
	delete_pos_val(headNode, 2, 521);
	foreach_linkList(headNode);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

逆置链表方式:只对当前链表进行操作,不借用新链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
	int num;
	LinkNode* next;
}Lk, * lk;
//初始化头节点
lk init_headNode()
{
	lk headNode = (lk)malloc(sizeof(Lk));
	if (headNode == NULL)
	{
		return NULL;
	}
	headNode->next = NULL;
	//指针遍历输出
	lk endNode = headNode;
	//输入-1结束向链表赋值
	int val = -1;
	while (1)
	{
		printf("请输入:\n");
		scanf("%d", &val);
		if (val == -1)
		{
			break;
		}
		lk newNode = (lk)malloc(sizeof(Lk));
		newNode->num = val;
		newNode->next = NULL;
		//尾插法
		endNode->next = newNode;
		endNode = newNode;
	}
	return headNode;
}
//遍历输出
void foreach_linkList(lk headNode)
{
	if (headNode == NULL)
	{
		return;
	}
	lk curNode = headNode->next;
	while (curNode)
	{
		printf("%d\n", curNode->num);
		curNode = curNode->next;
	}
}
//逆置链表
void reverse_pos_val(lk headNode)
{
	if (headNode == NULL)
	{
		return;
	}
	lk prveNode = headNode;
	lk curNode = prveNode->next;
	lk nextNode = curNode->next;
	//第一步:
	prveNode->next = NULL;
	curNode->next = NULL;
	//第二步到第五步
	while (nextNode != NULL)
	{
		//辅助指针往后移动
		prveNode = curNode;
		curNode = nextNode;
		nextNode = nextNode->next;
		//移动过后改变链表中curNode节点next指针指向
		curNode->next = prveNode;
	}
   //第六步
	headNode->next = curNode;	
}
int main()
{
	lk headNode = init_headNode();
	printf("打印输出链表:\n");
	foreach_linkList(headNode);
	printf("逆置后打印输出链表:\n");
	reverse_pos_val(headNode);
	foreach_linkList(headNode);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

方式二:准备一个新链表,取出之前链表中的元素,用头插法的方式插入新准备的链表中,这里不做演示

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档