于是我们可以继续写代码了:
int main(){
//创建上图的链表
node *head;//一个头指针。用来指向这个链表的第一个节点
node *f=new node;//对应上图第一个节点first node,这种奇葩命名法不是我要让你们学会的,另我使用了new而不是malloc主要是因为惰性
node *s=new node;//对应上图第二个节点second node
node *t=new node;//对应上图第三个节点third node
f->data=8;//第一个node的值
f->next=s;//第一个节点next指针指向第二个节点
s->data=7;//第二个node的值
s->next=t;//第二个节点next指针指向第三个节点
t->data=9;//第三个节点值
t->next=NULL;//从上图得知第三个节点后没有节点了,所以指向NULL,通常称这个节点为尾节点
head=f;//头指针指向第一个节点,至于为什么前面已经说了//打印这个链表里面储存的元素
std::cout<<"链表数据:"<<"\n";
node *print_ptr=head;//为什么这里要new一个print_ptr 因为我们可能还要利用head进行其他操作,如果直接用head进行下面的操作,就意味着head指向的位置已经改变了
while(print_ptr!=NULL){
std::cout<data<<"\n";//通过头结点迭代打印每个节点的值
print_ptr=print_ptr->next;//更新,让当前指针指向下一个节点
}
//输出节点的个数,虽然我们已经知道了是3个
node *length_ptr=head;//同上面的
print_ptrint k=0;
while(length_ptr!=NULL){
k++;length_ptr=length_ptr->next;
}
std::cout<<"链表节点个数:"<<"\n"< node *ins_node=new node;//为即将插入的节点从堆上分配点内存
ins_node->data=14;//赋值
ins_node->next=s;//让新节点的next指向第二个节点
f->next=ins_node;//然后让第一个节点的next指向新节点,这就完成了插入//删除之前插入的节点
ins_node=f->next;//让第一个节点next指向新插入的节点,这里你可能会感到疑惑,我建议你画图或者再看看上面的图就能理解,当然你也可以看下面
f->next=ins_node->next;//第一个节点的next指向新节点的next,因为新节点的next相当于指向了第二个节点,所以这里也等价于第一个节点指向第二个节点f->next=f-next->next
system("pause");
}
上面就完成了使用尾插法创建的一个链表及其简单操作包括创建/输出/插入/删除,不过如你所见它也存在许多不足,比如命名的拙计,new后没有delete,以及全部在main中执行没有考虑使用函数等等缺陷,不过这没关系,因为我们会一步步修改最终让他成为一个不错的链表