当前位置: 首页 > news >正文

嵌入式学习——数据结构(双向无头无环链表)——day47

1. makefile——(注意:双向无头链表第一个节点的pre为空,最后一个节点的next为空)

                                        单向无头链表只能找到后一个节点、双向无头链表前后节点都能找到

OBJ:=doulink
OBJS+=main.c doublelink.c
CCl=gcc$(OBJ):$(OBJS)$(CC) $^ -o $@
.PHONY:
clean:rm $(OBJ)
test:valgrind --tool=memcheck --leak-check=full ./$(OBJ)

2. doublelink.h

#ifndef _DOUBLELINK_H_
#define _DOUBLELINK_H_typedef struct stu
{int id;char name[32];int score;
}DataType;typedef struct node
{DataType data;struct node *ppre;struct node *pnext;
}DouNode;typedef struct list
{DouNode *phead;int clen;
}DouList;extern DouList *create_dou_link();
extern int is_empty_dou_link(DouList *plist);
extern int push_head_dou_link(DouList *plist, DataType data);
extern void dou_link_for_each(DouList *plist, int dir);
extern int  push_tail_dou_link(DouList *plist, DataType data);
extern int pop_head_dou_link(DouList *plist);
extern int pop_tail_dou_link(DouList *plist);
extern DouNode *find_name(DouList *plist, char *pname);
extern int modify_score(DouList *plist, char *pname, int pscore);
extern void destory_dou_link(DouList *plist);#endif

3. doublelink.c

#include "doublelink.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>DouList *create_dou_link()//创建标签
{DouList *plist = NULL;plist = (DouList *)malloc(sizeof(DouList));if (NULL == plist){perror("fail to malloc");return NULL;}plist->phead = NULL;plist->clen = 0;return plist;
}int is_empty_dou_link(DouList *plist)//判断空链表
{if (NULL == plist->phead){return 1;}return 0;
}int push_head_dou_link(DouList *plist, DataType data)//头插
{DouNode *pnode = NULL;pnode = malloc(sizeof(DouNode));if (NULL == pnode){perror("fail to malloc");return -1;}pnode->data = data;pnode->ppre = NULL;pnode->pnext = NULL;if (is_empty_dou_link(plist))//空链表直接插{plist->phead = pnode;}else{pnode->pnext = plist->phead;plist->phead->ppre = pnode;plist->phead = pnode;}plist->clen++;return 0;
}void dou_link_for_each(DouList *plist, int dir)//两种方式遍历链表,1顺序遍历打印  0逆序遍历打印
{if (is_empty_dou_link(plist)){return;}DouNode *ptmp = plist->phead;if (dir)//顺序遍历打印{while (ptmp){printf("%d %s %d\n", ptmp->data.id, ptmp->data.name, ptmp->data.score);ptmp = ptmp->pnext;}}else//逆序遍历打印{while (ptmp->pnext)//走到末尾{ptmp = ptmp->pnext;}while (ptmp){printf("%d %s %d\n", ptmp->data.id, ptmp->data.name, ptmp->data.score);ptmp = ptmp->ppre;}}printf("\n");
}int push_tail_dou_link(DouList *plist, DataType data)//头插
{DouNode *p = NULL;DouNode *pnode = NULL;pnode = malloc(sizeof(DouNode));if (NULL == pnode){perror("fail to malloc");return -1;}pnode->data = data;pnode->ppre = NULL;pnode->pnext = NULL;if (is_empty_dou_link(plist))//空链表直接插{plist->phead = pnode;}else{   p = plist->phead;while (p->pnext != NULL){p = p->pnext;}p->pnext = pnode;pnode->ppre = p;}plist->clen++;return 0;
}int pop_head_dou_link(DouList *plist)//头删
{if (is_empty_dou_link(plist))//空链表直接结束程序{return -1;}DouNode *pfree = NULL;pfree = plist->phead;plist->phead = pfree->pnext;//标签指向第二个节点首地址if (plist->phead != NULL)//判断是否空链表{plist->phead->ppre = NULL;//将第二个节点的ppre变为NULL}free(pfree);plist->clen--;return 0;
}int pop_tail_dou_link(DouList *plist)//尾删
{if (is_empty_dou_link(plist))//空链表程序结束{return -1;}DouNode *pfree = NULL;pfree = plist->phead;while (pfree->pnext)//指针指向最后一个节点{pfree = pfree->pnext;}if (pfree->ppre != NULL)//链表有两个以上节点{pfree->ppre->pnext = NULL;}else //链表只有一个节点{plist->phead = NULL;}free(pfree);plist->clen--;return 0;
}DouNode *find_name(DouList *plist, char *pname)//寻找name
{DouNode *ptmp = NULL;ptmp = plist->phead;while (ptmp != NULL){if (!strcmp(pname, ptmp->data.name)){return ptmp;}ptmp = ptmp->pnext;}return NULL;
}int modify_score(DouList *plist, char *pname, int pscore)//修改分数
{DouNode *ptmp = NULL;ptmp = find_name(plist, pname);if (ptmp != NULL){ptmp->data.score = pscore;return 0;}return -1;
}void destory_dou_link(DouList *plist)//链表摧毁
{while (!is_empty_dou_link(plist)){pop_head_dou_link(plist);}free(plist);
}

