线性表-双向循环链表

Posted lemonzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表-双向循环链表相关的知识,希望对你有一定的参考价值。

1、双向循环链表

双向链表是在单链表的每个结点中,再设置一个纸箱其前驱结点的指针域。双向链表可以有效的提高算法的时间性能,用空间换取时间。

技术图片

typedef struct Node
{
    ElemType data;
    struct Node* prior;    //直接前驱指针
    struct Node* next;    //直接后继指针
}Node, * CLinkList;

2、双向链表的插入操作:(注意顺序)

技术图片

s->next=p;
s->prior=p->prior;
p->prior->next=s;
p->prior=s;

删除结点:

p->prior->next=p->next;
p->next->prior=p->prior;
free(p);

3、例子:

技术图片

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0

typedef char ElemType;
typedef int  Status;

typedef struct DualNode
{
    ElemType data;
    struct DualNode* prior;
    struct DualNode* next;
}DualNode, *DuLinkList;

Status InitList(DuLinkList *L)
{
    DualNode *p, *q;
    int i;

    *L = (DuLinkList)malloc(sizeof(DualNode));
    if (!(*L))
    {
        return ERROR;
    }
    (*L)->prior = (*L)->next = NULL;
    p = (*L);

    for (i = 0; i < 26; i++)
    {
        q = (DualNode*)malloc(sizeof(DualNode));
        if (!q)
        {
            return ERROR;
        }
        q->data = A + i;
        q->prior = p;
        q->next = p->next;
        p->next = q;

        p = q;
    }
    p->next = (*L)->next;
    (*L)->next->prior = p;
    (*L)->prior = p->prior;
    return OK;
}

void Caesar(DuLinkList* L, int i)
{
    if (i > 0)
    {
        do 
        {
            (*L) = (*L)->next;
        } while (--i);
    }

    if (i < 0)
    {
        do
        {
            (*L) = (*L)->prior;
        } while (++i);
    }
}

int main()
{
    DuLinkList L;
    int i,n;

    InitList(&L);
    printf("请输入一个整数:");
    scanf_s("%d", &n);
    printf("
");
    Caesar(&L, n);

    for (i = 0; i < 26; i++)
    {
        L = L->next;
        printf("%c", (L)->data);
    }
    printf("
");
    return 0;
}

 

以上是关于线性表-双向循环链表的主要内容,如果未能解决你的问题,请参考以下文章

带头双向循环链表的实现@线性表

数据结构线性表之双向带头循环链表

单链表,双向链表,循环链表

初阶数据结构——线性表——链表——带头双向循环链表

双向链表

《链表》之带头双向循环链表