//双向循环链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct DualNode
{
char data;
struct DualNode *prior;
struct DualNode *next;
}DualNode,*DuLinkList;
//初始化 把a到z依次赋值
DuLinkList InitList(DuLinkList L)
{
DualNode *p,*q;
int i;
if(!L)
return 0;
L->next=L->prior=NULL;
p=L;
for(i=0;i<26;i++)
{
q=(DuLinkList)malloc(sizeof(DualNode));
if(!q)
return 0;
q->data='A'+i;
q->prior=p;
q->next = p->next; //此处
p->next=q;
p=q;
}
p->next=L->next;
L->next->prior=p;
return L;
}
// 双向循环,可前 如:5,可后 如:-5
void Caesar(DuLinkList *L, int i)
{
*L = (*L)->next; // 获取第1个节点的地址
if(i>0)
{
do
{
*L = (*L)->next;
}while(--i);
}
if(i<0)
{
do
{
*L = (*L)->prior;
}while(++i);
}
}
void main()
{
DuLinkList L;
int i,n;
L=(DuLinkList)malloc(sizeof(DualNode));
InitList(L);
printf("请输入一个整数:");
scanf("%d",&n);
Caesar(&L,n); // 后面的 for循环是从 定位好的位置开始的,所以这里要改变头节点的指向,使其指向定位好的位置。
for(i=0;i<26;i++)
{
printf("%c",L->data);
L=L->next;
}
printf("\n");
}
|