我们创建一个长度为n的链表时,可以采取头插法创建或者尾插法创建,本篇博客我们采取头插法来创建,(作者只学了头插,尾插等以后来补qwq)。
我们先来画图来看看头插的创建形式把,会了原理再写代码。
首先是我们的一号和二号节点,我们发现他们是相连的。现在我们使用头插法创建链表要怎么做呢,其实很简单,头插就是把我们新创建的节点放到最前面,我们每次都把创建的节点放到最前面,也就是1好节点的后面。大家注意了,这个一号节点不要存储任何数据或者(这能存储链表的长度信息,)它是我们的头节点。我们创建它只是为了好遍历以后的节点信息。
看图:
我们把一号节点的next地址连接到三号节点,三号的next地址连接到2号节点上,这就是头插。
上代码解释:
void InitList(LinkedList a,int n){
int e;
for(e=0;e<n;e++){
Lnode *b=(Lnode*)malloc(sizeof(Lnode));
b->a=e;
b->next=a->next;
a->next=b;
}
}
//a号节点是指向节点,我们之后创建的节点都是不断放在a号节点的后面,a号节点只是用来方便遍历。
//我们创建一个b节点,并为他的数据域赋予数值,接着,我们令b号节点链接a号节点链接的节点,并使得a号节点可以连接到b号节点。
//如果是一开始,只有指向a号节点,我们就相当于创建一个尾节点,指向空,令a号节点联系到尾节点
结构体代码:
typedef struct Lnode{
int a;
struct Lnode* next;
}Lnode,*LinkedList;//创建结构体,把结构体的别名起为Lnode
//把结构体Lnode的指针起名为LinkedList
//学过Java的同学是不是DNA动了呢qwq
创建指向节点的代码:
void test(){
LinkedList a=(LinkedList)malloc(sizeof(Lnode));//动态开辟空间
a->next=NULL;//令指向节点的next指向域为NULL
int b;
cin>>b;//输入链表的长度
InitList(a,b);
for(int c=0;c<b;c++){//打印验证成果
a=a->next;
cout<<a->a<<endl;
}
free(a);//释放a的空间
}
详细代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct Lnode{
int a;
struct Lnode* next;
}Lnode,*LinkedList;
void InitList(LinkedList a,int n){
int e;
for(e=0;e<n;e++){
Lnode *b=(Lnode*)malloc(sizeof(Lnode));
b->a=e;
b->next=a->next;
a->next=b;
}
}
void test(){
LinkedList a=(LinkedList)malloc(sizeof(Lnode));
a->next=NULL;
int b;
cin>>b;
InitList(a,b);
for(int c=0;c<b;c++){
a=a->next;
cout<<a->a<<endl;
}
free(a);
}
int main(){
test();
return 0;
}
运行结果:
大家可以看到这个6是我输入的,5到0为答案。为什么呢,我们采用头插,会把新创建的节点不断往前安防,而我们赋值又是从0开始,这就使得我们的最后一次赋值5用头插放到最前面了。