嵌入式学习——数据结构(双向无头无环链表)——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——(注意:双向无头链表第一个节点的pre为空,最后一个节点的next为空) 单向无头链表只能找到后一个节点、双向无头链表前后节点都能找到 OBJ:doulink OBJSmain.c doublelink.c CClgcc$(OBJ):$(OBJS)$(CC) $^ -o $ .PH…...

MYSQL 将某个字段赋值当前时间
如 我们需要将use_time 赋值为当前时间: 准备三条数据 : 执行sql ,2种当前时间赋值函数,1种关键字赋值 : 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发送的中文内容乱码如何解决
一: PHPMailer sdk 文件中有个设置默认编码的位置: vendor/phpmailer/phpmailer/src/PHPMailer.php 二: 实际业务代码中: require /sdk/PHPMailer/vendor/autoload.php;$mail new PHPMailer(true);try {//Server settings$mai…...

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

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

qt开发-14_QListwidget 仿qq好友列表制作
QListWidget 继承 QListView。QListWidget 类提供了一个基于项的列表小部件。QListWidg et 是一个便捷的类,它提供了一个类似于 QListView(下一小节将讲到)提供的列表视图,但 是提供了一个用于添加和删除项目的基于项目的经典接口…...

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

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

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

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浏览器,但是没有使用–no-san…...

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

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

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

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

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

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

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

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

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

论坛实现随机发帖的学习
1、badboy操作,录制发帖全过程,录制结果保存,生成为.jmx格式的文件 2、在Jmeter中打开该.jmx文件,重命名,便于了解步骤 3、生成结果树,查看所以步骤是否正确 4、实现随机发帖 断言:具有唯一表…...

麒麟系统设置jar开机自启动自定义服务
项目场景: 在信创项目中,麒麟操作系统(兆芯)客户端访问web端程序时,PC机器上需要安装读卡器读卡服务(自定义服务)才能读取身份证/卡片信息,并开机自启动。 解决方案: /usr/local/custom-server目…...

WebPages 全局
WebPages 全局 概述 WebPages 全局是一个综合性的概念,涉及网站设计、开发、优化和管理的各个方面。在当今数字化时代,拥有一个功能齐全、用户友好的网站对于个人和企业来说至关重要。本文将深入探讨 WebPages 全局的相关主题,包括网站设计…...

19 Shell编程之条件语句
目录 19.1 条件测试操作 19.1.1 文件测试 19.1.1 整数值比较 19.1.3 字符串比较 19.1.4 逻辑测试 19.2 if条件语句 19.2.1 if语句的结构 19.2.2 if语句应用示例 19.3 case分支语句 19.3.1 case语句的结构 19.3.2 case语句应用示例 19.1 条件测试操作 Shell环境根据命令执行后…...

生产看板管理系统内容有哪些?
相信很多做生产管理的朋友都会遇到如下问题,我就在想,是否能一个创建“透明的”的工作场所?让员工和管理者能够实时查询生产进度,及时发现生产中的问题。 生产进度难追踪 生产过程不透明 生产决策缺乏数据支持 ——能…...

玩转数据库索引
1、概述 通常我们要对数据库进行优化,主要可以通过以下五种方法。 计算机硬件调优应用程序调优数据库索引优化SQL语句优化事务处理调优 本篇文章将向大家介绍数据库中索引类型和使用场合,本文以SQL Server为例,对于其他技术平台的朋友也是有…...

公共云遣返的经济性
在过去的几年里,显而易见的是,尽管公有云具有所有优势,但它并不能大规模地节省成本。它在一定程度上提高了生产力,但不会降低您的成本。公有云的好处在于,它提供了一个非常强大的价值主张,即基础设施可以立…...

夏季河湖防溺水新举措:EasyCVR+AI视频智能监控系统保障水域安全
近日一则新闻引起大众关注,有网友发布视频称,假期在逛西湖时,发现水面上“平躺”漂浮着一名游客在等待救援。在事发3分钟内,沿湖救生员成功将落水游客救到了岸边。 随着夏季的到来,雨水增多,各危险水域水位…...

2024年最新【交安】公路水运安全员备考题库。
46.( )负责建筑施工企业安全生产许可证的颁发和管理,并接受国务院建设主管部门的指导和监督。 A.国务院建设主管部门 B.国务院安全生产监督管理部门 C.省、自治区、直辖市人民政府建设主管部门 D.省、自治区、直辖市人民政府安全生产监督管理部门 答案&…...

Excel 宏录制与VBA编程 —— 16、InputBox函数的使用方式
Input函数基本操作 InputBox函数的Type参数使用技巧(输入类型限制,若输入类型不符系统提示) 关注 笔者 - jxd...