您当前的位置: 首页 >  ar

惊鸿一博

暂无认证

  • 3浏览

    0关注

    535博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

惊鸿一博 发布时间:2017-04-27 22:37:40 ,浏览量:3

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

关注
打赏
1663399408
查看更多评论
立即登录/注册

微信扫码登录

0.0366s