嵌入式课程day19-C语言链表

news2024/11/22 10:49:59

目录

十三、链表

13.1动态内存申请

13.2结构体指针

13.3链表

13.3.1链表:

13.3.2链表分类:

13.3.3链表操作:


十三、链表

13.1动态内存申请

动态内存申请的空间 在 堆区 , 特点:人为申请,人为释放。

malloc--- 分配空间

#include <stdlib.h>

malloc函数申请一个大小为size字节的空间,如果申请失败返回NULL,如果申请成员返回申请空间首字节的编号。

例子:
            在堆区 申请一个int型空间的大小。
            int * p = (int *)malloc(sizeof(int));
            
            然后操作int空间赋值为10;
            *p = 10;
            
            printf("%d \n",*p);

例子:
            在堆区 申请 4个char型的空间大小
            char *q = (char *)malloc(sizeof(char) * 4);
            
            *(q+0) = 'a';
            *(q+1) = 'b';
            *(q+2) = 'c';
            *(q+3) = '\0';
            
            printf("%s",q);

例子:
            typedef struct book
            {
                char bookName[30];
                char author[20];
                char bookNum[10];
                int hot;
                int kc;
                float price;        
            }BK_t;

练习:
strcut Data
{
	int m;
	int* p;
};

strcut Data d1;
d1.m = 10;
d1.p = (int*)malloc (sizeof (int));

*(d1.p) = 30;

struct Data d2;
d2 = d1;

d2.m = 100;
*(d2.p) = 50;

d1.m = __10_____ * (d1.p) = ____50____
d2.m = ___100____ * (d2.p) = ___50_____

13.2结构体指针

指针名->成员名 

struct student
{
	int sno;
	char name[20];

	struct student* next;
};

// struct student 成员:  
//      sno        name          next  
//      int        char [20]     struct student *
//      整型数据   字符串        保存结构体struct student空间的地址

// 申请一块结构体的空间
// 存储信息 学号  姓名  NULL

struct student* h = (struct student*)malloc (sizeof (struct student));
h->sno = 1;
strcpy (h->name, "小明");
h->next = NULL;

// 申请一块结构体的空间
// 存储信息 学号  姓名  NULL

struct student* p = (struct student*)malloc (sizeof (struct student));
p->sno = 2;
strcpy (p->name, "小黄");
p->next = NULL;

// 将第一个结构体里面的next指针 指向 第二个结构体。
h->next = p;

printf ("%d %s\n", h->sno, h->name);
printf ("%d %s\n", h->next->sno, h->next->name);

13.3链表

数据结构,用的时候开空间,用完之后释放。

链表存储数据的时候,开空间就可以使用动态内存申请。

13.3.1链表:

存储数据的空间叫节点。

节点是结构体类型,由 数据域 和 指针域 组成。

struct xx
{
	数据-- - 数据域

	指针 存储下一个数据的地址  -- - 指针域  
};

13.3.2链表分类:

单链表单向,从前往后访问链表
双链表双向 从前往后也可以从后往前 访问链表
循环链表环形链表
有头链表第一个节点不用它的数据域,只用它的指针域
无头链表第一个节点和其他节点没有区别,都要存储数据和地址。

13.3.3链表操作:

以有头单向链表为例来讲。

添加节点  --- 功能 

查找节点  --- 功能 

删除节点  --- 功能 

修改节点  --- 功能 

插入节点  --- 功能 

#include <stdlib.h>
#include <stdio.h>

struct Node
{
	int num;
	struct Node* next;
};

// head
void addNode (struct Node* head);
void allNode (struct Node* head);
void delNode (struct Node* head);

int main ()
{
	// 准备工作
	struct Node* head;
	head = (struct Node*)malloc (sizeof (struct Node));
	if (head == NULL)
	{
		printf ("申请内存失败");
		return 0;
	}
	head->next = NULL;

	// 添加三个节点
	addNode (head);
	addNode (head);
	addNode (head);

	// 显示所有节点
	allNode (head);
	delNode (head);

	allNode (head);
	delNode (head);

	allNode (head);
	delNode (head);
}

/********************************************************************
*  函数名称:addNode
*  功能描述:添加一个节点到链表末尾
*  输入参数:头指针
*  返回:void
*  其他:如果链表为空,新节点将成为头节点
*********************************************************************/
void addNode (struct Node* head)
{
	// 写入节点
	struct Node* add;
	add = (struct Node*)malloc (sizeof (struct Node*));
	if (add == NULL)
	{
		printf ("申请内存失败");
		return 0;
	}
	add->next = NULL;
	scanf (" %d", &add->num);

	// 获取尾节点
	struct Node* copy = head;
	while (copy->next != NULL)
	{
		copy = copy->next;
	}

	// 链接
	copy->next = add;
}

