前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链表的插入实现

链表的插入实现

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

错误写法:不能覆盖特殊情况的插入方法 写法:只用了一个指向当前节点的指针

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
	int num;
	LinkNode* next;
}Lk, * lk;
//有头链表的初始化
lk initLinkNode()
{
	//创建头结点
	lk headNode = (lk)malloc(sizeof(Lk));

	//检验头结点分配内存是否成功
	if (headNode == NULL)
	{
		return NULL;
	}

	//初始化头结点
	headNode->num = -1; //头结点不维护数据域,这行代码可写可不写
	headNode->next = NULL;

	//记录节点位置,方便插入新的数据
	lk currentNode = headNode;

	//让用户输入几个数,如果输入-1,结束输入
	int val = -1;

	while (1)
	{
		printf("请给当前链表赋值,输入-1结束输入:\n");
		scanf("%d", &val);
		if (val == -1)
		{
			break;
		}
		//开辟一个新节点存放数据
		lk node = (lk)malloc(sizeof(Lk));
		node->num = val;
		node->next = NULL;
		//利用记录当前位置的指针,将链表中最后一个节点与新开辟的节点相连接
		currentNode->next = node;
		//将记录当前位置的指针指向新的节点
		currentNode = currentNode->next;
	}
	return headNode;
}
//遍历链表
void for_each_linkList(lk headNode)
{
	if (headNode == NULL)
	{
		return;
	}
	//利用一个记录当前节点的指针,来遍历输出整个链表
	lk curNode = headNode->next;
	//循环结束条件:curNode指针为空
	while (curNode)
	{
		printf("%d\n", curNode->num);
		curNode = curNode->next;
	}
}
//插入链表
void  insert_LinkList(lk headNode,int oldVal,int newVal)
{
	//第一种插入实现
	if (headNode == NULL)
	{
		return;
	}
	//遍历链表查看链表中是否存储有oldval,有就将newval插入到oldval后面,没有就插入到链表结尾
	//指向当前节点的指针
	lk curNode = headNode->next;
	while (curNode!=NULL)
	{
		if (curNode->num == oldVal)
		{
			break;
		}
		curNode = curNode->next;
	}
	//先按照正常找到的情况写出插入代码
	//然后检查未找到,需要尾插的情况符不符合正常插入的代码
	lk newNode = (lk)malloc(sizeof(Lk));
	newNode->num = newVal;
	//看图:
	newNode->next = curNode->next;
	curNode->next = newNode;
	printf("插入成功");
}
int main()
{
	lk headNode = initLinkNode();
	insert_LinkList(headNode, 30, 100);
	printf("链表遍历结果为:\n");
	for_each_linkList(headNode);
	return 0;
}

正常找到oldVal插入的情况:可以成功实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

未找到oldVal,将newVal进行尾插的情况:访问权限冲突

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正确写法:能够覆盖特殊情况

写法:用了两个一前一后的指针

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
	int num;
	LinkNode* next;
}Lk, * lk;
//有头链表的初始化
lk initLinkNode()
{
	//创建头结点
	lk headNode = (lk)malloc(sizeof(Lk));

	//检验头结点分配内存是否成功
	if (headNode == NULL)
	{
		return NULL;
	}

	//初始化头结点
	headNode->num = -1; //头结点不维护数据域,这行代码可写可不写
	headNode->next = NULL;

	//记录节点位置,方便插入新的数据
	lk currentNode = headNode;

	//让用户输入几个数,如果输入-1,结束输入
	int val = -1;

	while (1)
	{
		printf("请给当前链表赋值,输入-1结束输入:\n");
		scanf("%d", &val);
		if (val == -1)
		{
			break;
		}
		//开辟一个新节点存放数据
		lk node = (lk)malloc(sizeof(Lk));
		node->num = val;
		node->next = NULL;
		//利用记录当前位置的指针,将链表中最后一个节点与新开辟的节点相连接
		currentNode->next = node;
		//将记录当前位置的指针指向新的节点
		currentNode = currentNode->next;
	}
	return headNode;
}
//遍历链表
void for_each_linkList(lk headNode)
{
	if (headNode == NULL)
	{
		return;
	}
	//利用一个记录当前节点的指针,来遍历输出整个链表
	lk curNode = headNode->next;
	//循环结束条件:curNode指针为空
	while (curNode)
	{
		printf("%d\n", curNode->num);
		curNode = curNode->next;
	}
}
//插入链表
void  insert_LinkList(lk headNode,int oldVal,int newVal)
{
	//第一种插入实现
	if (headNode == NULL)
	{
		return;
	}
	//遍历链表查看链表中是否存储有oldval,有就将newval插入到oldval前面,没有就插入到链表结尾
	//一个指向头节点,一个指向第一个存储有效数据的节点
	lk prveNode = headNode;
	lk curNode = headNode->next;
	//循环结束条件:当curNode指向NULL
	while (curNode)
	{
		if (curNode->num == oldVal)
		{
			break;
		}
		//下面两行代码顺序不能改变
		prveNode = curNode;
		curNode = curNode->next;
	 }
	//创建新节点存储newVal
	lk newNode = (lk)malloc(sizeof(Lk));
	newNode->num = newVal;
	newNode->next = NULL;

	//插入:下面两行代码可以改变顺序
	prveNode->next = newNode;
	newNode->next = curNode;
	printf("插入成功");
}
int main()
{
	lk headNode = initLinkNode();
	insert_LinkList(headNode, 30, 100);
	printf("链表遍历结果为:\n");
	for_each_linkList(headNode);
	return 0;
}

正常找到oldVal插入的情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

未找到oldVal,将newVal进行尾插的情况

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正确写法:能够覆盖特殊情况
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档