链表头插法

2023-05-16

头插法
从一个空表头指针开始,重复读入数据,生成新节点, 将读入数据存放到新节点的数据域中,永远是将新节点插入到当前链表的头节点的后面,第一个创建的节点是放在最后的,直到读入结束标志才停止创建。

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
	int date;			//数据域 
	struct Node *next;	//存储节点的地址 
}LNode,*Linklist;

 Linklist Creat_list(Linklist head);


 void Illustrate(Linklist head)//输出每个节点的数据域 函数 
 {
 	Linklist tem = head;//将头指针的地址赋给临时的指针
	 while(tem->next != NULL)//这个临时指针的值就是头指针的地址
	 //然后这个临时指针指向的下一个地址 不断更替为当前的临时指针所在地址 
	 {
	 	tem = tem->next ;
	 	printf("%d\n",tem->date );
	  } 
 }




int main()
{
	Linklist head = NULL; //链表的头指针
	//head只是一个指针,在它malloc之前,它并没有date,也没有->next 
	printf("head=%p\n",head );
	head = Creat_list(head);//创建链表 ,把头指针穿进去创建链表的函数 
	Illustrate(head);		//输出每个节点的数据域 
	 system("pause");
	 return 0;
 } 
 
 /*头插法*/
 /*从一个空表开始,重复读入数据,生成新节点,
 将读入数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头节点之后,
 直到读入结束标志为止*/
 
 Linklist Creat_list(Linklist head)
 {
 	head = (Linklist)malloc(sizeof(LNode));//为头指针开辟内存空间
	
	if(head==NULL)
	{
		printf("failure\n");
		exit(-1);
	 } 
	printf("第一次开辟head = %p\n",head );
	printf("第一次开辟head->next = %p\n",head->next );

	
	LNode *node = NULL;//定义新节点
	printf("初始化节点node=%p\n",node);
	 
	int count = 0;//初始化创建节点的个数
	head->next = NULL;
	printf("初始化head->next = %p\n",head->next );
	node = head->next ;//将最后一个节点的指针域永远保持为NULL 
	printf("\n"); 
	printf("请输入节点个数:");
	scanf("%d",&count);
	for(int i = 0;i<count;i++)
	{
		node = (Linklist)malloc(sizeof(LNode));//为新节点开辟内存空间
		printf("第%d个node = %p\n",i+1,node); 
		printf("第%d个node->next = %p\n",i+1,node->next ); 
		node->date  = i;			//为新节点的数据域赋值
		
		/*关键在于理解以下两句!!!*/
		node->next = head->next;  //将头指针所指向的下一个节点地址赋给新创建的节点的next 
		head->next =node; //将新创建的节点的地址赋给头指针的下一个节点 
		
		printf("新node->next = %p\n",node->next );
	 	printf("新head->next = %p\n",head->next );

	
	  }  
	  return head; 
 }
 
 

在这里插入图片描述
在这里插入图片描述

参考博文
自己再练习一下头插法

//自己练习一遍头插法
#include <stdio.h> 
#include <stdlib.h>
typedef struct NODE//定义节点结构体 
{
	int date;//数据域
	struct NODE *next;//指针域 
}NODE;

  void Print_linklist(NODE *head);
 NODE *Create_linklist(NODE *head);
int main()
{
	NODE *head = NULL;//声明一个head指针为空
	head = Create_linklist(head);
	Print_linklist(head);
	return 0;
 } 

