数据结构—单链表的插入

本文探讨了数据结构中单链表的插入操作,通过代码示例解析如何在链表开始、末尾或其他位置进行插入。同时强调了在处理空链表及不同插入位置时的注意事项,建议参考《C和指针》。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构—单链表的插入

关于单链表的概念以及一些基本的知识就不说明了,直接上代码!

整个链表有一个根节点,用以指向第一个元素,在插入的过程中要考虑几个问题:

1、插入的位置是不是第一个节点与根节点之间

2、插入的位置是否是在最后

(要考虑当前链表是否为空)

代码1:

<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
typedef struct NODE
{
	struct NODE *link;
	int value;
}Node;
int insert(Node *current,int new_value)
{
	//新建个节点
	Node *newNode=(Node *)malloc(sizeof(Node));
	if(newNode==NULL)
		return 0;
	newNode->value=new_value;
	//如果当前链表为空
	if(current==NULL)
	{
		current=newNode;
		newNode->link=NULL;
		return 1;
	}
	Node *previous;
	//此时,current->link!=NULL,寻找插入的位置
	while(current!=NULL && current->value<new_value)
	{
		previous=current;
		current=current->link;
	}
	newNode->link=current;
	previous->link=newNode;
	return 1;
}

上面的代码虽然可以完成相应的插入需求,其中最后简化了函数,本来while语句执行完后还需判断是否到达了链表的最后,再插入,但是后来发现两种情况可以合并!

//插入最后的位置
if (current==NULL)   
{
	newNode->link=NULL;
	previous->link=newNode;
	return 1;
}
//中间位置
else    
{
	newNode->link=current;
	previous->link=newNode;
	return 1;
}


另一种做法将一个指向root的指针传递给函数,然后间接访问它。

代码2:

int insert(Node **rootp,int new_value)
{
	Node *current,*previous;
	current=*rootp;
	previous=NULL;
	while(current->link!=NULL && current->value<new_value)
	{
		previous=current;
		current=current->link;
	}
	//新建节点
	Node *newNode=(Node *)malloc(sizeof(Node));
	if(newNode==NULL)
		return 0;
	newNode->value=new_value;

	newNode->link=current;  //若是在最后,则current为NULL
	if(previous==NULL)    //插入空链表中
		*rootp=newNode;
	else
		previous->value=newNode;
	return 1;
}

上面两份代码还可以优化,出现这种情况是应为要考虑上述所说的两种特殊的情况(后面一种情况已经解决),第一种特殊情况(也就是插入的位置是不是第一个节点与根节点之间)可以通过以下的方式优化:

必须认识到每个节点都有一个指向它的指针,所以当移动到下一个节点时,我们可以保存一个指向下一个节点link字段的指针,而不是保存一个指向前一个节点的指针!

<span style="color:#330000;">int insert(Node **linkp,int new_value)
{
	register Node *current;
	while((current=*linkp)!=NULL && current->value<new_value)
		linkp=&t->link;

	register Node *newNode=(Node *)malloc(sizeof(Node));
	if(newNode==NULL)
		return 0;
	newNode->value=new_value;

	newNode->link=current;
	*linkp=newNode;
	return 1;
}</span>
消除了特殊的情况,代码更加简单了!

参考《C和指针》!








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值