问题描述

要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,使得结果为:DEFHIJKLMNOPQRSTUVWXYZABC,

同时需要支持负数,使得输入-3时,结果为:XYZABCDEFGHIJKLMNOPQRSTUVW。实现位置的前后都能移动且数据都是连着的,当然数据结构选择双向循环链表啦。

问题拓展

问题实际上是有关凯撒密码,凯撒密码的思想是通过把字母移动一定的位数来实现加密和解密。

明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

代码展示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define OK 1
#define ERROR 0typedef int Status;
typedef char EleType;
//双向循环链表 结点数据结构
typedef struct DulNode
{EleType data;//数据域struct DulNode* next;//后继结点指针域struct DulNode* prior;//前驱结点指针域
}DulNode,*DulLinkList;
//取了别名 DulNode* 相当于DulLInkList//创建双向循环链表
Status CreatDulLink(DulLinkList* list)
{if (list == NULL){return ERROR;}DulNode* head = (DulNode*)malloc(sizeof(DulNode));//创建头结点if (head == NULL){return ERROR;}DulNode* p = head;//p 移动指针,起初指向头结点p->next = p->prior = NULL;for (size_t i = 0; i < 26; i++){DulNode* node = (DulNode*)malloc(sizeof(DulNode));//创建结点node->data = 'A' + i;//下面3步将创建的node结点放到双向循环链表中node->next = p->next;//直接赋值NULL也可以node->prior = p;p->next = node;//p 始终指向链表最后一个结点p = node;}//下2步 将尾结点和第一个结点关联形成双向循环链表,越过头结点。p->next = head->next;head->next->prior = p;//循环链表指向第一个元素*list = p->next;//释放头结点free(head);return OK;
}
//将循环链表指向第num个位置
Status Caesar(DulLinkList* list,int num)
{DulLinkList tmp = *list;//双向循环链表指针往后移if (num > 0){int i = 0;//num = 1 往后移动1位, temp = temp -> nextwhile (i < num){tmp = tmp->next;i++;}*list = tmp;}//双向循环链表指针往前移if (num < 0){int i = 0;//num = -1 往前移动1位,temp = temp->priorwhile (i < num*-1){tmp = tmp->prior;i++;}*list = tmp;}return OK;
}
//销毁链表释放内存
Status DestroyDulLink(DulLinkList list)
{if (list == NULL){return ERROR;}DulNode* node = list;//node为移动指针,node 开始指向循环链表第一个结点//循环链表遍历完判断,尾结点的指针域指向第一个结点while (node->next != list){DulNode* temp = node;node = node->next;free(temp);}//释放最后一个结点free(node);return OK;
}
//循环链表展示
Status ShowCaesar(DulLinkList list)
{if (list == NULL){return ERROR;}DulNode* node = list;//node为移动指针,node 开始指向循环链表的开始的一个结点//循环链表遍历完判断,尾结点的next指针域指向开始第一个结点while (node->next != list){printf("%c",node->data);node = node->next;}printf("\n");return OK;
}int main(int argc, char *argv[])
{DulLinkList list = NULL;CreatDulLink(&list);DulLinkList origal = list;int num = 0;while (1){list = origal;printf("请输入位移数字(0退出):");scanf("%d", &num);if (!num){break;}Caesar(&list, num);ShowCaesar(list);}DestroyDulLink(list);return 0;
}

运行结果

双向循环链表:字母表实现前后移动相关推荐

  1. 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)

    目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...

  2. 链表 -- 双向循环链表(线性表)

    1,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环 ...

  3. C++实现有哨兵的双向循环链表

    C++实现有哨兵的双向循环链表: #include<iostream> #include<stack> using namespace std; template<cla ...

  4. 数据结构 -- 双向循环链表

    这篇文章写的是双向循环链表,这也是个非常经典的数据结构,我们在看 Linux 内核代码时就经常会遇到它.比如,在Linux的内核中实现进程描述符,使用的就是双向循环链表,因为它使用起来很方便,每个节点 ...

  5. 用动态数组模拟双向循环链表

    简单来说其实使用数组模拟LinkedList.同LinkedList的操作基本相似.  基本原理为:数组存放Entry对象,包含数据部分,指针部分(数组下标)  添加,删除基本操作改变指针.数组包含两 ...

  6. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  7. 数据结构-单向循环链表、双向循环链表、仿真链表

    一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...

  8. Python创建一个循环链表、双向循环链表

    循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...

  9. c++17(20)-双向循环链表(不依赖具体数据)

    双向循环链表(不依赖具体数据),借鉴LINUX内核的链表结构 #include <iostream> using namespace std; struct stdlist{stdlist ...

最新文章

  1. Android开发中应避免的重大错误
  2. C语言实现通用链表初步(四)----双向链表
  3. Android将数据库数据导出成excel格式的文本(CSV)
  4. vb代码大全_【必会】Rnd随机函数在VB编程中的广泛应用
  5. 系统接口对接的进度工作应该谁来干_第三方分账系统开发的那些坑,给你节省几十万...
  6. Android数据库 分页查询,Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及ListView显示数据(转)...
  7. 分区取模分库分表策略:多表事务分库内闭环解决方案
  8. 织梦html权限设置,详细的Dede织梦目录权限安全设置教程
  9. Jenkins+git 实现代码自动发布
  10. 步步为营 SharePoint 开发学习笔记系列 二、安装和配置
  11. 梦殇 chapter three
  12. stream().sorted 排序
  13. JS--统一社会信用代码校验
  14. 腾讯邮箱比阿里邮箱好,腾讯邮箱还是阿里邮箱?
  15. 基于Java+Swing+Mysql项目信息管理系统
  16. 四、网络层(一)网络层的功能
  17. rk3288编译android,RK3288 源码编译Android 7.1.2 自动编译
  18. JS字符串分割转为树结构参考
  19. iOS自学-UILabel常见属性
  20. EDIUS中的视频怎么才能添加字幕?

热门文章

  1. 小学奥数_7829神奇序列求和 python
  2. java 字符串转查找_Java 实例
  3. python语言format用法_python格式化输出之format用法
  4. Android逆向笔记-破解自己编写的Android应用程序(开发及破解)
  5. 顺利通过2018年下工信部的软件设计师考试,在此感悟一下
  6. MYSQL 表 部分数据导出、导入
  7. kbengine 的 nginx反向代理https/wss 配置 支持kbe负载均衡
  8. docker php nginx,docker 构建nginx + php
  9. 计算机网络之传输层:7、TCP拥塞控制
  10. (数据库系统概论|王珊)第十章数据库恢复技术:习题