C语言实现双向循环链表

c语言简单实现双向循环链表 1.双向循环链表和双链表类似,只需把链表的头尾结点连通起来即可。(本文讨论的链表都是带头结点的) 2.空的双向循环链表其头结点的指针域都指向头结点自己。 非空的双向循环链表其头结点的直接前驱的指针域指向链表尾结点,其尾结点的直接后继的指针域指向链表的头结点,这样就可以把链表形成一个’‘环’。 3.双向循环链表的具体代码实现 #include<stdio.h> #include<malloc.h> #define ElemType int typedef struct LinkNo 阅读详情
  2009-04-16 21:45:56

这种方法见到过,也用过,转载过来记录一下:

原文地址:http://blog.chinaunix.net/uid-20696246-id-1892194.html


/* 双向循环链表,带头指针 */
struct list_node
{
    struct list_node *prev, *next;
};

/* 初始化头指针 */
void list_init_head(struct list_node* head)
{
    head->prev = head->next = head;
}

/* 量表是否为空 是返回1,否返回0 */
int list_is_empty(const struct list_node* head)
{
    return (head->prev == head) && (head->next == head);
}

/* 链表遍历 */
#define list_for_each(iter, head) \
    for (iter = (head)->next; iter != (head); iter = iter->next)

/* 链表逆序遍历 */
#define list_for_each_reverse(iter, head) \
    for (iter = (head)->prev; iter != (head); iter = iter->prev)

/* 链表遍历,支持删除操作 */
#define list_for_each_remove(iter, n, head) \
    for (iter = (head)->next, n = iter->next; iter != (head); iter = n, n = iter->next)

/* 求包含此链表的结构体指针 */
#define list_entry(ptr, type, member) \
    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

static void __list_insert(struct list_node* node, struct list_node* prev, struct list_node* next)
{
    prev->next = next->prev = node;
    node->prev = prev;
    node->next = next;
}

/* 插入头节点 */
void list_push_front(struct list_node* head, struct list_node* node)
{
    __list_insert(node, head, head->next);
}

/* 插入尾节点 */
void list_push_back(struct list_node* head, struct list_node* node)
{
    __list_insert(node, head->prev, head);
}

static void __list_delete(struct list_node* prev, struct list_node* next)
{
    prev->next = next;
    next->prev = prev;
}

/* 移除节点 */
void list_remove(struct list_node* node)
{
    __list_delete(node->prev, node->next);
    node->prev = node->next = NULL;
}

/* 链表接合 将list接合到head,新链表的头节点仍为head */
void list_splice(struct list_node* head, struct list_node* list)
{
    if (list_is_empty(list) == 0)
    {
        list->next->prev = head;
        head->prev = list->next;

        list->prev->next = head->next;
        head->next->prev = list->prev;
    }
}

 


#include <stdio.h>
#include <malloc.h>
#include "list.h"

struct Stu
{
    int no;
    int age;
    struct list_node list;
};

int main()
{
    struct list_node* iter;
    struct Stu head;
    struct Stu* p;

    list_init_head(&head.list);

    int i = 5;
    while (i--)
    {
        struct Stu* stu = (struct Stu*)malloc(sizeof(struct Stu));
        if(stu != NULL)
        {
            stu->no = i;
            stu->age = i+3;
            list_push_back(&head.list, &stu->list);
        }
    }

    list_for_each(iter, &head.list)
    {
        p = list_entry(iter, struct Stu, list);
        printf("%d, %d\n", p->no, p->age);
    }

    printf("\nReversed list:\n");
    list_for_each_reverse(iter, &head.list)
    {
        p = list_entry(iter, struct Stu, list);
        printf("%d, %d\n", p->no, p->age);
    }

    struct list_node* iter_backup;
    list_for_each_remove(iter, iter_backup, &head.list)
    {
        p = list_entry(iter, struct Stu, list);
        list_remove(iter);
        free(p);
    }

    return 0;
}

