1.尾插法
头指针和尾指针都指向头结点,然后往里边插入元素,
每插入一个元素尾指针就后移一下
其中如下图所示 尾插法的核心代码是:
pointer->next = s; //pointer指向新生成的节点
pointer = pointer->next;//pointer移动至新节点位置
尾插法建立单链表的算法如下:
#include <stdio.h>
#include <stdlib.h>
struct Test
{
int data;
struct Test *next;
};
void printLinklist(struct Test *head) //验证链表打印函数
{
struct Test *point = head;
while(point != NULL)
{
printf("the data of the Linklist is:%d\n",point->data);
point = point->next;
}
}
struct Test* creatLinklistofBehind(struct Test *head) //尾插法创建链表
{
struct Test *now= NULL;
struct Test *point = head;
//head->data = 1; //如果用方法一 便在头结点的data不存储数据
while(1) //循环建立链表
{
//动态申请一个名称为now的Node*指针类型的节点
now = (struct Test*)malloc(sizeof(struct Test));
now->next = NULL; //初始化now的next指针为空指针,指向NULL
printf("Please Input the data to the newLink:\n");
scanf("%d",&(now->data)); //对data进行赋值
if(now->data == 0) //当data=0 时退出
{
printf("the data is 0:Quit!\n");
printf("\n");
free(now); //释放now指针
return head; //返回Test型指针
}
//注意如果用方法一 便动态建立头节点,并head ,point=now的操作要同时进行,保证两指针都是指向 相同头节点地址
if(head == NULL)
{
head = now;
point=now;
}
else{
while(point->next != NULL)
{
point = point->next; //让point指针指向下一个结点,保证它指向链表尾部
}
point->next = now; //让point指针指向的结点的next成员指向新建结点now
}
}
}
int main()
{
//方法一 直接在creatLinklistofBehind 定义出头指针及其初始化
struct Test *head = NULL;
//方法二 可以先动态申请一个名称为head的Test*指针类型的头节点
/*head = (struct Test *)malloc(sizeof(struct Test));
head->next = NULL; //初始化next=NULL
*/
head = creatLinklistofBehind(head);
printLinklist(head);
system("pause");
return 0;
}
打印结果:
2.头插法
- 头插法:从一个空表开始,重复读入数据,生成新节点,将读入的数据域存放到新结点的数据域中,然后将新结点插入到当前链表的表头结点之后,直至读入结束为止
其中如下图所示 头插法的核心代码是:
now->next = head; //将头节点,赋值给新创建的下一个节点
head = now; //将新创建的结点的地址赋给头指针的结点
头插法建立单链表的算法如下:
#include <stdio.h>
#include <stdlib.h>
struct Test
{
int data;
struct Test* next;
};
void printLink(struct Test* head) //链表打印检测函数
{
struct Test* point;
point = head;
while(point!=NULL){
printf("%d",point->data);
point = point->next;
}
}
struct Test* insertFromHead(struct Test *head,struct Test *now) //头插法处理函数
{
if(head == NULL){ //判断head是否创建有节点
head = now;
}else{
now->next = head; //将头节点,赋值给新创建的下一个节点
head = now; //将新创建的结点的地址赋给头指针的结点
}
return head; //返回头节点
}
struct Test* creatLink(struct Test *head)
{
struct Test *now;
while(1){
now = (struct Test*)malloc(sizeof(struct Test)); //创建新节点,并开辟空间
now->next = NULL;
printf("input");
scanf("%d",&now->data);
if(now->data == 0){ //退出链表的创建
printf("0退出\n");
free(now);
return head;
}
head = insertFromHead(head,now); //调用函数循环插入节点
}
}
int main()
{
struct Test* head=NULL;
head = creatLink(head);
printLink(head);
system("pause");
return 0;
}
打印结果: