线性表_双向循环链表(Caesar加密变换结点顺序 代码实现 )

1.有图有真相


2.代码实现

//Caesar Password with DualLinkList

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

#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.测试结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊鸿一博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值