1.有图有真相
2.代码实现
//Caesar Password with DualLinkList
#include
#include
#define OK 1
#define ERROR 0
typedef char ElemType; //双向循环链表元素类型
typedef int Stutas;
typedef struct DualNode
{
ElemType data;
struct DualNode *prior; //前驱结点指针
struct DualNode *next; //后继结点指针
}DualNode, *DualLinkList; //结点元素 | 结点指针
/****************************************************/
/*函数名称:InitList -初始化双向循环链表 */
/*参 数:*L -指向链表的头指针 */
/*函数功能:生成双向循环链表ABCDEFG....Z(Z指向A...) */
/****************************************************/
Stutas InitList(DualLinkList *L) //初始化链表
{
DualNode *p, *q; //定义循环使用的临时结点
int i;
*L = (DualLinkList)malloc(sizeof(DualNode)); //链表头指针
if (!(L)) return ERROR;
(*L)->next = (*L)->prior = NULL;
p = (*L);
for (i = 0; i < 26; i++) //英文字母26个
{
q = (DualNode*)malloc(sizeof(DualNode));
if (!q) return ERROR;
q->data = 'A' + i;
q->prior = p;
q->next = p->next; //此步,q->next=NULL
p->next = q;
p = q;
}
p->next = (*L)->next; //最后一个结点的next指向头结点的next,即指向第一个结点
(*L)->next->prior = p; //头结点的next节点(即第一个结点)的前驱结点 指向 尾结点
return OK;
}
/****************************************************/
/*函数名称:Caesar -凯撒加密方法 */
/*参 数:*L -指向链表的头指针 */
/* i-链表的头指针指向的位置,即作为首节点的标号 */
/*函数功能:移动结点位置,以指定位置结点作为首结点 */
/* 如:i=3时,ABCD...Z变成 DEF...ZABC */
/* 即原来A位置元素变成D,B变成E...Z变成C */
/****************************************************/
void Caesar(DualLinkList *L, int i)
{
if (i > 0)
{
do
{
(*L) = (*L)->next;
} while (--i);
}
if (i < 0)
{
do
{
(*L) = (*L)->next;
} while (++i);
}
}
int main()
{
DualLinkList L; //定义双向循环链表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;
}
3.测试结果