图片来自于 王道考研 头插法建立单链表
链表建立与插入类似,头插法即在头结点的后继插入,输出结果与输入结果相反,如下图想得到
a,b,c,d,,e应输入e,d,c,b,a
头插法核心代码
图片来自于 bilibili 青岛大学 王卓老师
头插法代码(如有错误,请指正,作者转行小白)
#include尾插法建立单链表#include //头插法建立链表 typedef struct node { int data; struct node* next; }Node, * linkList;//数据建立 linkList create(linkList L, int arr[], int n) { linkList p; L = (linkList)malloc(sizeof(Node));//为头节点开辟空间,并将头指针L指向头结点 if (L == NULL) { //判断空间分配是否成功(不判断会报错) printf("内存分配不成功!n"); } else { L->next = NULL; //头结点指针域为空,空表判断 for (int i = 0;i < 5;i++) { p = (linkList)malloc(sizeof(Node)); //为普通结点开辟空间 if (p == NULL) { printf("内存分配不成功!n");//判断空间分配是否成功(不判断会报错) } else { p->data = arr[i]; //为结点设置数据域 p->next = L->next; //第一次为尾结点 后面为当前节点的next域指向后 // 一个节点 L->next = p; //将当前节点与前一个节点相连 } } } //判断空间分配是否成功(不判断会报错)对应上面L开辟的if return L; //返回头指针 L } void print(linkList q){ //打印链表 linkList p; p = q->next; //设置p为头结点 while(p){ // if(p)等价if(p!=NULL) printf("%d ", p->data); p = p->next; //跳向下一个结点 } } int main() { linkList L = 0; linkList q = 0; int arr[5] = { 1,2,3,4,5 }; //链表成员 int n = 0; //链表总共n个 q=create(L, arr, n); //单链表建立 print(q); //单链表打印/遍历 return 0; }
尾插法顾名思义为在尾部插入结点,与头插法不同在当同样输出a,b,c,d,e只需正序输入即可。在用尾插法时应注意创建尾指针与头指针共同指向头结点,再进行普通节点创建。
图片来自于 bilibili 回忆那山那水
尾插法创建单链表代码如下:
#include#include #include #include //头插法建立链表 typedef struct node { int data; struct node* next; }node,*linkList; linkList create(linkList L,int arr[],int n) { L = (linkList)malloc(sizeof(node)); //开辟空间并将头指针指向头结点 if (L==NULL) { printf("内存分配不成功!n"); } else { L->next = NULL; linkList end = L;//创建 尾结点并指向头结点 linkList p; for (int i = 0;i < 5;i++) { p= (linkList)malloc(sizeof(node)); if (p==NULL) { printf("内存分配不成功!n"); } else { p->data = arr[i]; end->next = p; //将头指针的next域指向p(连接前后结点) end = p; //将p的数据域指针域赋给尾结点,之后p继续创造下一个结点 } } p->next = NULL; //最后的结点的指向为NULL //该处p是否可以用end } return L; } void print(linkList q) { //n为总个数 linkList p; p = q->next; //设置p为头结点 while (p) { // if(p)等价if(p!=NULL) printf("%d ", p->data); p = p->next; //跳向下一个结点 } } int main() { linkList L = 0; linkList q = 0; int arr[5] = { 1,2,3,4,5 }; //链表成员 int n = 0; //链表总共n个 q=create(L, arr, n); //单链表建立 print(q); //单链表打印/遍历 return 0; }
头插法 尾插法流程图对比
头插法 尾插法代码对比
//头插法核心代码段:
p->next = L->next; //先将插入第n个节点与n+1连接
L->next = p; //再将n-1与第n节点相连
顺序不可以颠倒,n-1节点先连接n则导致后面找不到n+1
//尾插法核心代码段: end->next = p; //将头指针的next域指向p(连接前后结点) end = p; //将p的数据域指针域赋给尾结点,之后p继续创造下一个结点
与头插法不同在于。尾插法是在上一结点尾部插入,
因此不需要进行第一步操作,即L—next=p—next;
直接进行头结点与当前相连即可,但end需指向p,p即可进行下一个节点的创建
最后要将尾结点next域置为空 即 p->next=NULL;



