用指针处理链表(二)

4建立动态链表

所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。

例11.8 写一函数建立一个有3名学生数据的单向动态链表。

先考虑实现此要求的算法(见图11.12)。

设3个指针变量:head、pl、p2,它们都是用来指向 struct student类型数据的。先用malloc函数开辟第一个结点,并使p1、p2指向它。然后从键盘读入一个学生的数据给p1所指的第一个结点。我们约定学号不会为零,如果输入的学号为0,则表示建立链表的过程完成,该结点不应连接到链表中。先使 head 的值为NULL(即等于0),这是链表为“空”时的情况(即head 不指向任何结点,链表中无的结点作为第一个结点)到表尾)的结点连接

结点),当建立第一个结点就使head指向该结点。

如果输入的pl->num不等于0,则输入的是 第一个结点数据(n=1),令head=p1,即把p1的值赋给 head,也就是使head也指向新开辟的结点(图11.13)。p1所指向的新开辟的结点就成为链表中第一个结点。然后再开辟另一个结点并使p1指向它,接着输入该结点的数据(见图11.14(a))。如果输入的pl->num≠0,则应链入第2个结点(n=2),由于n≠1,则将p1 的值赋给p2-> next,此时p2指向第一个结点,因此执行“p2->next=pl”就将新结点的地址赋给第一个结点的next成员,使第一个结点的next成员指向第二个结点(见图11.14 (b))。接着使p2=p1,也就是使p2指向刚才建立的结点,见图11.14(c)。接着再开辟一个结点并使p1指向它,

图 11.13 并输入该结点的数据(见图11.15(a)),在第三次循环中,由于n=3(n≠1),又将p1 的值赋给p2->next,也就是将第3个结点连接到第2个结点之后,并使p2=p1,使p2指向最后一个结点(见图11.15(b))。

再开辟一个新结点,并使P指向它,输入该结点的数据(见图11.16(a))。由于p1 ->num的值为0,不再执行循环,此新结点不应被连接到链表中。此时将NULL 赋给p2 ->next,见图11.16(b)。建立链表过程至此结束,p1最后所指的结点未链人链表中,第3个结点的next成员的值为NULL,它不指向任何结点。虽然p1指向新开辟的结点,但从链表中无法找到该结点。

建立链表的函数可以如下:

#include <malloc.h>

#define NULL 0

#define LEN sizeof (struct student)

struct student

{long num;

float score;

struct student * next ;

};

int n; /*n为全局变量,本文件模块中各函数均可使用它*/

struct student * creat(void)

/*定义函数。此函数带回一个指向链表头的指针*/

{struct student * head ;

struct student * p1, * p2;

n=0;

p1=p2=(struct student *) malloc(LEN); /*开辟一个新单元*/

scanf (" %ld,%f",&p1->num,&p1->score);

head=NULL:

while(p1->num! =0)

{n=n+1;

if(n==1)head=p1;

else p2->next=p1;

p2=p1;

P1= (struct student *)malloc(LEN);

scanf("%ld,%f" ,&p1->num,&p1->score);

}

p2->next=NULL;

return(head);

}

函数首部在括弧内写void,表示本函数没有形参,不需要进行数据传递。可以在 main 函数中调用creat函数:

main()

{

...

creat(); /*调用 creat函数后建立了一个单向动态链表*/

}

调用 creat函数后,函数的值是所建立的链表的第一个结点的地址(请查看return语句)。

请注意:

(1)第1行为#define 命令行,令 NULL代表0,用它表示“空地址”。第2行令LEN代表struct student类型数据的长度,sizeof是“求字节数运算符”。

(2)第9行定义一个creat函数,它是指针类型,即此函数带回一个指针值,它指向一个struct student类型数据。实际上此creat函数带回一个链表起始地址。

(3) malloc(LEN)的作用是开辟一个长度为LEN的内存区,LEN已定义为sizeof(struct student),即结构体struct student的长度。malloc带回的是不指向任何类型数据的指针(void *)。而p1、p2 是指向 struct student类型数据的指针变量,因此必须用强制类型转换的方法使指针的基类型改变为struct student类型,在malloc(LEN)之前加了“(struct student*)”,它的作用是使malloc返回的指针转换为指向struct student类型数据的指针。注意“*”号不可省略,否则变成转换成struct student类型了,而不是指针类型了。