/********************************************************************
*  函数名称:allNode
*  功能描述:输出所有的节点
*  输入参数:头指针
*  返回:void
*  其他:
*********************************************************************/
void allNode (struct Node* head)
{
	struct Node* copy = head->next;
	while (copy != NULL)
	{
		printf ("%d -> ", copy->num);
		copy = copy->next;
	}
	printf ("NULL\n");
}

/********************************************************************
*  函数名称:delNode
*  功能描述:删除节点
*  输入参数:struct Node* temp
*  返回:void
*  其他:
*********************************************************************/
void delNode (struct Node* head)
{
	struct Node* copy = head;
	struct Node* copynext = copy->next;

	// 存储要删除的节点
	int input;
	scanf ("%d", &input);

	//标记找不找得到
	int flag = 0;
	while (copy != NULL)
	{
		if (copynext->num == input)
		{
			copy->next = copynext->next;
			copynext = NULL;
			free (copynext);
			flag = 1;
			break;
		}
		else
		{
			copy = copynext;
			copynext = copynext->next;
		}
	}

	if (flag == 0)
	{
		printf ("没找到");
	}
}

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

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

相关文章

springboot基于Hadoop的NBA球员大数据分析与可视化(1)(6)

摘 要 科学技术日新月异&#xff0c;人们的生活都发生了翻天覆地的变化&#xff0c;NBA球员大数据分析与可视化系统当然也不例外。过去的信息管理都使用传统的方式实行&#xff0c;既花费了时间&#xff0c;又浪费了精力。在信息如此发达的今天&#xff0c;可以通过网络这个媒…

鸿蒙多线程开发——线程间数据通信对象01

1、线程间通信 线程间通信指的是并发多线程间存在的数据交换行为。由于ArkTS语言兼容TS/JS&#xff0c;其运行时的实现与其它所有的JS引擎一样&#xff0c;都是基于Actor内存隔离的并发模型提供并发能力。 对于不同的数据对象&#xff0c;在ArkTS线程间通信的行为是有差异的&…

goland单元测试

一、单元测试的概念 1.1 什么是单元测试&#xff0c;有什么用&#xff1f; 单元测试是针对于函数的测试&#xff0c;用来保证该函数的逻辑正确性。 1.2 单元测试的要求&#xff1f; 1. 单元测试在正式上线之前应该全部自动执行&#xff0c;并且需要保证全部通过 2. 单元测试需…

ArcGIS定义投影与投影的区别(数据和底图不套合的原因和解决办法)

今天介绍一下ArcGIS中定义投影与投影的区别。 给大家解惑一下为什么经常出现自己的数据无法和底图套合的情况。 一 目录 1、ArcGIS定义投影与投影的概念区别 2、ArcGIS定义正确的坐标系 3、ArcGIS动态投影实现套合 4、ArcGIS地理坐标系转投影坐标系&#xff08;错误做法&am…

语义通信论文略读(十七)可变长编码的语义通信+Extended Reality

Semantic Communications With Variable-Length Coding for Extended Reality 用于扩展现实的带可变长度编码的语义通信 作者: Bowen Zhang, Zhijin Qin, Geoffrey Ye Li 所属机构: 伦敦帝国理工学院电气与电子工程系; 清华大学电子工程系 关键词: 扩展现实&#xff0c;联…

IDEA2019搭建Springboot项目基于java1.8 解决Spring Initializr无法创建jdk1.8项目 注释乱码

后端界面搭建 将 https://start.spring.io/ 替换https://start.aliyun.com/ 报错 打开设置 修改如下在这里插入代码片 按此方法无果 翻阅治疗后得知 IDEA2019无法按照网上教程修改此问题因此更新最新idea2024或利用插件Alibaba Clouod Toolkit 换用IDEA2024创建项目 下一步…

网络编程 day1.2~day2——TCP和UDP的通信基础(TCP)

笔记脑图 作业&#xff1a; 1、将虚拟机调整到桥接模式联网。 2、TCP客户端服务器实现一遍。 服务器 #include <stdio.h> #include <string.h> #include <myhead.h> #define IP "192.168.60.44" #define PORT 6666 #define BACKLOG 20 int mai…

BLIP-2模型的详解与思考

大模型学习笔记------BLIP-2模型的详解与思考 1、BLIP-2框架概述2、BLIP-2网络结构详解3、BLIP-2的几点思考 上一篇文章上文中讲解了 BLIP&#xff08;Bootstrapping Language-Image Pretraining&#xff09;模型的一些思考&#xff0c;本文将讲述一个BLIP的升级版 BLIP-2&am…

