双向循环列表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
一个例子:输入一个数,然后给二十六个字母排序,如果输入的是整数,就将字母向后移这个整数个位,如果是负数,就向前移这个整数个位。
首先,建立一个空节点,然后按照上图的循环开辟空间赋值。
#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)->next = (*L)->prior=NULL;//空节点 p=(*L);//当前位置 for(i=0;i<26;i++) { q=(DualNode *)malloc(sizeof(DualNode));//开辟新节点 if(!q) { return ERROR; } q->data='A' +i;//新节点赋值a q->prior=p;//新节点的前驱指向前一个空节点的值 q->next=p->next;//新节点的后驱指向前面空节点的后驱 p->next=q;//前一空节点的后驱指向当前节点的值 p=q;//互换 循环 } p->next=(*L)->next; (*L)->next->prior=p; return OK; } void Caesar(DuLinkList *L,int i) { if(i>0) { do { (*L) = (*L)->next; }while(--i); } if(i<0) { do { (*L)=(*L)->next; }while(++i); } } int main() { DuLinkList L; int i,n; InitList(&L); printf("请输入一个整数:"); scanf("%d",&n); printf("\n"); Caesar(&L,n); for(i=0;i<26;i++) { L=L->next; printf("%c",L->data); } return 0; }