简单数据结构—链表
目录:
一、链表理解及图示
二、链表的简单构造和代码实现
刚刚开始学习简单数据结构,看了许多大佬的链表仍然不是很懂,仔细想过之后终于明白,当作笔记记录一下
Ⅰ.链表理解:
①链表概念:
通俗意义上讲,链表就是链接起各个存储空间的线性表,特点就是单向链接可以逐级遍历(单项),一级一级将数据串联起来,使得数据具有连续性,但连续性为抽象上的连续而不是物理上的连续,例如第一个的内存空间的地址为0x0123
, 第二个内存空间的地址可能为0x256
, 两者物理上不连续,但由于结构体内第一级的next指针中存放第二级的首地址,则两者抽象上连续。
如下图(图片来源于百度)
其实这样描述可能有些抽象,但总的来说实际链表就是由一个由一个单独的结点通过next指针将许多结点串联起来。
②链表构成部分:
链表构成部分:数据域&&指针域
例如上图中所画,我们将一个结点分成两部分,一部分存储我们需要的data(即数据域),另一部分设为结构体指针使它指向下一个结构体变量(即next指针,指针域),也就是我们的第二个节点,这样第一个和第二个结点就串连起来了。
Ⅱ.链表的简单构造和代码实现
链表的构造方法主要为头插法和尾插法两种,下面都将由代码实现。链表的基本操作为增、删、改、查,具体实现这里不阐述。
——尾插法
重点理解头指针不移动动,将尾指针向后移动,并通过next指针直接指向下一个结点,由此实现串联。
//尾插法构造单链表
typedef struct List{
int data;
List *next;
};
struct List *head=NULL,*tail=NULL;//规定出链表的头与尾
struct List * CreateList(){
struct List *node=(struct List*)malloc(sizeof(struct List));//为一个结点开辟新的空间
node->data=0;//初始化,可以将第三行代码改为data=0,也可以实现,避免非法
node->next=NULL;//初始化,避免野指针
cin>>node->data;
//以上为单个结点的创建,以下为将此结点插入链表中
if(head==NULL)//判断头指针是否为空,若为空,则链表中一个元素也没有
head=node;
else //否则,就让尾指针的next指向此结点
tail->next=node;
tail=node;//尾结点变为此结点,后移
returen head;
}
——头插法
相当于尾插法的相反版本,利用尾指针不动,将新创建的结点插入到现有节点之前,并将头结点前移,并由此实现串联。
//头插法构造单链表
typedef struct List{
int data;
List *next;
};
struct List *head=NULL,*tail=NULL;
struct List *Creatlist(){
struct List *node=(struct List*)malloc(sizeof(struct List));//为一个结点开辟新的空间
node->data=0;//初始化,可以将第三行代码改为data=0,也可以实现,避免非法
node->next=NULL;//初始化,避免野指针
cin>>node->data;
if(head==NULL)
head=node;
//以上结点创建过程与尾插法完全一致
else //链表不为空,则让此结点的next指针指向头
node->next=head;
head=node;//新结点变为头,前移
return head;
}
第一次写博客,希望各位大佬能够将错误及时指出并且提出改进的建议!