`

双向循环链表简单实现

 
阅读更多

DLoopLinkList.h

//
// DLoopLinkList.h
//  双向循环链表 2013/03
//

#ifndef DLOOP_LINK_LIST_H
#define DLOOP_LINK_LIST_H

typedef int ElemType;
typedef struct DLoopLinkList
{
    struct DLoopLinkList *prior;
    ElemType data;
    struct DLoopLinkList *next;
}DLoopLinkList, *PtrDLoopLinkList;

void InitDLoopLinkList(PtrDLoopLinkList);
void DestoryDLoopLinkList(PtrDLoopLinkList);
void InsertDLoopLinkList(PtrDLoopLinkList, int, ElemType);
void ShowDLoopLinkList(PtrDLoopLinkList);
void Append(PtrDLoopLinkList, ElemType);
void Delete(PtrDLoopLinkList, int, ElemType *);

#endif

 DLoopLinkList.c

#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include "DLoopLinkList.h"

void InitDLoopLinkList(PtrDLoopLinkList ptrDLL)
{
    ptrDLL->prior = ptrDLL;
    ptrDLL->next = ptrDLL;
}

typedef PtrDLoopLinkList PDLLL;
void DestoryDLoopLinkList(PtrDLoopLinkList ptrDll)
{
    PDLLL pite;      // 用于遍历的指针
    PDLLL temp;      // 用于存放要删除的节点的临时指针

    pite = ptrDll->next;        // 指向首元节点

    while(pite != ptrDll)
    {
        temp = pite;
        pite = pite->next;
        free(temp);
    }

    ptrDll->prior = NULL;
}

//
// index表示插入到index之前
//
void InsertDLoopLinkList(PDLLL ptrDll, int index, ElemType data)
{
    // 构建新节点 
    PDLLL newNode = NULL;
    PDLLL pIte = NULL;          // 用来循环的指针
    PDLLL pHead = ptrDll;       // 头指针
    int i = -1;                 
    
    newNode = (PDLLL)malloc(sizeof(DLoopLinkList));
    newNode->data = data;

    pIte = pHead;         // 初始化指向首元节点
    // 遍历找到第i-1个节点
    while(i < index - 1)
    {
        pIte = pIte->next; 
        ++i;
    }
    //printf("i = %d, data = %d", i, pIte->data);

    if(i == index - 1)
    {
        //printf("call insert\n");
        newNode->prior = pIte;
        pIte->next->prior = newNode;
        newNode->next = pIte->next;
        pIte->next = newNode;
    }
}

void ShowDLoopLinkList(PDLLL dllList)
{
     PDLLL pIte;

     pIte = dllList->next;
     //printf("pIte = %p\n", pIte);
     while(pIte != dllList)
     {
        printf("%-4d",pIte->data); 
        pIte = pIte->next;
     }

     printf("\n");
}

void Append(PtrDLoopLinkList pdl, ElemType data)
{
    // 创建一个节点
    PDLLL newNode = (PDLLL)malloc(sizeof(DLoopLinkList));
    newNode->data = data;

    newNode->next = pdl->prior->next;
    pdl->prior->next = newNode;
    newNode->prior = pdl->prior;
    pdl->prior = newNode;
}

void Delete(PtrDLoopLinkList pdl, int index, ElemType * pData)
{
    int i = 0;
    PDLLL pIte = pdl->next;

    while(i < index && pIte != pdl)
    {
        pIte = pIte->next;
        ++i;         
    }

    if(i == index && pIte != pdl)
    {
        *pData = pIte->data;
        pIte->prior->next = pIte->next;
        pIte->next->prior = pIte->prior;
        free(pIte);
    }
}

 main.c

#include <stdio.h>
#include "DLoopLinkList.h"

#define Insert InsertDLoopLinkList

int main(int argc, char* argv[])
{
    DLoopLinkList dl;
    int i = 0;
    ElemType e;

    InitDLoopLinkList(&dl);
    for(; i < 100; ++i)
    {
        Append(&dl, i);
    }
    
    Insert(&dl, 100, 100);
    Insert(&dl, 0, 100);
    Insert(&dl, 1, 101);
    Delete(&dl, 0, &e);
    printf("The element which be deleted:%d\n", e);
    Delete(&dl, 101, &e);
    printf("The element which be deleted:%d\n", e);
    ShowDLoopLinkList(&dl);
    printf("<<ShowDLoopLinkList>> ends.\n");
    DestoryDLoopLinkList(&dl);
}

 

分享到:
评论

相关推荐

    Linux操作系统中通用双向循环链表的实现分析.pdf

    Linux操作系统中通用双向循环链表的实现分析 Linux操作系统是一个支持多用户、多任务、多线程和多CPU的开源操作系统,其内核功能强大、性能稳定并具有丰富的应用软件支持。Linux内核源代码主要由C语言和少量的汇编...

    双向循环链表C++实现

    双向循环链表的遍历相对简单,可以从头节点开始,通过next指针一直遍历到再次到达头节点为止,也可以从尾节点开始,通过prev指针遍历。 在数据结构课程设计中,你可能需要编写包括上述操作在内的各种函数,例如查找...

    双向循环链表来实现长整数四则运算

    在本实验中,我们利用双向循环链表来实现长整数的存储和四则运算,特别是加法和减法。这种数据结构的选择主要是因为它能够方便地处理长整数的存储和运算过程中的进位和借位操作。 首先,双向循环链表的每个节点仅...

    航班订票系统(单向,双向循环链表)

    在实现过程中,我们看到有"Main.cpp"作为主程序入口,负责调用其他模块,如"LinearListLink.cpp"和"DoubleListLink.cpp"分别实现了单向链表和双向循环链表的相关操作。"PlaneData.dat"可能是存储航班数据的二进制...

    双向循环链表C代码实现

    在计算机科学中,数据结构是组织和存储数据的方式,它对于高效的算法设计至关重要。...这将帮助你深入理解双向循环链表如何被用于实现栈这一数据结构,以及如何通过 C++ 编程语言来实现这样的数据结构。

    双向循环链表 C++实现

    下面将详细讨论双向循环链表的原理、C++实现以及相关操作。 首先,双向循环链表的每个节点包含三个部分:数据域、前向指针和后向指针。数据域用于存储实际的数据,前向指针指向下一个节点,而后向指针则指向前一个...

    数据结构课程设计报告基于双向循环链表的通讯录设计

    该项目旨在利用双向循环链表这一数据结构来设计并实现一个通讯录程序,以展示对数据结构原理的理解和编程技巧。 **题目的内容与要求:** 项目的核心是创建一个能够管理联系人信息的通讯录,其功能包括但不限于添加...

    双向循环链表(C++)

    以下是一个简单的双向循环链表节点类的C++实现: ```cpp struct Node { int data; Node* prev; Node* next; Node(int d) : data(d), prev(nullptr), next(nullptr) {} }; ``` 接着,我们需要创建一个链表类,...

    双向循环链表在 LINUX kernel 中的实现

    通过对具体示例的分析,我们可以发现,虽然 Linux 内核中的双向循环链表实现看似简单,但实际上蕴含了许多优化技巧。这种设计既节省了内存空间,又提高了链表操作的效率,为内核中的各种数据管理任务提供了强大的...

    带头结点的双向循环链表

    双向循环链表是一种高级的数据结构,常用于需要前后移动指针的场景,如实现LRU缓存淘汰策略、编辑器的撤销重做功能等。本项目以C++语言实现了带头结点的双向循环链表,这将有助于我们深入理解这一概念。 首先,双向...

    利用双向循环链表实现快速排序算法

    利用了双向循环链表实现了快速排序算法

    双向循环链表的C++实现

    《双向循环链表的C++实现详解》 双向循环链表是一种高级的数据结构,它不仅包含了一般单向链表的特性,还允许从链表的任一节点出发,既能向前遍历也能向后遍历。在C++中实现双向循环链表,需要对链表的节点结构和...

    双向循环链表源码

    下面是一个简单的C++实现双向循环链表的源码示例: ```cpp struct Node { int data; Node* prev; Node* next; }; class DoublyCircularLinkedList { public: DoublyCircularLinkedList() : head(nullptr), ...

    用C++实现的双向循环链表

    ### 使用C++实现的双向循环链表 #### 知识点概述 本篇文章将详细介绍如何在C++中实现一个双向循环链表,并介绍其基本操作,包括创建空表、节点的插入与删除以及链表的逆置等核心功能。双向循环链表是一种线性表的...

    简单的双向循环链表

    本文将深入探讨“简单的双向循环链表”,并结合提供的`LinkedList.java`源码来理解其实现原理。 双向循环链表与单向链表不同,它在每个节点中不仅保存了指向下一个节点的指针,还保存了指向前一个节点的指针,这种...

    单链表实现双向循环链表_链表_

    单链表实现双向循环链表单向链表存在一个弊端就是,当需要获取某个结点p的前驱时,需要从头指针开始遍历链表,获得“前驱”的执行时间为O(n),为了克服单向链表的这种缺点,可以利用双向链表。在双向链表中有两个...

    数据机构C语言用双向循环链表实现通讯簿

    在本课程设计中,学生被要求使用C语言来实现一个基于双向循环链表的通讯录系统。这个系统应具备添加、插入、删除、查询和统计联系人信息的基本功能,并且要具备良好的用户界面和错误处理机制,以确保系统的稳定性和...

    一个精简的双向循环链表

    一个精简的双向循环链表C语言实现,与大家共享

    用C++写的双向循环链表派生栈和队列

    本文将详细讨论如何使用C++实现一个基于双向循环链表的派生栈和队列。 首先,我们要理解双向循环链表的基本概念。双向循环链表是一种链式存储结构,每个节点包含数据和两个指针,分别指向其前一个节点和后一个节点...

    C语言版双向循环链表 双向循环链表经典程序

    C语言版双向循环链表,双向循环链表经典程序,用于指针进行编写的C语言程序。。。

Global site tag (gtag.js) - Google Analytics