zoukankan      html  css  js  c++  java
  • 线性表-双向循环链表

    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;
    }
  • 相关阅读:
    bzoj1797
    bzoj1266
    bzoj1497
    bzoj1412
    bzoj3156
    JSOI2014第三轮总结
    bzoj1855
    bzoj1044
    codeforces 371D
    codeforces 371B
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12336864.html
Copyright © 2011-2022 走看看