开篇前言
本文章将会详细展示一个链式存储结构-----链表的创建到各功能实现的全部过程,最后我们将会将他们写成头文件保存下来。
基础知识预备:
关于这块的基础知识,大家简单看看这篇博客就可以了:结构体简介
没错掌握这点基础知识就够了,你只要明白,指针就是一个能指向内存地址的变量就够了,不多BB,接下来直接通过实例进行讲解:
初始化、创建、输出一个链表
代码如下
#include<bits/stdc++.h>
using namespace std;
typedef struct LNode
{
int data;
LNode *next;
}LNode ,*LinkList;
void Init_Link(LinkList &L){
L=new LNode;
L->next=NULL;
L->data=0;
}
void Creat_Link(LinkList &L){
LNode * p;
LNode * now;
now = L;
int n ;
printf("please input the number of data");
cin>>n;
if (n==0)
return ;
while (n--)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
L->next=p;
L=p;
}
L=now;
}
void Print_Link(LinkList L){
L=L->next;
while(L!=NULL){
cout<<L->data<<" ";
L=L->next;
}
cout<<endl;
}
int main(){
LinkList L;
Init_Link(L);
Creat_Link(L);
Print_Link(L);
}
/*
the text sample:
3
1 2 3
output:
1 2 3
*/
那么我们来看一下这段程序
从节点看起
typedef struct LNode
{
int data;
LNode *next;
}LNode ,*LinkList;
这就是一个简单的链表节点的组成,没什么好说的,不过值得一提的是 LNode*==LinkList 这两个类型是等价的
我们来看我们的第一个函数
Init_Link(Link_List L){}
对于这个函数来说他要完成的功能就是:
①给链表的表头初始化空间,这一部分我们是使用new函数来实现的,那么能不能使用malloc呢?答案是肯定的
L=(LNode *)malloc(sizeof(LNode)) 等价于 L = new LNode
②给表头赋初始值也就是:
L->data=0;
L->next=NULL;
我们要始终保证链表中的最后一个节点的next指针指向空,这样我们才能知道我们的链表究竟什么时候结束
我们再来看第二个函数
Creat_Link(LinkList &L){}
对于这个函数来说我们需要实现这么几个功能
①输入我要输入的数据的个数,这个仔细读程序,我没话说
②进行节点的链入
这段的核心代码在于:
p=new LNode;
cin>>p->data;
p->next=NULL;
//先对新的节点初始化
L->next=p;
//链入
L=p;
//为了便于理解也可以写成 L=L->next;
这个地方就是一个节点的链入,具体逻辑如图所示,这就是链入过程,然后进行循环就可以实现了。
我们来看最后一个函数
Print_Link(Link_List){}
这个函数具体就实现输出功能即可
我们要如何遍历这个链表呢,只要是我们当前节点的next指针指向空就说明我已经到最后了,就不需要在往后了,代码如下:
while(L!=NULL){
cout<<L->data<<" ";
L=L->next;
}
看完基本用法之后我将会在下一篇博客中写一写更加高级的用法主要有:
Rev_Link(L){}:翻转链表
Get_Lnode(L,n){}:得到某个具体节点的数值
Sort_Link(L){}:链表排序
Insert_LNode{}: 插入
del_Lnode{}: 删除某个节点
Des_LInk(){}:删除所有的节点
Cleat_Link(){}:清空链表
Swap(LNode n1,LNode n2){}:交换节点