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

双向链表C语言版本

1、声明链表节点操作函数 linklist.h

#ifndef LINKLIST_H__
#define LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>//#define TAIL_ADD
#define HEAD_ADD
typedef int LinkDataType;
// 构造节点
struct LinkNode
{LinkDataType data;struct LinkNode* pre;struct LinkNode* next;
};
typedef struct LinkNode LinkNode;/**创建带头结点链表*/
LinkNode*  create_linklist();LinkNode*  get_link_node(LinkNode*  node);/**新增节点*/
int  insert_link_node(LinkNode*  link,LinkDataType data);/**修改节点*/
int  update_link_node(LinkNode*  link,LinkDataType data,int index);bool  is_end(LinkNode*  link,LinkNode*  node);void  show_link_node(LinkNode* node);/**节点查询*/
int   find_link_node(LinkNode* link,LinkDataType data);void  show_link(LinkNode* link);/**链表销毁*/
void  destory_link(LinkNode* link);int*  get_arr();#endif

2、定函数实现linklist.c

#include "linklist.h"LinkNode*  create_linklist()
{LinkNode* link =  malloc(sizeof(LinkNode*));if(link == NULL){perror("create_linklist  fail");exit(0);}link->next = link;link->pre  = link;link->data = 0;return link;
}int  insert_link_node(LinkNode*  link,LinkDataType data)
{LinkNode* node =  malloc(sizeof(LinkNode*));if(node == NULL){perror("node  init  fail");exit(0);}node->data = data;/// 头插法#ifdef HEAD_ADDnode->pre = link;node->next = link->next;link->next->pre = node;link->next = node; #endif///尾插法#ifdef TAIL_ADDnode->next = link;node->pre =  link->pre;link->pre->next = node;link->pre = node;#endifreturn 0;
}LinkNode*  get_link_node(LinkNode*  node)
{LinkNode*  tmp = NULL;#ifdef HEAD_ADDtmp =  node->next;#endif#ifdef TAIL_ADDtmp =  node->pre;#endifreturn tmp;
}bool  is_end(LinkNode*  link,LinkNode*  node)
{#ifdef HEAD_ADDreturn node->next==link->pre;   #endif#ifdef TATL_ADDreturn node->pre==link->next#endif
}int  delete_link_node(LinkNode* link,LinkDataType data)
{LinkNode*  node = link;while (node){if(node->data == data){LinkNode*  next_tmp = get_link_node(node);node->pre->next = node->next;node->next->pre = node->pre;free(node);node = next_tmp;  }}return 0;  
}int  update_link_node(LinkNode*  link,LinkDataType data,int index)
{int c = 0;LinkNode*  node = link;while (node){if(c == index){node->data = data;return c;}node = get_link_node(node);if(is_end(link,node))break;}return -1;
}int  find_link_node(LinkNode* link,LinkDataType data)
{int  index =0;LinkNode*  node = link;while (node){if(node->data==data){return index;}node = get_link_node(node);index++;if(is_end(link,node))break;}return -1;
}void  show_link_node(LinkNode* node)
{int  pre_data = 0;int  next_data = 0;int  data = node->data;if(node->pre!=NULL){pre_data = node->pre->data;}if(node->next!=NULL){next_data = node->next->data;}printf("%d, %d, %d \n",pre_data,data,next_data);
}void show_link(LinkNode* link)
{LinkNode*  node = link;while (!is_end(link,node)){show_link_node(node);node = get_link_node(node);}
}void  destory_link(LinkNode* link)
{LinkNode*  node = link;while (node){LinkNode* tmp = get_link_node(node);free(node);node = tmp;if(is_end(link,node))break;}
}int*  get_arr()
{int len =10;int* arr = malloc(len*sizeof(int*));int i=0;for(;i<len;i++){arr[i]=i;}return arr;
}

3、编写测试函数main.h  main.c

    main.h函数定义定义

