双向循环链表

Posted Shemesz

tags:

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

1.双向链表的介绍

(1)双向链表节点结构

typedef struct DualNode

	ElemType data;
	struct DaulNode *prior;  //前驱结点;
	struct DaulNode	*next;   //后继结点
DualNode;

非空的双循环链表

(2)插入结点


插入操作不复杂,不过顺序很重要,千万不能写反,思路就是这样

  • 先处理插入结点的前后指向
  • 再让前面的指向自己,让后面的指向自己
s->next = p;   //让结点指向插入位置的后面结点
s->prior = p->prior;  //让结点指向插入位置前面的结点
p->prior->next = s;  //让前面的结点指向自己
p->prior = s;   //让后面的结点指向自己

(3)删除结点


思路如下:

  • 让上一个指向结点的下一个
  • 让结点的下一个再指向节点的上一个
p->prior->next = p->next; 
p->next->prior = p->prior;
free(p);

2.双向循环链表实践

实验要求
要求输入一个数字,使得26个字母排列发生变化,例如:

  • 输入3,向左移3位DEFGHIJKLMNOPQRSTUVWXYZABC
  • 输入-3,向右移3位XYZABCDEFGHIJKLMNOPQRSTUVW

示意图:
p指针先指向头结点,此后不断标记新创建结点的位置;最后的Z结点的后继指向A,A的前驱指向Z完成循环

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

#define OK      1
#define ERROR   0   

typedef char    ElemType;

typedef struct DaulNode

    ElemType    data;
    struct DaulNode *prior;
    struct DaulNode *next;
DualNode, *DuLinkList;

int InitList(DuLinkList *L)

    DualNode    *p, *q;
    int         i;

    *L = (DuLinkList)malloc(sizeof(DualNode)); //生成头结点
    if(!(*L))
    
        return ERROR;
    

    (*L)->next = (*L)->prior = NULL; //形成空双向循环链表
    p = (*L);  //标记位置

    for(i = 0; i < 26; i++)
    
        q = (DuLinkList)malloc(sizeof(DualNode)); //创建插入节点
        if(!q)
        
            return ERROR;
        

        q->data = 'A' + i; //赋值ABCD...
        q->prior = p;   //让q指向上一个, 就是头结点(p就是头结点的标记)
        q->next = p->next; //让q指向下一个,就是头结点指向的下一个
        p->next = q; //最后让上一个结点指向自己q

        p = q; //标记新创建结点的位置
    

    p->next = (*L)->next;  //这两步就是形成循环,A Z相接
    (*L)->next->prior = p;

    (*L) = p;//为后面i<0做准备
    return OK;

void Case(DuLinkList *L, int i)

    if(i>0)
    
        do
        
            (*L) = (*L)->next; //头结点不断右移,整个链表向左移动(DFF...ABC)
        while(--i);
    

    if(i<0)
    

        do
        
            (*L) = (*L)->prior;//p的前驱变成了(*L)的前驱,原本头结点没有前驱的,这样头结点的前驱就可以指向ZYX...
        while(++i);    //整个头结点不断左移,整个链表向右移动(XYZABC)
    



int main()

    DuLinkList L;
    int        i, n;

    InitList(&L);

    printf("请输入一个整数\\n");
    scanf("%d", &n);
    printf("\\n");
    Case(&L, n);

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

    return OK;

打印结果

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

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

数据结构开发(11):双向循环链表的实现

双向循环链表

双向循环链表

双向循环链表

双向循环链表操作