4. main.c

#include <stdio.h>
#include <stdlib.h>
#include "doublelink.h"int main(void)
{DataType stus[] = {{1, "doinb", 100},{2, "lwx", 67},{3, "lqs", 99},{4, "tian", 98},{5, "gimgoon", 78},{6, "xinyi", 88},{7, "nuguri", 99},{8, "khan", 77},{9, "bo", 94},{10, "xiaolaohu", 60}};DouNode *ptmpnode = NULL;DouNode *pnamepnode = NULL;int ret_modify = 0;int i = 0;int new_score[] = {100, 99, 98, 97, 96, 95, 94, 93, 92, 91};DouList *plist = create_dou_link();//表头创建if (NULL == plist){return -1;}for (i = 0; i < sizeof(stus) / sizeof(stus[0]); i++)//给链表中插入结构体中的所有内容{push_tail_dou_link(plist, stus[i]);//尾插}dou_link_for_each(plist, 1);dou_link_for_each(plist, 0);#if 0for (i = 0; i < sizeof(stus)/sizeof(stus[0]); i++)//遍历查找{pnamepnode = find_name(plist, stus[i].name);if (pnamepnode != NULL){printf("find node ");printf("%d  ", pnamepnode->data.id);printf("%s  ", pnamepnode->data.name);printf("%d\n", pnamepnode->data.score);}else{printf("not find this node\n");}}
#endif#if 0for (i = 0; i < sizeof(stus)/sizeof(stus[0]); i++)//遍历修改{ret_modify = modify_score(plist, stus[i].name, new_score[i]);if (-1 == ret_modify){perror("fail to modify_score\n");}}dou_link_for_each(plist, 1);dou_link_for_each(plist, 0);
#endif#if 0for (i = 0; i < sizeof(stus) / sizeof(stus[0]); i++)//测试头删{pop_head_dou_link(plist);//尾删dou_link_for_each(plist, 1);dou_link_for_each(plist, 0);}
#endif destory_dou_link(plist);//销毁return 0;
}

2. 程序注意

        1. 指针遍历

        (1)操作此指针

    if (ptmp != NULL){ptmp = ptmp->pnext;}

        (2)指针指向链表节点末尾

    if (ptmp->pnext != NULL){ptmp = ptmp->pnext;}

相关文章:

嵌入式学习——数据结构(双向无头无环链表)——day47

1. makefile——&#xff08;注意&#xff1a;双向无头链表第一个节点的pre为空&#xff0c;最后一个节点的next为空&#xff09; 单向无头链表只能找到后一个节点、双向无头链表前后节点都能找到 OBJ:doulink OBJSmain.c doublelink.c CClgcc$(OBJ):$(OBJS)$(CC) $^ -o $ .PH…...

MYSQL 将某个字段赋值当前时间

如 我们需要将use_time 赋值为当前时间&#xff1a; 准备三条数据 &#xff1a; 执行sql &#xff0c;2种当前时间赋值函数&#xff0c;1种关键字赋值 &#xff1a; update test_info SET use_timeNOW() WHERE id 1; update test_info SET use_timeCURRENT_TIMESTAMP() …...

ModelSim® SE Command Reference Manual : find命令的用法

