前言:
链表对于大多数同学来说可能都是一个大难题,无论是以前C语言,还是现在的数据结构,似乎都让同学们感觉到十分困难。甚至有这种感觉:自己动手编代码的时候,完全不知道怎么编。为了方便大家理解,我用较简单的思维总结了一下,希望对大家有帮助。
再次说明:
以下内容仅仅是个人的一些见解,上不得台面,真正的代码实现还是要看那些大佬的博客。
首先是单链表存储结构的类型定义,我们先来想一想,一个链表,它的每个结点可以分为两个部分,即数据域和指针域。所以我们就定义了一个结构体,包含数据域和指针域这两个元素。
typedef struct LNode{
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
}LNode,*LinkList; //LinkList相当于LNode *
LinkList L; //LinkList L相当于LNode *L
typedef在这里的作用是“起小名”,即把这个结构体又叫做LNode,这样可以极大的方便我们的编程。除此之外,链表刚开始需要一个头指针,所以我们在这里将其一并定义出来。
我们现在再来回顾一下链表的定义过程:大家在脑海中自行脑补链表的样子,是不是每个结点有两个部分,分别存放数据和指针。另外,它还要一个头指针。所以,我们可以很清晰的将其过程理解并运用起来。
然后是单链表的初始化,初始化其实就是构造一个空的单链表,这个比较简单,所以不再详细说明。
接下来到了最为重要的点:单链表的创建。假设我要将n个元素接上去,那么只需要循环n次就可以了。由于前面初始化的时候,我们已经有了一个头结点,所以接下来我们需要申请内存空间,有了空间之后,我们就可以把数存放进去。那么现在,我们已经有了许多个结点,但是他们还没有连起来,因此,我们需要将其连起来以形成链表。
CreatList(&L,n)
{ //输入n个元素的值,建立带头节点的单链表L
L=new LNode; //用L指向新生成的头结点
//C语言:L=(LNode*)malloc(sizeof(LNode))
L->next=NULL; //头结点指针置为空
r=L; //让尾指针r指向头结点
for(i=0;i<n;++i)
{
p=new LNode; //用p指向新生成的头结点
cin>>p->data;
p->next=NULL; //输入值,赋给(*P).data,(*p).next
r->next=p; //将新结点*p接到尾结点*r之后
r=p;
}
}
我们这个最后一行的目的是为了尾部值的更新,由于我们在接的时候,原本的尾指针现在就不再是尾指针了,因此我们需要对其进行更新。以确保r所代表的指针无论何时都是尾指针。
对于单链表的基本操作,我只总结到这里,我知道肯定有很多大佬看到了会笑话我,不过,如果发现错误的话,请一定要告诉我,毕竟我初学编程,很多地方都难免会出错。
希望我的说明能够帮助你理解。
本文章原创,转载请注明出处。