数据结构中点链表的插入操作
Status listinsert(Linklist &L,int i,ElemType e)//bool vs status :在函数需要有返回值的时候,既可以使用bool也可以使用,使用bool的时候,在需要判断的语句后面加上return //true,return false.这样就可以了。不像使用status,还需要加上typedef int status与#define ERROR -1与#define OK 1. 结论:所以在有需要返回值的函数中我自己会使用相对简单的bool类型。
// c语言中一般没有status这个关键字,但一般写程序时,会定义这样一个类型,用来表示成功或失败状态。如:0表示成功,-1表示失败。这样status就可以定义成int类型。如:
/*typedef int status;
#define ERROR -1
#define OK 1
然后用它去定义变量或函数返回值类型,如:
status func(int n)//判断非负数
{
if(n>=0)
return ERROR;
else
return OK;
}*/
//在数据结构中,关于数据元素的定义俊用“ElemType e”来表示,其实e是表示数据元素的变量,而ElemType是它的类型,ElemType的含义就是“数据元素的类型”,是一个抽象的概念,是表示我们所要使用的数据元素应有的类型。
ElemType是数据结构上为了说明问题而用的一个词。它是element type(元素的类型)的简化体。 因为数据结构是讨论抽象的数据结构和算法,一种结构中元素的类型不一定是整形,字符型,浮点型或者用户自定义类型,为了不重复说明,使用过程用“ElemType”代表所有可能的数据类型,简单明了的概括整体。
在算法中,除特别说明外,规定ElemType的默认是int型。
//bool型说明在函数调用这个函数之后的返回值要么是true,要么是false.括号中的都是形参,头指针L采用了引用,整型变量i和e用来接收用户传来的数据。
{
p=L; j=0;//p指向头结点,并定义一个整形变量j的值为0.定义了结点型指针变量p,并且与L的指向相同,它们两个同时指向头结点。并且定义整形变量j的值等于0.
while(p&&j<i-1)//如果要在第n个结点进行插入数据,则需要先找到这个节点.这里使用的是与符号&,表示的是只有两个条件都满足的时候循环才能进行。
由于j从0开始,从0到i-1一共有i-1+1即i个数,而在j等于i-2即i-1个数的时候停止。在这里while循环的条件是结点型指着变量所指向的结点不为空的时候并且j小于i-1的时候循环继续执行。这个循环的目的是为了将结点型指针变量p指向第i-1结点的位置。
{
p=p->next;//P指向后一个结点循环进来以后首先将p指向p的下一个结点。
j++;//j的值自增1.
}//这个循环的目的是让p和j一齐后移,不断的接近条件的边界。
if(!p||j>i-1)//i<1或者i>ListLength(L)+1时,插入位置无效。不调用ListLength,提高效率。//if条件语句中的条件是一个或||,它只要有一个条件满足if语句就可以继续执行。也就是p只要为空,或者j的数值大于i-1的时候就可以继续执行。{
cout<<"i is error!";//输出i is error!这句话。对于条件中直观的解释就是如果,p指到了最后一个结点的后面(这是因为结点的数目太少)或者是i<1.如果i的值是负数,或者i-1的值大于单链表的长度,即都是用户输入i值得错误将会导致插入失败。会提醒i is error!
return ERROR;
}//该if语句的主要作用就是为了给出来一个信号以及提高算法的健壮性。如果i的值用户输入了-1则会提醒出错。如果p的值为空了同样也会提示出错。p指向的结点为空说明p已经指向了表尾了还没指向i-1的位置。说明i-1的值过大。j>i-1说明用户输入的i值是非正数。
//能够执行到这一步说明已经找到了第i-1个结点,接下来就是正式的生成插入的操作了。
LinkList s=new Lnode();//开辟一个新的结点空间,并定义一个结构体指针变量s指向它。
s->data=e;//把新结点的数值域赋值为e.
s->next=p->next;//p->next表示的是第i个结点的地址值,s->next指的是新申请的结点的指针域,也就是把第i个结点的地址值放到新结点的指针域里面,新的结点指向第i个结点。
p->next=s;//这里的p-next指的是第i-1个结点的指针域,s指的是新申请结点的地址值。这步操作就是把新结点的地址值放到第i-1个结点的指针域里面。也就是第i-1个结点指向新申请的结点。 这个操作完成之后就把插入操作给完成了。之前的第i-1个结点还是第i-1个结点,新申请的结点就变成第i个结点了,而之前的第i个结点就变成了第i+1个结点。
return OK;//在这一切完成以后返回1,因为OK定义的数值就是1,说明插入成功。
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!