鱼C论坛

 找回密码
 立即注册
查看: 3125|回复: 0

[技术交流] 英文字母循环移动问题的正规解法

[复制链接]
发表于 2019-3-3 12:01:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. /*
  2. 题目:对A-Z26个英文字母,根据指定的数字,将其循环移动,例如
  3.        ABCDEFGHIJKLMNOPQRSTUVWXYZ
  4.            输入3,得到
  5.            DEFGHIJKLMNOPQRSTUVWXYZABC
  6.            输入-3,得到
  7.            XYZABCDEFGHIJKLMNOPQRSTUVW
  8.   思路:使用双向循环链表来实现
  9.             
  10. */
  11. #include <stdio.h>
  12. #include <stdlib.h>

  13. #define OK 1
  14. #define ERROR 0

  15. typedef char ElemType;
  16. typedef int status;

  17. typedef struct node
  18. {
  19.         ElemType data;
  20.         struct node *prior;
  21.         struct node *next;
  22. } node, *list;

  23. status init(list *L)
  24. {
  25.         node *p, *q;
  26.         int i;
  27.        
  28.         *L = (list)malloc(sizeof(node));
  29.         if (!(*L)) return ERROR;
  30.         (*L)->next = (*L)->prior = NULL;
  31.         p = (*L);
  32.        
  33.         for (i=0; i<26; i++)
  34.         {
  35.                 q = (node*)malloc(sizeof(node));
  36.                 if (!q) return ERROR;
  37.                 q->data = 'A'+i;
  38.                 q->prior = p;
  39.                 q->next = p->next;
  40.                 p->next = q;
  41.                
  42.                 p = q;
  43.         }
  44.        
  45.         // 形成闭环:
  46.         p->next = (*L)->next;
  47.         (*L)->next->prior = p;
  48.         return OK;
  49. }

  50. void caesar(list L, int n)
  51. {
  52.         node *p = L->next;
  53.         if (n>0)
  54.         {
  55.                 do
  56.                 {
  57.                         p = p->next;
  58.                 } while (--n);
  59.         }
  60.         if (n<0)
  61.         {
  62.                 do
  63.                 {
  64.                         p = p->prior;
  65.                 } while (++n);
  66.         }
  67.         L->next = p;
  68. }

  69. int main()
  70. {
  71.         list L = NULL;
  72.         int i = 0, n = 0;
  73.         node *p = NULL;
  74.         init(&L);

  75.         p = L->next;       
  76.         for (i=0; i<26; i++)
  77.         {
  78.                 printf("%c", p->data);
  79.                 p = p->next;
  80.         }
  81.         printf("\n");
  82.         printf("请输入一个整数:");
  83.         scanf("%d", &n);
  84.         caesar(L, n);
  85.         p = L->next;
  86.         for (i=0; i<26; i++)
  87.         {
  88.                 printf("%c", p->data);
  89.                 p = p->next;
  90.         }
  91.         return 0;
  92. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 20:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表