C语言使用双向循环链表实现通讯录 使用双向链表实现通信录,实现添加功能、删除功能、查询功能、修改功能、显示功能。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct linkman { char name[10]; char Tel[20]; struct linkman *prev; struc... 阅读详情

相关推荐

从Pikachu靶场实战解析越权漏洞:原理、攻击与防御

本文通过Pikachu靶场实战详细解析越权漏洞的原理、攻击方式与防御策略。文章深入探讨水平越权和垂直越权的危害,结合代码示例展示漏洞利用过程,并提供代码层和架构层的立体化防御方案,帮助开发者有效防范这一Web安全隐形杀手。

weixin_29325007的博客 358

C语言宏定义实现常用数据结构——双向循环链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、内存管理二、双向循环链表1.引入库2.读入数据总结 前言 C++、C#、python等高级语言都有链表、队列等常用的库。但是C语言却没有相应的库函数。 C语言中没有多态,如果在一个工程中,你想同时使用整形链表,字符型链表,就要定义两个结构体:List_int和List_char ,然后同样的插入、删除节点的代码要写两遍。 为了避免重复劳动,我写了通用的数据结构的库函数。为了实现多态的特性,使用了大量的指针强制类型转换。为了

qq_41922252的博客 2431

腾讯Octop:Windows本地AI助手一键安装实战指南

本地AI助手是面向普通用户在个人设备上运行大语言模型的轻量级解决方案,其核心原理在于封装模型加载、推理调度与Web交互等底层复杂性,通过预编译运行时、自适应硬件加速和图形化配置降低使用门槛。技术价值体现在免环境依赖、离线可用、开箱即用,显著提升非开发者在专利撰写、文案生成、技术文档处理等办公场景中的生产力。本文聚焦Windows平台下的腾讯Octop工具,结合qwen2-7b-instruct、phi-3-mini等主流GGUF量化模型,详解安装适配、API集成与专利辅助工作流,覆盖从零部署到工程落地的完整

weixin_29055137的博客 307

第四周 项目4—建设双链表算法库

1.头文件:cdlinklist.h,包含定义双链表数据结构的代码、宏定义、要实现算法的函数的声明; //循环双链表基本运算函数 typedef int ElemType; typedef struct DNode //定义双链表结点类型 { ElemType data; struct DNode *prior; //指向前驱结点 stru

fj的博客 430

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6028

数理金融学笔记 Chap2 二叉树模型Binomial

2 二叉树模型与期权定价 Binomial Model and Option Pricing 文章目录2 二叉树模型与期权定价 Binomial Model and Option Pricing单期二叉树模型 One-step Binomial Model风险与无风险资产单期二叉树模型与无套利条件无套利定价 No Arbitrage Pricing风险中性定价 Risk Neutral PricingDelta套期保值 Delta Hedging两期二叉树模型 Two-Step Binomial Model

weixin_66831131的博客 2387

c语言双循环链表,C语言--双循环链表(list_head.h)操作

#ifndef _LIST_H#define _LIST_H#define _INLINE_ static inlinestruct list_head {struct list_head *next, *prev;};#define LIST_HEAD_INIT(name) {&(name),&(name)}#define LIST_HEAD(name) \struct list...

weixin_31094177的博客 332

Redhawk-SC输入件配置中的5个常见错误及解决方法

本文针对Redhawk-SC功耗与可靠性签核工具,深入剖析了输入件配置中工艺文件错配、DEF文件路径、时序文件格式、电源网络模型及宏模型处理这5个最常见且棘手的错误。文章提供了资深工程师验证过的实战解决方案与检查清单,旨在帮助用户规避风险,提升配置效率与分析准确性,确保芯片签核流程的顺利进行。

earth的博客 233

C语言数据结构——循环链表

在双向循环链表中,每个结点包括三个域,分别是 data 域、next 域和 prev 域,其中data域为数据域,next 域为指向后继结点的指针域,prev域为指向前驱结点的指针域。下图为链表的结点结构。

m0_73676323的博客 1894

雷达回波仿真

文章目录前言一、基础理解1.慢时间维度和快时间维度2.脉冲压缩3.MTI4. 脉冲多普勒处理5.cacfar检测二、具体流程1.产生回波信息加入目标时延以及噪声2.解调回波得到基带信号3.脉冲压缩 MTI MTD cafar检测 前言 雷达算法仿真学习,主要流程包括生成目标回波,将基带信号加在载波上其次是加上目标信息和干扰信号后发射,解调回波信号得到基带信号然后MTI,MTD,最后再检测。 一、基础理解 1.慢时间维度和快时间维度 连续M个脉冲回波经过相干解调之后的基带数据形成的一个二维数据矩阵,.

qq_42961235的博客 1万+

QGIS安装与使用教程

QGIS安装与使用教程

weixin_46713695的博客 2万+

循环链表C语言实现

循环链表C语言实现

qq_48639334的博客 4261

UCIE Specification详解(八)

Logical Physical Layer(逻辑物理层)

Crazzy_M的博客 1608

追梦之旅【数据结构篇】——详解C语言动态实现带头结点的双向循环链表结构

保姆式详解C语言动态实现带头结点的双向循环链表结构

小梦的博客 2127

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据结构——C语言实现带头双向循环链表

数据结构——C语言实现带头双向循环链表 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了,比单链表实用的多。 图示: ListNode.h文件: 在这里插入代码片 ...

我爱吃香锅的博客 529

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c语言:双向循环链表的实现

// 双向循环链表实现.cpp : 定义控制台应用程序的入口点。 #include #include #include #define LEN sizeof(struct DSCriculist) using namespace std; typedef struct DSCriculist //定义结构体 { int data; //数据域 struct

在路上 1478

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

带哨兵的双向循环链表的C语言实现

标题:带哨兵的双向循环链表的C语言实现 内容:链表是一种基本的链式存储结构,带哨兵的双向循环链表更是一种方便的数据结构。 作者:MilkCu 定义 双向链表,也叫双链表,是链表的一种。它的每个数据节点含有两个指针,分别指向前驱和后继。在带哨兵的双向循环链表中,我们可以方便的访问任意节点的前驱节点和后继节点。 实现 下面的程序能够对双向链表实现元素的查找、插入、删除等操作,其中main函

MilkCu的专栏 1940

线性表之双向循环链表(C语言实现,详细注释版)

双向循环链表基本操作的实现只需对双向链表进行稍加修改就可以了,单向循环链表同理。这里仅对双向循环链表进行实现????! #include <stdio.h> #include <stdlib.h> #define HeadNodeFlag 0 #define N 10 //双向循环链表节点单元 typedef struct DoublyLink{ struct Doubly...

u010067603的博客 704

数据结构(初阶)—— C语言实现双向带头循环链表

双向循环链表

M的博客 2230

带头双向循环链表(C语言实现)

带头双向循环链表概念及结构 概念:带头双向循环链表结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。 带头双向循环链表的实现 List.h代码实现 #pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int LTDataTyp

xiaoming1999的博客 1644

c语言实现数据结构双向循环链表

由于双向循环链表的结构使尾插不需要在遍历链表去找尾节点,因为哨兵位头节点的prev指针正指向了尾节点,对该节点保存后插入即可,与头插逻辑类似,原本的尾节点指向新的尾节点,新的尾节点指向原本的尾节点,新的尾节点指向哨兵位头节点,哨兵位指向新的尾节点使其保持循环结构。哨兵位头节点创建有助于我们在增删查改时无需改变实际头节点的指针,实际头节点永远是哨兵位头节点的next指针指向的节点,因为哨兵位头节点不存储实际数据,也就是哨兵位头节点的下一个节点。以下是本次实现的函数声明以及双向链表节点结构体的定义。

2502_93749749的博客 1099

带头双向循环链表的C语言实现

带头双向循环链表是一种常见的数据结构,它具有以下特点:包含一个不存储实际数据的头节点每个节点都有指向前驱和后继的指针尾节点的后继指向头节点,头节点的前驱指向尾节点形成一个循环结构这种结构在插入、删除操作上具有很高的效率,特别是在头尾操作时时间复杂度为O(1)。// 前驱指针// 后继指针} LTNode;带头双向循环链表是一种高效的数据结构,具有以下优点:任意位置的插入和删除操作时间复杂度为O(1)可以双向遍历头尾操作效率高不需要特殊处理边界情况。

fantasy5_5的博客 841
上一篇: Vs2008创建DLL
下一篇: C++ 虚析构函数、纯虚析构函数
labrary
博客等级 码龄15年 8粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值