该命令按类型和名称定位对象。命令的参数按对象类型分组。 1、语法 find nets | signals <object_name> … [-internal] [-nofilter] {[-in] [-inout] [-out] | [-ports]} [-recursive]find instances | blocks {<object_name> … | -bydu <design_unit> |…...

PHPMailer发送的中文内容乱码如何解决

一&#xff1a; PHPMailer sdk 文件中有个设置默认编码的位置&#xff1a; vendor/phpmailer/phpmailer/src/PHPMailer.php 二&#xff1a; 实际业务代码中&#xff1a; require /sdk/PHPMailer/vendor/autoload.php;$mail new PHPMailer(true);try {//Server settings$mai…...

.npmrc配置文件

.npmrc配置文件 .npmrc 是一个用于配置 npm 行为的文件。这个文件可以位于多个地方&#xff0c;但最常见的是位于项目目录或者你的用户主目录。npmrc文件由一系列键值对组成&#xff0c;用于配置npm在执行命令时的行为和参数。 一个 .npmrc 文件的例子可能包含以下内容&#…...

无线桥接两个路由器 实现全屋网络全覆盖

由于房屋结构、面积等因素&#xff0c;单个路由器的信号很难覆盖整个家。这时&#xff0c;我们可以通过无线桥接的方式&#xff0c;将两个路由器连接成一个网络&#xff0c;实现家庭网络的全面覆盖。 一、准备工作 在进行无线桥接之前&#xff0c;我们需要准备以下设备&#…...

qt开发-14_QListwidget 仿qq好友列表制作

QListWidget 继承 QListView。QListWidget 类提供了一个基于项的列表小部件。QListWidg et 是一个便捷的类&#xff0c;它提供了一个类似于 QListView&#xff08;下一小节将讲到&#xff09;提供的列表视图&#xff0c;但 是提供了一个用于添加和删除项目的基于项目的经典接口…...

基于hutool的sm2非对称加密使用示例

前言 现在在网上已经有很多同学对hutool的sm2使用进行了详细的介绍。但是在使用过程中不是很符合我个人的使用情况。我在这儿自己整理了一版&#xff0c;一方面希望能对有需要的同学有些许帮助&#xff0c;另一方面做个笔记&#xff0c;方便后期直接cv。 引入依赖 <dependen…...

深入Scala的变量声明与类型推断:语法糖下的智能推导

Scala是一种静态类型语言&#xff0c;以其强大的类型推断系统而闻名。变量声明和类型推断是Scala编程中的基础概念&#xff0c;它们共同简化了代码的编写并提高了开发效率。本文将深入探讨Scala中变量声明的语法规则和类型推断的工作原理。 1. Scala静态类型的优越性 静态类型…...

ATA-4052C高压功率放大器在新能源汽车安全测试中的应用

新能源汽车的崛起已经改变了汽车行业的格局&#xff0c;为环境友好型交通方式提供了更多的选择。为了确保这些新型汽车的安全性和可靠性&#xff0c;进行全面的安全测试是至关重要的。高压功率放大器在新能源汽车的安全测试中发挥着重要的作用&#xff0c;本文将介绍其应用以及…...

liunx打开谷歌报错

liunx打开谷歌报错[48526:48526:0624/173553.311113:ERROR:zygote_host_impl_linux.cc(99)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 这个错误信息表明你尝试以root用户身份运行Chrome浏览器&#xff0c;但是没有使用–no-san…...

ICMAN液位检测大盘点

ICMAN液位检测原理&#xff1a; 基于双通道比较原理&#xff0c;一个通道检测当前无水状态下的环境电容&#xff0c;另一个通道通过传感电极去检测容器内液体的变化情况&#xff0c;通过两个通道电容的差值与芯片内部设定阈值做比较&#xff0c;来判断容器壁内部液位的变化或者…...

2024软件设计师笔记之考点版(一考就过):1-10

软件设计师之一考就过:成绩版 考点1:CPU、指令 真题1:CPU 执行算术运算或逻辑运算时,常将源操作数和结果暂存在(累加器(AC))中。 真题2:在程序的执行过程中,Cache与主存的地址映射是由(硬件自动)完成的。 真题3:计算机执行程序时,内存分为静态数据区、代码区、…...

Java中的性能优化技巧

Java中的性能优化技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java开发中&#xff0c;性能优化是一项重要且经常需要面对的任务。尽管Java提供了许多…...

一位Java软件开发工程师繁忙的一天

早晨&#xff1a;迎接新的一天 7:00 AM - 起床 每天早晨七点准时起床。洗漱、早餐后&#xff0c;他查看手机上的邮件和待办事项&#xff0c;以便提前了解今天的工作内容。 8:00 AM - 前往公司 乘坐公交车前往公司。路上&#xff0c;他通过手机阅读一些技术博客或参加在线技术…...

容易上手的AI图片生成软件有哪些值得推荐?

随着人工智能技术的飞速发展&#xff0c;我们的生活也正在经历一场前所未有的变革。其中&#xff0c;AI图片生成软件的出现&#xff0c;为我们的创作提供了更多的可能性。那么接下来就来介绍几款容易上手、功能强大的AI图片生成软件。 首先是建e网AI&#xff0c;这是一个专为设…...

如何高效运营交友APP

如何高效运营交友APP?在当今的互联网时代&#xff0c;交友App已成为连接人与人之间情感纽带的桥梁。然而&#xff0c;面对激烈的市场竞争和不断变化的用户需求&#xff0c;如何高效运营一款交友App&#xff0c;确保用户黏性并提升安全体验&#xff0c;成为每个运营者关注的焦点…...

使用@Lazy注解解决循环依赖的问题

有这样一个场景&#xff1a; 订单服务与用户服务的循环依赖 假设在一个电商系统中&#xff0c;我们有两个服务类&#xff1a;OrderService 和 UserService。 OrderService 需要访问用户服务来获取或更新订单关联的用户信息。例如&#xff0c;当处理订单时&#xff0c;可能需要…...

manim边学边做--SingleStringMathTex

SingleStringMathTex是Mobjects分类中用来显示数学公式的class。 manim中有3个可以用来显示数学公式的class&#xff0c;还有两个是MathTex和Tex&#xff0c;后续再介绍。 从SingleStringMathTex的名称中也可以看出&#xff0c;它是用来显示只有一行的简单公式。 SingleStrin…...

4、双足机器人mpc基础概念

MPC全称是Model Predictive Control,即模型预测控制。主要思想是通过建立机器人动态模型,在运动过程中通过控制输入,来预测机器人未来的运动轨迹和状态。此处的机器人特指双足机器人。 坐标系1、W(orld)系:固定于地面上某点,用于定义机器人绝对位置的是世界坐标系。此处x=…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...