双向链表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) 

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

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

相关文章

【Debian】报错:su: Authentication failure

项目场景&#xff1a; 今天我重新刷了一个debian系统。 系统版本&#xff1a; # 查看系统版本 lsb_release -a 我的系统版本&#xff1a; No LSB modules are available. Distributor ID&#xff1a;Debian Description: Debian GNU/Linux 12 &#xff08;bookworm&#xff…

目录启示:PHP 与命名空间的声明

文章目录 参考环境命名空间概念版本支持影响范围 全局命名空间概念魔术常量 \_\_NAMESPACE\_\_声明全局命名空间 声明命名空间为空间命名命名规则核心命名空间 子命名空间的声明在同一文件中定义多个命名空间无括号命名空间声明有括号命名空间声明禁止混合使用推荐使用有括号命…

统信UOS1060设置自动关机01

原文链接&#xff1a;统信UOS1060设置自动关机01 hello&#xff0c;大家好啊&#xff0c;今天给大家介绍一篇如何在统信UOS 1060上实现自动关机的文章&#xff0c;本篇文章采用两种方式&#xff0c;第一种使用的是crontab定时任务的方式&#xff0c;第二种是使用at命令的方式&a…

服务器系统和普通系统的区别

随着信息技术的迅猛发展&#xff0c;服务器系统和普通系统在计算机领域扮演着重要的角色。虽然它们都是计算机操作系统的一种形式&#xff0c;但在设计、功能和用途上存在着显著的区别。本文将以服务器系统和普通系统的区别为方向&#xff0c;探讨它们之间的特点和应用。 首先…

实体解析实施的复杂性

实体的艺术表现斯特凡伯克纳 一、说明 实体解析是确定数据集中的两条或多条记录是否引用同一现实世界实体&#xff08;通常是个人或公司&#xff09;的过程。乍一看&#xff0c;实体分辨率可能看起来像一个相对简单的任务&#xff1a;例如&#xff0c;给定一张人物的两张照片&a…

natapp内网穿透-将本地运行的程序/服务器通过公网IP供其它人访问

文章目录 1.几个基本概念1.1 局域网1.2 内网1.3 内网穿透1.4 Natapp 2.搭建内网穿透环境3.本地服务测试 1.几个基本概念 1.1 局域网 LAN&#xff08;Local Area Network&#xff0c;局域网&#xff09;是一个可连接住宅&#xff0c;学校&#xff0c;实验室&#xff0c;大学校…

2核4G游戏服务器推荐(阿里云/腾讯云/华为云)

2核4G游戏服务器推荐&#xff0c;首选腾讯云2核4G5M带宽轻量应用服务器218元一年、阿里云2核4G4M带宽轻量应用服务器297元一年&#xff0c;华为云2核2G3M云耀L服务器95元一年&#xff0c;阿腾云来详细说下2核4G游戏服务器推荐配置大全&#xff1a; 目录 2核4G游戏服务器推荐 …

vue axios封装

Vue.js 是一款前端框架&#xff0c;而 Axios 是一个基于 Promise 的 HTTP 请求客户端&#xff0c;通常用于发送 Ajax 请求。在Vue.js开发中&#xff0c;经常需要使用 Axios 来进行 HTTP 数据请求&#xff0c;为了更好的维护和使用 Axios&#xff0c;我们可以对其进行封装。下面…

前端 js导出excel

一、导出效果 二、导出代码 download() {let data [{name: aaaa,age: 10,address: 广东,phone: 1,wechart: 1},{name: bbbb,age: 11,address: 广西,phone: 2,wechart: 2},{name: cccc,age: 12,address: 山东,phone: 3,wechart: 3}]if (!data.length) {this.$Message.warnin…

暴力递归转动态规划(九)

题目 题有点难&#xff0c;但还挺有趣 有一个咖啡机数组arr[]&#xff0c;其中arr[i]代表每一个咖啡机冲泡咖啡所需的时间&#xff0c;有整数N&#xff0c;代表着准备冲咖啡的N个人&#xff08;假设这个人拿到咖啡后喝完的时间为0&#xff0c;拿手里咖啡杯即变空&#xff09;&a…

postman和jmete接口测试的用法与区别

前言 前阶段做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大…

【Qt】字体更大的富文本

使用size属性只能生成7个等级的字号&#xff0c;超过7的都视作为7。 当需要更加夸张的字号时则需要使用style属性&#xff0c;除此之外利用该属性可以生成更加逆天丰富的样式&#xff0c;(style属性是CSS样式表。 稍微跑题一下&#xff1a;似乎有安全性的考量&#xff0c;不少…

Java延迟队列——DelayQueue

Java延迟队列——DelayQueue DelayQueue的定义 public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E>DelayQueue是一个无界的BlockingQueue&#xff0c;是线程安全的&#xff08;无界指的是队列的元素数量不存…

如何快速区分GPT-3.5 与GPT-4?

GPT 3.5 和 GPT-4 有什么区别&#xff1f; GPT-3.5 在经过大量数据训练后&#xff0c;成功地发展到可以考虑 1750 亿个参数以响应提示。这使其具备令人印象深刻的语言技能&#xff0c;以非常人性化的方式回应各种查询。然而&#xff0c;GPT-4 在更为庞大的训练数据基础上进行了…

【Qt】对话框QDialog

文章目录 **对话框**QDialog**基本概念**对话框分类标准对话框自定义消息框模态对话框非模态对话框 案例&#xff1a;点击新建按钮弹出对话框消息对话框其它标准对话框 对话框QDialog 基本概念 对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组…

【uniapp微信小程序+springBoot(binarywang)

uniapp前端代码 <template><view><page-head :title"title"></page-head><view class"uni-padding-wrap"><view style"background:#FFF; padding:50rpx 0;"><view class"uni-hello-text uni-cente…

pycharm2020无法打开,点击无反应

pycharm 2020 无法打开&#xff0c;点击无反应&#xff0c;今天我碰到这现象&#xff0c;总结大体原因 C:\Users\ygw\AppData\Roaming\JetBrains &#xff08;删除该目录即可&#xff0c;一般由于升级安装 或 安装两个不同版本 会存在老旧文件影响导致&#xff09;

SpringSecurity + jwt + vue2 实现权限管理 , 前端Cookie.set() 设置jwt token无效问题(已解决)

问题描述 今天也是日常写程序的一天 , 还是那个熟悉的IDEA , 还是那个熟悉的Chrome浏览器 , 还是那个熟悉的网站 , 当我准备登录系统进行登录的时候 , 发现会直接重定向到登录页 , 后端也没有报错 , 前端也没有报错 , 于是我得脸上又多了一张痛苦面具 , 紧接着在前端疯狂debug…

dpdk/spdk/网络协议栈/存储/网关开发/网络安全/虚拟化/ 0vS/TRex/dpvs技术专家成长体系教程

课程围绕安全&#xff0c;网络&#xff0c;存储&#xff0c;云原生4个维度去讲解核心技术点。 6个专栏组成&#xff1a;dpdk网络专栏、存储技术专栏、安全与网关开发专栏、虚拟化与云原生专栏、测试工具专栏、性能测试专栏 一、dpdk网络 dpdk基础知识 多队列网卡&#xff0…