#ifndef MAIN_H__
#define MAIN_H__
#include "linklist.h"void  test_double_link_list()
{LinkNode*  link = create_linklist();int* arr = get_arr();int i=0;for(;i<10;i++){insert_link_node(link,*(arr+i));  }show_link(link);free(link);free(arr);
};#endif

 main.c调用测试

#include "main.h"int main()
{test_double_link_list();exit(0);
}

4、编写Makefile文件

#$^ 表示所有的依赖文件
#$@ 表示生成的目标文件
#$< 代表第一个依赖文件
#dapp: main.o
#	gcc main.o  -o dsapp
#main.o: main.c 
#	gcc -c  main.c  -o  main.o
#SRCS += $(wildcard *.c)
#INCS += $(wildcard *.h)BUILD_DIR = ./build
TARGET_COMPILE += $(BUILD_DIR)/main.o  $(BUILD_DIR)/linklist.o
TARGET_EXE  = dsapp.outall: msg $(TARGET_EXE)  clean  #输出环境变量
msg:@echo $(CC) @echo $(RM)#生成可执行文件
$(TARGET_EXE): $(TARGET_COMPILE)$(CC) -Wall  $^  -o  $@#执行编译
$(BUILD_DIR)/%.o: %.c$(CC) -Wall -c $^ -o $@#删除编译文件
clean: $(TARGET_COMPILE) $(RM) $(TARGET_COMPILE) 

相关文章:

双向链表C语言版本

1、声明链表节点操作函数 linklist.h #ifndef LINKLIST_H__ #define LINKLIST_H__ #include <stdio.h> #include <stdlib.h> #include <stdbool.h>//#define TAIL_ADD #define HEAD_ADD typedef int LinkDataType; // 构造节点 struct LinkNode {LinkDataTy…...

visual studio安装时候修改共享组件、工具和SDK路径方法

安装了VsStudio后,如果自己修改了Shared路径&#xff0c;当卸载旧版本&#xff0c;需要安装新版本时发现&#xff0c;之前的Shared路径无法进行修改&#xff0c;这就很坑爹了&#xff0c;因为我运行flutter程序的时候&#xff0c;报错找不到windows sdk的位置&#xff0c;所以我…...

Motorola IPMC761 使用边缘TPU加速神经网络

Motorola IPMC761 使用边缘TPU加速神经网络 人工智能(AI)和机器学习(ML)正在塑造和推进复杂的自动化技术解决方案。将这些功能集成到硬件中&#xff0c;解决方案可以识别图像中的对象&#xff0c;分析和检测模式中的异常或找到关键短语。这些功能对于包括但不限于自动驾驶汽车…...

EM@直线的参数方程

文章目录 abstract直线参数方程从运动轨迹的角度从普通方程转换导参数方程向量法 参数方程间的转换从第3型转化为第2型方程组例 abstract 平面直线的参数方程的3种表示形式直线参数方程间的转换 直线参数方程 以下从不同角度推导直线参数方程分别记为第1,2,3形式参数方程 从…...

day08-注册功能、前端登录注册页面复制、前端登录功能、前端注册功能

1 注册功能 补充(开放文件夹内) 2 前端登录注册页面复制 4 前端注册功能 1 注册功能 # 分析前端&#xff1a;携带数据格式 {mobile:,code:,password}后端&#xff1a;-1 视图类---》注册方法-2 序列化类---》校验&#xff0c;保存&#xff08;表中字段多&#xff0c;传的少---…...

rust: function

///file: nestd.rs ///ide: RustRover 233.8264.22 /// /// /// /***自定义函数*/ pub fn function() {println!("called my::nested::function()"); }#[allow(dead_code)] fn private_function() {println!("called my::nested::private_function()"); }/…...

零代码编程:用ChatGPT批量下载谷歌podcast上的播客音频

谷歌podcast有很多播客音频&#xff0c;如何批量下载到电脑呢&#xff1f; 以这个播客为例&#xff1a; https://podcasts.google.com/feed/aHR0cHM6Ly9oYWRhcnNoZW1lc2guY29tL2ZlZWQvcG9kY2FzdC8?saX&ved0CAkQlvsGahcKEwi4uauWsvKBAxUAAAAAHQAAAAAQAg 查看网页源代码&a…...

