day-21 内核链表以及栈

1.昨日作业

1.删除指定节点

找到删除就完事了,双向可以停在删除处。

/****************************
 * 功能:删除指定结点(通过姓名)
 * 参数:phead;oldname; 
 * 返回:成功0,失-1;
 * *************************/

int delete_specified_node(dou_node *phead,char *oldname)
{
    if(NULL == phead)
    {
        printf("phea is NULL");
            return -1;
    }
    dou_node *p = phead->pnext;
    while(NULL != p)
    {
        if(strcmp(p->data.name,oldname)==0)
        {
            dou_node *q = p->pnext;
            p->ppre->pnext = q;
            q->ppre = p->ppre;
            free(p);
            return 0;
        }
        p = p->pnext;
    }
    return -1;
}

2.内核链表

内核链表将节点以及要储存的数据分离开来,节点的操作函数不因数据类型的改变而需要重写。

1.klist.h

声明节点的类型,以及节点操作的函数

#ifndef __KLIST_H__
#define __KLIST_H__

typedef struct knode
{
    struct knode *ppre;
    struct knode *pnext;
}Knode;

extern Knode * creat_klist();
extern int insert_head_klist(Knode *phead ,Knode *pinsert);
extern void list_for_each(Knode *phead,void (*pfun)(Knode *));

extern int delete_tail_klist(Knode*phead);
extern int delete_head_klist(Knode*phead);
extern void destroy_klist(Knode * phead);
extern int insert_tail_klist(Knode *phead,Knode *pinsert);
#endif

2.flight.h

声明数据结构体类型,

##ifndef __FLIGHT_H__
#define __FLIGHT_H__

#include "klist.h"

struct passager
{
    Knode node;
    char name[32];
    int flt_num;
    int sit_num;
    char hea_card;
};

extern struct passager* creat_passager(char *name,int flt_num, int sit_num,char hea_card);
extern void print_passager(Knode *p);
#endif

2 .klist.c

1.创建节点

Knode *creat_klist()
{
    Knode *phead = NULL;
    phead = malloc(sizeof(Knode));
    if(NULL == phead)
    {
        printf("malloc fail\n");
        return NULL;
    }

    phead->ppre = NULL;
    phead->pnext = NULL;
    return phead;
}

2.前插

逻辑同双向链表的前插,但是呢插得是数据中的节点,故在main函数中应先定义数据结构体变量,定义的时候不用管节点成员。传参传结构体成员如下所示

	struct passager *p1 = creat_passager("zhangsan",2024,1,'r');    
    struct passager *p2 = creat_passager("lisi",2024,2,'g');
    struct passager *p3 = creat_passager("wanger",2024,3,'y');
    
    insert_tail_klist(phead,&(p1->node));
    insert_tail_klist(phead,&(p2->node));
    insert_tail_klist(phead,&(p3->node));


插入分两种情况,空的和非空


int insert_head_klist(Knode *phead , Knode *pinsert)
{
    pinsert->pnext = phead->pnext;
    if(phead->pnext != NULL)
    {
        phead->pnext->ppre = pinsert;
    }
    pinsert->ppre = phead;
    phead->pnext = pinsert;
    return 0;
}


3.后插

后插特殊部分和前插一样,但是有个细节是查完之后pinsert->pnext = NULL;

int insert_klist_tail(KNode *phead, KNode *pnode)
{
	if (NULL == phead || NULL == pnode)
		return -1;
	

	KNode *p = phead;
	while (p->pnext != NULL)
	{
		p = p->pnext;
	}
	
	p->pnext = pnode;
	pnode->ppre = p;
	pnode->pnext = NULL;
	
	return 0;
}

4.遍历(重重重点)

达到低耦合的效果

第一种

通过函数指针形成回调函数 。达到不同的数据类型也可以通过一个遍历函数完成便利,只需要传递不同的函数指针就行。

void list_for_each(Knode *phead, void (*pfun)(Knode *))
{
    if(phead ==NULL || NULL == pfun)
        return;
    Knode *p = phead->pnext;

    while(NULL  !=p)
    {
        pfun(p);
        p = p->pnext;
    }
    printf("\n");

}

回调函数
先强转在访问

void print_passager(Knode *pnode)
{
    struct passager *p = (struct passager *)pnode;
    printf("%s %d %d %c\n",p->name,p->flt_num,p->sit_num,p->hea_card);

}

main函数调用

list_for_each(phead,print_passager);

第二种

通过带参宏的形式,去访问结构体成员
.h中声明

#define klist_for_each(pos, head)                                        \
	for (pos = (head)->pnext; pos != NULL; pos = pos->pnext)

main’函数中直接使用,先强转随便访问结构体;

klist_for_each(ptmp, phead)
{
	struct passager *p = (struct passager *)ptmp;
	
}

5.删除销毁等同双向,本质是双向链表,把节点放在结构体首个成员。结构体地址等于节点地址。

3.栈

1.系统栈和数据结构中的栈的区别
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析MyBatis的架构原理

架构设计 简要画出 MyBatis 的架构图 >> ​​ Mybatis 的功能架构分为哪三层? API 接口层 提供给外部使用的接口 API,开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。MyBatis 和数据库的…

Figma插件:提高设计工作效率

Figma作为一款当前流行的设计工具,其受欢迎程度的飙升与2020年疫情后的远程工作趋势密切相关。许多设计团队开始转向线上办公模式,这时,Figma的协作功能就显得尤为重要,促使众多设计师从Sketch等传统设计软件转向Figma。 Figma是…