/*头插法就是,在头节点之后不断插入新添加的新节点node,
并且每次新加节点都要改变head->next指向的地址为新添加节点的地址,
然后还要把新添加的节点  ->next 的地址 的改为上一个创建的节点的地址,
这是头插法最关键的两步 
头插法第一个创建的node为最后一个节点,指向NULL*/ 
 
 NODE *Create_linklist(NODE *head)
 {
 	head = (NODE*)malloc(sizeof(NODE));//为头指针开辟内存 
 	if(head == NULL)
 	{
 		printf("failure\n");
 		exit(-1);
	 }
 	NODE *node = NULL;					//声明NODE结构体指针类型的新节点node并初始化 
 	//此时head!=NULL,node=NULL

	head->next = NULL;
	
	 int count;
	 printf("请输入链表节点的个数:\n");
	 scanf("%d",&count);
	 int i;//循环变量 
	 for(i=0;i<count;i++)
	 {
	 	 node = (NODE*)malloc(sizeof(NODE));//为新节点开辟内存 
	 //开辟内存之后呢,该node的地址是新开辟出来的,
	 //不过呢,它里面的->next却是不会开辟出来的哦,
	 //每次开辟新的node里面的->next一直都会是同一个。
		 node->date = i;
	 	node->next = head->next ;
	 	head->next = node; 
	  } 
	 return head;
  } 
  
  void Print_linklist(NODE *head)
  {
 	while(head->next != NULL)
 	{
 		head = head->next ;//head是空节点,上面没有存放date,要head的下一个才有存放数据 
 		printf("head->date = %d\n",head->date );
	 }
  }