nginx.4——正向代理和反向代理(七层代理和四层代理)

1、正向代理反向代理 nginx当中有两种代理方式 七层代理(http协议) 四层代理(tcp/udp流量转发) 七层代理 七层代理&#xff1a;代理的是http的请求和响应。 客户端请求代理服务器&#xff0c;由代理服务器转发给客户端http请求。转发到内部服务器&#xff08;可以单台&#…...

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(三)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 相应的后端也要做一些调整 1、启动流程修改如下&#xff1a; /*** 启动流程实例*/private R startProce…...

Spring-事务源码解析2

上一篇文章我们介绍了事务开启注解EnableTransactionManagement源码解析《Spring-事务源码解析1》 里面提到了2个关键组件&#xff0c;这里我们分析下Spring如何利用这2个组件来给Bean创建代理对象。 本篇文章我们看下当一个类里面包含了Transactional注解&#xff0c;Spring如…...

基于ssm008医院门诊挂号系统+jsp【附PPT|开题|任务书|万字文档(LW)和搭建文档】

主要功能 后台登录&#xff1a;4个角色 管理员&#xff1a; ①个人中心、修改密码、个人信息 ②药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断信息管理、病例库管理、开药信息管理、药品信息管理、收费信息管理 药房&#xff1a; ①个人中心、修…...

【Linux常用命令11】Linux文件与权限详解

权限 r &#xff1a;读权限&#xff0c;用数字4表示 w &#xff1a;写权限&#xff0c;用数字2表示 x &#xff1a;执行权限&#xff0c;用数字1表示 常用权限 644&#xff1a;代表所有者拥有读、写权限&#xff0c;而所属组和其他人拥有只读权限。 755&#xff1a;代表所有…...

BAT026:删除当前目录指定文件夹以外的文件夹

引言&#xff1a;编写批处理程序&#xff0c;实现删除当前目录指定文件夹以外的文件夹。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑】…...

Python浏览器自动化

如果你正在进行手机爬虫的工作&#xff0c;并且希望通过模拟浏览器行为来抓取数据&#xff0c;那么Pyppeteer将会是你的理想选择。Pyppeteer是一个强大的Python库&#xff0c;它可以让你控制浏览器进行自动化操作&#xff0c;如点击按钮、填写表单等&#xff0c;从而实现数据的…...

基于tornado BELLE 搭建本地的web 服务

我的github 将BELLE 封装成web 后端服务&#xff0c;采用tornado 框架 import timeimport torch import torch.nn as nnfrom gptq import * from modelutils import * from quant import *from transformers import AutoTokenizer import sys import json #import lightgbm a…...

信息系统漏洞与风险管理制度

1、总则 1.1、目的 为了进一步规范XXXXX单位信息系统风险管理活动&#xff0c;提升风险管理工作的可操纵性和适用性&#xff0c;使信息网络正常运行&#xff0c;防止网络攻击&#xff0c;保证业务的正常进行&#xff0c;依据XXXXX单位员的相关规范和标准规定&#xff0c;特制…...

Hadoop3教程(十七):MapReduce之ReduceJoin案例分析

文章目录 &#xff08;113&#xff09;ReduceJoin案例需求分析&#xff08;114&#xff09;ReduceJoin案例代码实操 - TableBean&#xff08;115&#xff09;ReduceJoin案例代码实操 - TableMapper&#xff08;116&#xff09;ReduceJoin案例代码实操 - Reducer及Driver参考文献…...

BAT026:删除当前目录及子目录下的空文件夹

引言&#xff1a;编写批处理程序&#xff0c;实现批量删除当前目录及子目录下的空文件夹。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑…...

nodejs+vue网课学习平台

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk

本文是LLM系列文章&#xff0c;针对《Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk》的翻译。 语言模型能制造乐趣吗?中国滑稽相声个案研究 摘要1 引言2 问题定义3 数据集4 使用自动评估生成基准5 人工评估6 讨论7 结论与未来工作 摘要 语言是…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...