Hive其一,简介、体系结构和内嵌模式、本地模式的安装

目录 一、Hive简介 二、体系结构 三、安装 1、内嵌模式 2、测试内嵌模式 3、本地模式--最常使用的模式 一、Hive简介 Hive 是一个框架,可以通过编写sql的方式,自动的编译为MR任务的一个工具。 在这个世界上,会写SQL的人远远大于会写ja…

Qt之自定义标题栏拓展(十)

Qt开发 系列文章 - user-defined-titlebars(十) 目录 前言 一、方式一 1.效果演示 2.创建标题栏类 3.可视化UI设计 4.定义相关函数 5.使用标题栏类 二、方式二 1.效果演示 2.创建标题栏类 3.定义相关函数 1.初始化函数 2.功能函数 3.窗口关…

鱼跃医疗获评2024年国家级“绿色工厂”,以绿色制造树立行业标杆

近日,工业和信息化部公布了2024年度绿色制造名单,鱼跃医疗凭借在绿色制造和可持续发展方面的卓越表现,成功入选并获评国家级“绿色工厂”。 “绿色工厂”是工信部为贯彻落实国家《工业绿色发展规划》,加快推动绿色制造体系建设&a…

【数据集】玻璃门窗缺陷检测数据集3085张5类YIOLO+VOC格式

数据集格式:VOC格式YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:3085 Annotations文件夹中xml文件总计:3085 labels文件夹中txt文件总计:3085 标签种类数&am…

一、LRU缓存

LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写,意为“最近最少使用”。它是一种常见的缓存淘汰策略,用于在缓存容量有限时,决定哪些数据需要被删…

【视频生成模型】——Hunyuan-video 论文及代码讲解和实操

🔮混元文生视频官网 | 🌟Github代码仓库 | 🎬 Demo 体验 | 📝技术报告 | 😍Hugging Face 文章目录 论文详解基础介绍数据预处理 (Data Pre-processing)数据过滤 (Data Filtering)数据标注 (Data…

【C++】函数计算题解论

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯思路解析3.1 函数的递归定义3.2 边界条件控制3.3 记忆化搜索 💯C实现代码💯添加解释💯小结 💯前言 在…

低温高海拔大载重无人机吊运技术详解

低温高海拔大载重无人机吊运技术是一项复杂而先进的技术,它结合了无人机的飞行控制、吊装系统的操作以及特殊环境下的适应性等多个方面。以下是对该技术的详细解析: 一、无人机基础知识与结构特点 低温高海拔大载重无人机通常采用旋翼设计,…

Java设计模式 —— 【结构型模式】适配器模式(类的适配器、对象适配器、接口适配器)详解

文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍 生活中有很多例子: 不同国家的插座接口不同,需要转换器;家用电源220V,手机只接受5V充电,需要转换器;读卡器,拓展…

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省,就是自我反省、自我检查,自知己短,从而弥补短处、纠正过失。佛陀强调自觉觉他,强调以达到觉行圆满为修行的最高境界。要改正错误,除了虚心接受他人意见之外,还要不忘时时观照己身。自省自悟之…

leetcode17:电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出&#…

OpenHarmony-3.HDF Display子系统(6)

Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者…

AQS源码学习

一、park/unpark阻塞唤醒线程 LockSupport是JDK中用来实现线程阻塞和唤醒的工具。使用它可以在任何场合使线程阻塞,可以指定任何线程进行唤醒,并且不用担心阻塞和唤醒操作的顺序,但要注意连续多次唤醒的效果和一次唤醒是一样的。JDK并发包下…

GUI07-学工具栏,懂MVC

MVC模式,是天底下编写GUI程序最为经典、实效的一种软件架构模式。当一个人学完菜单栏、开始学习工具栏时,就是他的一生中,最适合开始认识 MVC 模式的好时机之一。这节将安排您学习: Model-View-Controller 模式如何创建工具栏以及…

C++----类与对象(中篇)

引言 以C语言栈的实现为例,在实际开发中,我们可能会遇到以下两个问题: 1.初始化和销毁管理不当:C语言中的栈实现通常需要手动管理内存(如使用malloc和free),这导致初始化和销毁栈时容易出错或…

linux打包qt程序

Linux下Qt程序打包_linuxdeployqt下载-CSDN博客 Linux/Ubuntu arm64下使用linuxdeployqt打包Qt程序_linuxdeployqt arm-CSDN博客 本篇文章的系统环境是 : 虚拟机ubuntu18.04 用下面这个qmake路径 进行编译 在 ~/.bashrc 文件末尾,qmake目录配置到文件末尾 将上图中…

气象与旅游之间的关系,如果借助高精度预测提高旅游的质量

气象与旅游之间存在密切的关系,天气条件直接影响旅游者的出行决策、旅游体验和安全保障。通过高精度气象预测技术,可以有效提升旅游质量,为游客和旅游行业带来显著的优势。 1. 提高游客出行决策效率 个性化天气服务:基于高精度气象预测,旅游平台可以提供个性化的天气预报服…

华为OD --- 靠谱的车

华为OD --- 靠谱的车 题目OJ用例独立实现思路源码 参考实现思路源码实现 题目 OJ用例 测试用例case 独立实现 思路 独立实现的思路比较简单,直接建一个长度为N的数组,然后找出index中不包含4的项数即可 源码 const rl require("readline").createInterface({ …