(4)最后一行return后面的参数是head(head已定义为指针变量,指向struct student类型数据)。因此函数返回的是head 的值,也就是链表的头地址。

(5)n是结点个数。

(6)这个算法的思路是让p1指向新开的结点,p2指向链表中最后一个结点,把p1所指的结点连接在p2所指的结点后面,用“p2->next=p1”来实现。

我们对建立链表过程做了比较详细的介绍,读者如果对建立链表的过程比较清楚的话,对下面介绍的删除和插入过程也就比较容易理解了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业级快速开发框架 nbsaas-boot 1.1.8-2024 发布了

<parent><groupId>com.nbsaas.boot</groupId><artifactId>nbsaas-boot</artifactId><version>1.1.8-2024</version> </parent> 本次更新内容 1. 重构代码生成器&#xff0c;采用类提取和字段提取两种方式&#xff0c;提取功能…

HDFSRPC通信框架详解

本文主要对HDFSRPC通信框架解析。包括listener&#xff0c;reader&#xff0c;handler&#xff0c;responser等实现类的源码分析。注意hadoop版本为3.1.1。 写在前面 rpc肯定依赖于socket通信&#xff0c;并且使用的是java NIO。读者最好对nio有一定的了解&#xff0c;文章中…

HTML5 、CSS3 、ES6 新特性

HTML5 新特性 1. 新的语义化元素&#xff1a;article 、footer 、header 、nav 、section 2. 表单增强&#xff0c;新的表单控件&#xff1a;calendar 、date 、time 、email 、url 、search 3. 新的 API&#xff1a;音频(用于媒介回放的 video 和 audio 元素)、图形&#x…

古河云科技校园数字孪生解决方案

智慧校园需将环境信息、资源信息和应用信息全部转化为数字化信息&#xff0c;为管理决策和服务提供强有力的支持。智慧系统集智能化感知、智能化控制、智能化管理、智能化互动反馈、智能化数据分析、智能化视窗等功能于一体&#xff0c;旨在实现校园信息服务的全面提升。 行业…

教程1_图像视频入门

一、图像入门 1、cv2.imread()函数 cv2.imread() 是 OpenCV 库中的一个函数&#xff0c;用于读取图像文件。下面是 cv2.imread() 函数的基本介绍和使用方法&#xff1a; 函数定义 cv2.imread(filename, flagscv2.IMREAD_COLOR) 参数 filename&#xff1a;要读取的图像的路…

使用Spring Data Elasticsearch实现与Elasticsearch的集成,进行全文搜索和数据分析。

使用Spring Data Elasticsearch实现与Elasticsearch的集成&#xff0c;进行全文搜索和数据分析。 使用Spring Data Elasticsearch可以很容易地实现与Elasticsearch的集成&#xff0c;从而进行全文搜索和数据分析。下面是一个简单的示例&#xff0c;演示如何在Spring Boot应用程…

Excel 导入、导出的封装

最近在封装公司统一使用的组件&#xff0c;主要目的是要求封装后开发人员调用简单&#xff0c;不用每个项目组中重复去集成同一个依赖l&#xff0c;写的五花八门&#xff0c;代码不规范&#xff0c;后者两行泪。 为此&#xff0c;我们对EasyExcel进行了二次封装&#xff0c;我…

flutter const InviteFriendReward(),用setState刷新不了

列布局里面添加了InviteFriendReward()&#xff0c;InviteFriendReward()里面有请求接口的开关是否显示&#xff0c;但是因为里面有波浪形&#xff0c;所以加了const&#xff0c;导致setState时&#xff0c;即使开关是开的&#xff0c;也没有再显示了 const InviteFriendRewar…

python怎样打开一个pdf文件?

要在Python中打开PDF文件&#xff0c;可以使用PyPDF2库。 首先&#xff0c;确保已安装PyPDF2库&#xff0c;可以使用以下命令安装&#xff1a; pip install PyPDF2 然后&#xff0c;可以按照以下步骤打开PDF文件&#xff1a; 导入PyPDF2库&#xff1a; import PyPDF2 打开…

