前言
个人认为单链表和结构体是有点相像的,如果不理解单链表为什么会是这样的组成的话,你可以先记住大致单链表的结构和使用的方法,如果文章中哪里写错的话,可在下方进行评论。
文章末尾有具体的C++单链表代码,你可以复制该代码并结合文章进行理解。
此文章仅在C++中实现,如果要使用C语言的话可能需要动态声明空间。
介绍
单链表顾名思义,就是一条链,只不过这链条上面存在着一些节点,
节点中又能够存储数据和下一个或者上一个节点的地址,下图可以更好地理解单链表的构成。
通常来说,不会对链表的第一个节点的数据进行操作,第一个节点即头指针,头指针主要是用来标志链表头,末尾的节点的指针需要指向空,不然没法判断链表什么时候结束。
如果是循环链表的话,则是将末尾节点指向头指针,判断结束则是看移动到某个节点时,当前节点的next指针是不是指向了链表头。
<1>链表结构
链表的建立有几种方式,此处仅介绍其中的一种单链表建立和使用的方法。
Node可以自己命名,指针域是固定的写法,几个指针就是几链表
当你需要新的指针或是新的数据时,就直接在花括号内进行添加即可。
typedef struct Node
{
int Data;//数据域
typedef struct *Next;//指针域
}LNode,*List;
//LNode为一种类型
//List为LNode类型的指针
需要声明一个具体单链表,才能进行使用
<2>声明一个链表
法1
List L;//声明一个链表L
法2
LNode *L;//声明一个链表L
链表当中的节点不是直接就能够生成的,需要先创建好节点才能够使用那个节点。
其中的Node为typedef struct Node中自定义名称。
<3>创建节点:
法1
List p;//声明
p=new Node;//分配空间
p->Data=233;//数据域赋值
法2
LNode *p;//声明
p=new Node;//分配空间
p->Data=233;//数据域赋值
当声明好单链表的表名,并创建了一个节点之后,就需要将头指针指向那个创建的节点,从而之后需要读取节点信息的时候能够从头指针跳到该节点。
<4>添加新节点
假设Now表示为末尾节点,如果链表中仅有头节点的话,链表名L即为Now。
此处为在表末添加节点,在表头添加节点相当于插入新节点的操作。
Now->Next=p;//尾节点指向新节点p
<5>插入新节点
如果需要在链表的中间插入某个节点的话,不能随意断开指针,不然断开点之后的内容将会没法访问。
此时就需要先将对新节点进行操作,将节点的指针指向即将断开的节点,这时才可断开原链表指针。
根据插入位置的不同,可以分成两种插入方式,但是在单链表中当前节点没法访问前一个节点。
假设当前节点为Now时,需要在Now之后添加一个新节点p
Now的下一个节点可以用Now->Next来表示。
p->Next//将新节点指向Now节点的下一个节点
Now->Next=p//将指针断开并指向新节点
执行过程如下
<5>删除一个节点
删除节点和添加节点类似,因为单链表没法访问到前一个节点,所以只能删除当前节点Now的下一个节点,头节点的用处之一就在这,如果头结点中含有数据且需要删除时,则单链表中就没有头节点的前一个节点可以访问。当头节点不放置数据也不需要进行删除的操作,就避免了此类情况的发生。
在单链表中,要删除一个节点的时候,需要将Now定位在需要删除节点的前一个节点。
Now->Next=Now->Next->Next;//直接将当前节点指向删除节点的下一个节点
如果删除的节点是最后的一个节点,则直接将Now指针指向空即可。
代码实现
实现输入多个数字,并显示所有的数字
/*
代码作者:小狐狸
联系QQ:1307509553
使用语言: c++
原贴链接: https://blog.csdn.net/smallfox233/article/details/105117117
*/
#include<iostream>
using namespace std;
typedef struct Node
{
int Data;//数据域
struct Node *Next;//指针域
}LNode,*List;
int main()
{
List L;//声明链表
L=new Node;//创建头节点
List Now;
Now=L;//指向头节点
while(1)
{
int fox;//临时变量
cout<<"-------------------"<<endl;
cout<<"| 0. 退出 |"<<endl;
cout<<"| 1. 输入 |"<<endl;
cout<<"-------------------"<<endl;
cin>>fox;
if(fox==0) break;
cout<<"请输入一个数字: "<<endl;
int x;
cin>>x;
List p;//声明一个节点
p=new Node;//分配空间
p->Next=NULL;//指针域置空
p->Data=x;//数据域赋值
Now->Next=p;//将新节点添加到链表末尾
Now=p;//移动到末尾节点
}
Now=L->Next;//指向头节点的下一个节点
cout<<"存入的数字为: ";
while(Now)//当前节点不为空时继续循环
{
cout<<Now->Data<<" ";//输出数字
Now=Now->Next;//移动到下一个节点
}
cout<<endl;
return 0;
}