双向循环链表
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;
打印结果
以上是关于双向循环链表的主要内容,如果未能解决你的问题,请参考以下文章