《机器学习:引领数字化时代的技术革命》

随着科技的不断发展&#xff0c;机器学习作为人工智能的重要支柱之一&#xff0c;正迅速崛起并引领着数字化时代的技术革命。本文将从机器学习的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势预测和学习路线等方面展开探讨&#xff0c;为您揭示机器学习的神…

人工智能时代如何高效完成营销内容计划

智能对话升级&#xff01;【Kompas AI】AI对话助手&#xff0c;让沟通更高效 在人工智能时代&#xff0c;要高效完成营销计划&#xff0c;我们可以利用人工智能的多种能力来增强营销策略的精准度和执行效率。借助人工智能的力量&#xff0c;企业不仅可以提高营销计划的执行效率…

python项目练习——4.手写数字识别

使用Python和Scikit-learn库进行机器学习模型训练的项目——手写数字识别。 项目分析&#xff1a; 数据准备&#xff1a;使用公开数据集&#xff08;如MNIST&#xff09;作为训练和测试数据。数据预处理&#xff1a;对图像数据进行归一化、展平等操作&#xff0c;以便输入到机…

DMA知识

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 2024年3月26日23:32:43 今天看了DMA存储器到存储器的DMA传输和存储器到外设的DMA实验&#xff0c;在keil仿真可以看到效果。还没有在protues和开发…

Linux(CentOS)/Windows-C++ 云备份项目(服务器数据管理模块设计)

数据管理模块功能&#xff1a; 后续项目需要使用的数据如下 文件实际存储路径&#xff1a;当客户端需要下载文件时&#xff0c;从这个文件中进行读取响应文件压缩包存放路径名&#xff1a;如果文件是非热点文件会被压缩 如果客户端需要下载这些文件&#xff0c;需要先进行解压…

使用Flask实现:基于midjourney-proxy的MJ绘画实现(开源)

文章目录 实现效果实现步骤完整源码 实现效果 运行mj.py&#xff0c;如下所示。输入中文&#xff0c;自动生成提示词&#xff0c;自动开始下载。用户选择是否需要变换图片&#xff0c;选择需要对哪个图片变换&#xff0c;自动保存。 之前想做一个网页版&#xff0c;只实现了…

一些常见的ClickHouse问题和答案

什么是ClickHouse&#xff1f;它与其他数据库系统有什么区别&#xff1f; ClickHouse是一个开源的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;专门用于高性能、大规模数据分析。与传统的行式数据库相比&#xff0c;ClickHouse具有更高的查询性能、更高的数据…

新书速览|Django 5企业级Web应用开发实战:视频教学版

掌握Django框架开发技能&#xff0c;实战投票应用系统和内容管理系统 本书内容 《Django 5企业级Web应用开发实战&#xff1a;视频教学版》精选当前简单、实用和流行的Django实例代码&#xff0c;帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容…

【STM32学习计划】

项目名称&#xff1a;STM32学习计划 项目目标&#xff1a; 熟悉STM32单片机的基本概念和应用掌握STM32的软硬件开发流程完成一个基于STM32的简单项目 项目任务和交付物&#xff1a; 任务 1&#xff1a;熟悉STM32单片机基本概念 学习STM32单片机的基本架构和功能特性交付物…

mysql如何存Emoji表情

如何存Emoji表情 背景解决方案一&#xff1a; 如果是自己搭建的数据库&#xff0c;参考如下。 1&#xff1a;先创建数据库&#xff0c;utf8编码2&#xff1a; 修改mysql 的配置文件 /etc/my.cnf 文件3&#xff1a;然后把你的表和字段也要支持utf8md4编码4&#xff1a;修改你连…

javaWeb教务查询系统

一、简介 在教育管理领域&#xff0c;教务管理系统是一个至关重要的工具&#xff0c;它能够有效地协调学校、教师和学生之间的各种活动。我设计了一个基于JavaWeb的教务管理系统&#xff0c;该系统包括三个角色&#xff1a;管理员、教师和学生。管理员拥有课程管理、学生管理、…