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;
}
打印结果: