双向循环链表:字母表实现前后移动
问题描述
要求实现用户输入一个数使得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;
}
运行结果
双向循环链表:字母表实现前后移动相关推荐
- 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)
目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...
- 链表 -- 双向循环链表(线性表)
1,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环 ...
- C++实现有哨兵的双向循环链表
C++实现有哨兵的双向循环链表: #include<iostream> #include<stack> using namespace std; template<cla ...
- 数据结构 -- 双向循环链表
这篇文章写的是双向循环链表,这也是个非常经典的数据结构,我们在看 Linux 内核代码时就经常会遇到它.比如,在Linux的内核中实现进程描述符,使用的就是双向循环链表,因为它使用起来很方便,每个节点 ...
- 用动态数组模拟双向循环链表
简单来说其实使用数组模拟LinkedList.同LinkedList的操作基本相似. 基本原理为:数组存放Entry对象,包含数据部分,指针部分(数组下标) 添加,删除基本操作改变指针.数组包含两 ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- 数据结构-单向循环链表、双向循环链表、仿真链表
一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...
- Python创建一个循环链表、双向循环链表
循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...
- c++17(20)-双向循环链表(不依赖具体数据)
双向循环链表(不依赖具体数据),借鉴LINUX内核的链表结构 #include <iostream> using namespace std; struct stdlist{stdlist ...
最新文章
- Android开发中应避免的重大错误
- C语言实现通用链表初步(四)----双向链表
- Android将数据库数据导出成excel格式的文本(CSV)
- vb代码大全_【必会】Rnd随机函数在VB编程中的广泛应用
- 系统接口对接的进度工作应该谁来干_第三方分账系统开发的那些坑,给你节省几十万...
- Android数据库 分页查询,Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及ListView显示数据(转)...
- 分区取模分库分表策略:多表事务分库内闭环解决方案
- 织梦html权限设置,详细的Dede织梦目录权限安全设置教程
- Jenkins+git 实现代码自动发布
- 步步为营 SharePoint 开发学习笔记系列 二、安装和配置
- 梦殇 chapter three
- stream().sorted 排序
- JS--统一社会信用代码校验
- 腾讯邮箱比阿里邮箱好,腾讯邮箱还是阿里邮箱?
- 基于Java+Swing+Mysql项目信息管理系统
- 四、网络层(一)网络层的功能
- rk3288编译android,RK3288 源码编译Android 7.1.2 自动编译
- JS字符串分割转为树结构参考
- iOS自学-UILabel常见属性
- EDIUS中的视频怎么才能添加字幕?
热门文章
- 小学奥数_7829神奇序列求和 python
- java 字符串转查找_Java 实例
- python语言format用法_python格式化输出之format用法
- Android逆向笔记-破解自己编写的Android应用程序(开发及破解)
- 顺利通过2018年下工信部的软件设计师考试,在此感悟一下
- MYSQL 表 部分数据导出、导入
- kbengine 的 nginx反向代理https/wss 配置 支持kbe负载均衡
- docker php nginx,docker 构建nginx + php
- 计算机网络之传输层:7、TCP拥塞控制
- (数据库系统概论|王珊)第十章数据库恢复技术:习题