文章中,作者介绍了线性链表的定义,特点,分类以及如何初始化一个线性链表。
在本篇文章中,作者将展示示例代码,介绍单链表的插入操作以及带头结点的单链表与不带头结点的单链表在代码的实现上有什么区别。
单链表的插入与删除是通过修改指针的指向实现的。
现在我们来了解一下如何在线性表中插入元素。
1,我们先定义一个布尔类型的ListInster函数,即“插入”函数。传入三个变量,分别是LinkList类型的变量l,用来表示已经初始化的单链表;int型的变量i,用来指明要在第几个元素前插入;以及int型的变量e,用来表示插入元素的值;
2,首先进行一个判断,如果i小于一,则代表输入的i是有误的,线性表没有这个位置,从而返回false;
主备插入的线性链表
3,如果i的值合法,定义一个Node类型的指针变量p,同时将其指向我们以及初始化完毕的线性表;
4,定义int型的变量j,进行一个循环,如果p指针不为空,并且j的值小于i-1(用于表示p指针目前所在的位置,因为p指针最初的指向单链表表头的),则p指向p的下一个元素,同时j自增。通过这个循环,我们就可以将p指针指向需要插入的元素的前一个元素的地址;
5,通过malloc函数分配一个新的空间,指针s指向该空间;
6,将要插入的元素e放入新开辟的空间中,把p的next指针(即原本指向p的下一个节点的指针)的地址值赋给s的next,最后将p的next指针指向s。此时,s就会被插入到该链表中。
插入完毕的线性链表
以上都是将线性链表默认为带头结点的线性链表来实现的,下面的用c++语言的代码实现:
boolListInster(LinkListl,inti,inte){
if(i1){
returnfalse;
//TODO
}
Node*p;
intj=0;
p=l;
while(p!=NULLji-1){
p=p-next;
j++;
//TODO
}
if(p==NULL){
returnfalse;
//TODO
}
Node*s=(Node*)malloc(sizeof(Node));
s-data=e;
s-next=p-next;
p-next=s;
returntrue;
}
大家可以对应上面的步骤来阅读使用代码。
那么不带头节点的单链表与带头结点的单链表有什么区别呢?
由于没有头结点,当我们在第一个位置上插入元素的时候,指针p指向的就是第一个结点,而非头结点。
我们的插入操作需要在指针p指向的元素之前插入,由于在不带头结点的单链表中,第一个元素之前没有结点,只有一个头指针l,所以我们在编写代码时,需要额外的写出在第一个结点前插入元素的代码。
不带头节点的单链表
示例如下:
boolListInsert(LinkListl,inti,inte){
if(i1){
returnfalse;
//TODO
}//先判断输入的i值是否合法
if(i==1){
LNode*s=(LNode*)malloc(sizeof(LNode));
s-data=e;
s-next=l;
l=s;
//TODO
returntrue;
}//如果i值为一,则新申请一块内存空间,将e的值放入其中,把它的next指针指向头指针l原来指向的结点,也就是上图中的a1结点,最后将l指向s。
LNode*p;
intj=1;
p=l;
while(p!=NULLji-1){
p=p-next;
j++;
//TODO
}
if(p==NULL){
returnfalse;
//TODO
}
LNode*s=(LNode*)malloc(sizeof(LNode));
s-data=e;
s-next=p-next;
p-next=s;
returntrue;
}//否则与带头结点的单链表实现方法相同,只是j初始值为1,因为没有头结点。
以上就是本篇文章的全部内容了,在文章中,作者将介绍有关单链表的其它操作,欢迎大家在下方评论,留言。