在这里插入图片描述
接下来练习一下不用for,而是用while的情况,把以上代码从int count;到整个for循环结束的这块修改为

    int date;
	printf("请为节点数据域输入整数date:\n");
	scanf("%d",&date);
	printf("当输入date为0时停止创建节点。\n");
	while(date) {
		node = (NODE*)malloc(sizeof(NODE));
		node->date = date;
		node->next = head->next ;
		head->next = node; 
		scanf("%d",&date);
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表头插法 的相关文章

随机推荐

  • WSL2使用Nvidia-Docker实现CUDA版本自由切换

    众所周知 xff0c 深度学习的环境往往非常麻烦 xff0c 经常不同的项目所依赖的 torch tensorflow 包对 CUDA 的版本也有不同的要求 xff0c Linux 下进行 CUDA 的管理比较麻烦 xff0c 是一个比较头
  • 基于51单片机——60秒倒计时时钟

    设计要求 xff1a 两个数码管实现从59开始显示倒计时时钟 硬件电路连接 程序 include lt reg52 h gt unsigned char second timer void t1 init 中断初始化 TMOD 61 0x1
  • 【STM32】使用VSCode编辑STM32cubeIDE工程

    问题描述 xff1a 使用VSCode编辑STM32cubeIDE工程解决路径报错问题 操作步骤 第一步 xff1a 用VSCode打开创建好的STM32cubeIDE工程的文件夹 如图会看到很多报错 第二步 xff1a 创建VSCode文
  • 机器学习之逻辑回归

    一 逻辑回归基本介绍 Logistic Regression 用于分类问题监督学习算法 二 逻辑回归工作原理 根据现有数据对分类边界线建立回归公式 xff0c 具体分为以下三步 1 将决策边界表示为 z 61 W1X1 43 W2X2 43
  • Java数组:一维数组中元素移动问题

    描述 描述 给定一组整数 xff0c 要求利用数组把这组数保存起来 xff0c 实现对数组中的数循环移动 假定共有n个整数 xff0c 则要使前面各数顺序向后移m个位置 xff0c 并使最后m个数变为最前面的m个数 要求只用一个数组的方式实
  • iOS UIAlertController 用法介绍

    原文 xff1a https www jianshu com p b72753c51b39 UIAlertController UIAlertController的用法很简单 我们却经常使用 它用以取代iOS 8 0 之前的UIAlertV
  • 问题解决:在基于anaconda的spyder中安装第三方库

    问题描述 cmd中python包的工作路径与anaconda安装路径是同一级目录 xff0c 因此anaconda下的spyder并不能检测到该包 xff0c 直接使用命令行win 43 r cmd pip无效 xff1a 解决方案 找到a
  • postgresql表操作

    postgresql数据库操作 1 表基本操作1 1创建表1 2 查看表1 3清空表数据1 4删除表1 5退出数据库 2 表属性操作2 1增加列2 2删除列2 3修改列属性2 4增加列非空约束2 5 增加列唯一约束2 6删除主键约束2 7创
  • linux用户设置

    目录 用户和用户组 cy 用户名 cy xff1a 用户全名称 su xff1a 切换用户 userdel xff1a 删除用户 groupadd xff1a 创建组 普通组 xff0c 由系统默认生成的叫做主组 gpasswd xff1a
  • 输入十个数,求最大数,最小数,以及去掉两最值数的平均值。

    实现简单的评分 十个评分 xff0c 去最高和最低分 xff0c 求最后的平均分
  • Windows虚拟机通过libvirt使用CEPH RBD

    kvm虚拟机通过 libvirt 挂在 ceph rbd作为数据盘 一 首先确定我们的ceph环境是HEALTH OK span class token punctuation span root 64 cephmon ceph span
  • 英伟达独立显卡直通虚拟机

    显卡直通KVM虚拟机 1 确认CPU是否支持硬件虚拟化 egrep span class token operator span o span class token string 39 vmx svm 39 span span class
  • Nginx反向代理实现部署dist文件

    Linux服务器安装nginx可以参考文章 Linux服务器安装Nginx Nginx常用命令可以参考文章 Nginx 启动 关闭 重启 检测等常用命令 1 创建文件存放dist文件 我的nginx安装目录为 xff1a usr local
  • ffmepg+SDL2编译安装生成ffplay播放器

    ffmpeg 43 SDL2编译生成ffplay播放器 SDL2 xff1a Simple DirectMedia Layer 是一个跨平台开发库 xff0c 旨在通过 OpenGL 和 Direct3D 提供对音频 键盘 鼠标 游戏杆和图
  • 配置本地yum源和apt源,离线安装make、gcc、g++编译工具

    配置本地yum源和apt源 xff0c 离线安装make gcc等编译工具 起因 xff1a 安装的新操作系统的机器没有网卡驱动 xff0c 离线安装网卡驱动 xff0c 需要make和gcc编译工具 1 准备镜像源 centos7 xff
  • Linux防火墙firewall的使用

    LInux防火墙firewall的常用规则 一 firewall服务的启用和停止 1 开启firewall服务 systemctl start firewalld 2 关闭firewall服务 systemctl stop firewall
  • Windows 11 笔记本开热点,手机连接一直寻找 IP 或者出现已连接但无法访问Intenet网络

    Windows 11 笔记本开热点 手机连接一直寻找 IP 或者出现已连接但无法访问Intenet网络 原因 不管是宽带连接还是以太网连接 xff0c 出现这个问题是因为电脑没有开启共享网络 解决 打开网络适配器 网络和internet g
  • 美颜技术---几种常用磨皮滤波器

    磨皮滤波器 磨皮模块的功能需求 xff1a 把图像中人物身上的噪点进行滤除 xff0c 噪点包含痘痘 xff0c 色斑 xff0c 痤疮等 实现磨皮这一功能通常是使用 保边滤波器 对图像进行平滑处理 xff0c 而保边滤波器的一个重要特性是
  • 原创 服务器群集——源码编译安装LNMP(搭建基于LNMP架构的Discuz论坛)

    这里写目录标题 一 LNMP架构解读MySQL安装配置PHP解析环境的安装配置Nginx支持PHP环境 二 LNMP应用部署1 安装nginx2 安装MYSQL3 安装php4 让nginx支持PHP5 创建数据库6 更改测试页内容7 安装
  • 链表头插法

    头插法 从一个空表头指针开始 xff0c 重复读入数据 xff0c 生成新节点 xff0c 将读入数据存放到新节点的数据域中 xff0c 永远是将新节点插入到当前链表的头节点的后面 xff0c 第一个创建的节点是放在最后的 xff0c 直到