C语言头插法建立单链表
nefu_lmy 人气:0首先要明确一点,利用头插法建立出来的单链表的输出都是逆序的(就是和你的输入顺序反着来的)然后就是要明确生成的新结点是一个个加在某个结点的前面的(这个结点不一定是头结点,下面的代码是插在p的前头),这就是头插法。
怎么将结点一个个插入在某个结点前面呢?
下面的图可以比较详细的展示出来:
至少对我来说挺详细的哈
p->next=head->next; //一开始 head->next=NULL; head->next=p;//然后将p指针指向head结点指向的下一个结点
以下是图像展示:
然后再在头结点的后面插入新的结点
再执行一遍上面的代码, 然后head后面就连上了新的结点,p原本指向的结点前面也增加了一个新的结点,然后p就指向新加入的结点了。
以下是图像展示:
注!:要先写p->next=head->next,然后才能写head->next=p;因为如果先写head->next=p,然后再写head->next=p->next,结果就会变成head->next原本要指的是插入的结点,然后又p->next=head->next,那 head->next最后指向的就不是要插入的结点了,变成了p要指向的下一个结点,而p->next一开始就是NULL。
也就是说,新的节点根本就没连上去,p的前面根本没有插入新的结点,head->next也一直是NULL。(这段看不懂就不看了)
然后就是不断地重复上述过程,在头节点和新插入的节点之间建立联系,同时在新插入的节点和上一个插入的节点之间建立联系,最终得到一个完整的单链表。
以下是代码展示:
#include <bits/stdc++.h> using namespace std; //利用头插法建立的单链表输出都是逆序的 typedef struct node { int data;//数据域,存放数据 struct node *next;//指针域,存放指针,存放后继结点的信息 }no;//no是结构体的名字 int main() { no *head,*tail,*p; head=new no; head->next=NULL; tail=head; int n; cin>>n; while(n) { p=new no; p->data=n; p->next=head->next;//第一次的时候p->next指的是NULL, //再往后,指的就是头结点后面的结点 head->next=p;//指针p也可以向前移动的哦,不一定就是要向后移动 cin>>n; } p=head->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); return 0; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容