strcat的模拟实现(递归)(c基础)

hi &#xff0c; I am 36 适合对象c语言初学者 strcat(arr1,arr2);函数是将arr2接到arr1后&#xff0c;返回arr1 链接介绍一下strcat(c基础)-CSDN博客 下面通过自定义函数来模拟实现 缺陷 该函数不适合arr1[] "";时因为该函数的功能是把arr2接到arr1后&#xf…

GeekChallenge 2024 第十五届极客大挑战 pwn AK

GeekChallenge 2024 第十五届极客大挑战 pwn AK &#x1f340;前言☘️ez_shellcode&#xff08;shellcode&#xff0c;栈溢出&#xff09;&#x1f33f;分析&#x1f33f;解题&#x1f33f;exp ☘️买黑吗喽了吗&#xff08;整数溢出&#xff0c;栈溢出&#xff09;&#x1f3…

springboot源码02-springboot启动主要步骤总结

文章目录 【README】【1】springboot应用启动主要步骤【1.1】springboot应用启动主要步骤总结 【2】springboot应用启动先后发布事件【2.1】springboot启动先后发布事件代码实践【2.1.1】自定义监听器【2.1.2】自定义SpringApplicationRunListener【2.1.3】springboot运行日志 …

数据结构——小小二叉树第二幕(二叉树链式结构的实现以及二叉树的遍历)超详细!!!

文章目录 前言一、实现链式结构二叉树1.1 前中后序遍历1.1.1 遍历规则 1.2 二叉树的结点个数以及高度等 总结 前言 上一篇我们初步认识了树的结构以及概念&#xff0c;同时也学习到了二叉树的顺序结构&#xff08;堆&#xff09;的实现&#xff0c;以及堆的初步应用。 时隔几日…

服务器端渲染 (SSR) 与客户端渲染 (CSR)

嘿程序员&#xff01;我们都知道&#xff0c;新时代的 Javascript 已经彻底改变了现代网站的结构和用户体验。如今&#xff0c;网站的构建更像是一个应用程序&#xff0c;伪装成一个能够发送电子邮件、通知、聊天、购物、支付等的网站。今天的网站是如此先进、互动&#xff0c;…

【spring】spring单例模式与锁对象作用域的分析

前言&#xff1a;spring默认是单例模式&#xff0c;这句话大家应该都不陌生&#xff1b;因为绝大多数都是使用单例模式&#xff0c;避免了某些问题&#xff0c;可能导致对某些场景缺乏思考。本文通过结合lock锁将单例模式、静态变量、锁对象等知识点串联起来。 文章目录 synchr…

解析与修复vcruntime140_1.dll问题,总结四种vcruntime140_1.dll解决方法

在使用Windows系统的过程中&#xff0c;不少用户可能会遇到与vcruntime140_1.dll相关的问题。这个看似神秘的文件&#xff0c;其实在很多软件的运行中扮演着至关重要的角色。今天的这篇文章将教大家四种vcruntime140_1.dll解决方法。 一、vcruntime140_1.dll文件分析 &#xf…

django基于django的民族服饰数据分析系统的设计与实现

摘 要 随着网络科技的发展&#xff0c;利用大数据分析对民族服饰进行管理已势在必行&#xff1b;该平台将帮助企业更好地理解服饰市场的趋势&#xff0c;优化服装款式&#xff0c;提高服装的质量。 本文讲述了基于python语言开发&#xff0c;后台数据库选择MySQL进行数据的存储…

如何使用GPT API 自定义 自己的 RAG

要使用 GPT 的 API 实现自己的 RAG&#xff08;Retrieval-Augmented Generation&#xff09; 系统&#xff0c;可以结合检索工具和 GPT 模型&#xff0c;将外部知识库中的信息与生成模型结合起来&#xff0c;完成准确、高效的任务。以下是具体步骤和实现方法&#xff1a; 系统架…

对subprocess启动的子进程使用VSCode python debugger

文章目录 1 情况概要&#xff08;和文件结构&#xff09;2 具体设置和启动步骤2.1 具体配置Step 1 针对attach debugger到子进程Step 2 针对子进程的暂停(可选) Step 3 判断哪个进程id是需要的子进程 2.2 启动步骤和过程 3 其他问题解决3.13.2 ptrace: Operation not permitted…

cocos creator 3.8 一些简单的操作技巧,材质的创建 1

这是一个飞机的3D模型与贴图 导入到cocos中&#xff0c;法线模型文件中已经包含了mesh、material、prefab&#xff0c;也就是模型、材质与预制。界面上创建一个空节点Plane&#xff0c;将模型直接拖入到Plane下。新建材质如图下 Effect属性选择builtin-unlit&#xff0c;不需…

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整性 …