个人对头插法与尾插法的理解(c语言)

头插法:

 

 

插入:

 注意:第一个步骤跟第二个步骤不能反过来,否则会造成链表丢失

二次插入:

 最后:

 

用代码实现:

#include <stdio.h>
#include <malloc.h>


typedef struct _Node {
	int data;			//数据域
	struct Node* next;	//指针域
} Node;	//定义一个节点类型


int main() {
	int i;
	
	Node* headnode, * newnode;	//将Node的地址用指针保存起来
	headnode = (Node*)malloc(sizeof(Node));	//给头节点分配一个Node大小的内存空间使得指针可以指向节点的数据域跟指针域
	headnode->next = NULL;			//初始化头节点


	printf("请输入数据\n");
	for (i = 0; i < 3; i++) {
		
		newnode = (Node*)malloc(sizeof(Node)); //给新节点分配一块内存空间
		scanf("%d", &newnode->data);			//给新节点输入数据
        //头插法代码
		newnode->next = headnode->next;			//将新节点插入到头节点的next域
		headnode->next = newnode;				//在将头节点的next域链接到新节点


	}//用for循环实现输入一个数据就生成一个新节点

	//历遍链表,输出链表内的数据
	Node* p;
	p = (Node*)malloc(sizeof(Node));
	p = headnode->next;
	while (p != NULL) {

		printf("%2d", p->data);
		p = p->next;

	}
}

最后 输出:

 由此可得出,头插法的顺序是反过来的,想要实现顺序的输出,就需要用到尾插法

尾插法:

顾名思义,尾插法是从尾巴插入,因此我们需要定义一个尾指针,通过尾指针来实现插入

 插入:

注意:2跟3的操作不能相反,否则链表会生成出错 

 二次插入:

最后:

 

用代码实现:

#include <stdio.h>
#include <malloc.h>


typedef struct _Node {
	int data;			//数据域
	struct Node* next;	//指针域
} Node;	//定义一个节点类型

int main() {
	int i;
	Node* headnode, * newnode, * last;
	headnode = (Node*)malloc(sizeof(Node));//给头节点分配一个Node大小的内存空间使得指针可以指向节点的数据域跟指针域
	headnode->next = NULL; //初始化头节点
	last = headnode;		//将头节点地址赋值给尾指针
	printf("请输入数据\n");
	for (i = 0; i < 3; i++) {

		newnode = (Node*)malloc(sizeof(Node));	//给新节点分配一块内存空间
		scanf("%d", &newnode->data);			//给新节点输入数据

		//尾插法
		newnode->next = NULL;	//链接头节点的NULL域
		last->next = newnode;	//通过尾指针来连接新节点
		last = newnode;			//将尾指针插入新节点,以方便第二次插入
	}
	Node* p;
		p = (Node*)malloc(sizeof(Node));
		p = headnode->next;
		while (p != NULL) {
	
			printf("%2d", p->data);
			p = p->next;
	
		}

}

 最后代码输出:

 因此,这种从尾部插入的方式,是比较符合我们使用的

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃椰子不吐壳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值