鱼C论坛

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

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

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

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

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

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

#define OK 1
#define ERROR 0

typedef char ElemType;
typedef int status;

typedef struct node
{
        ElemType data;
        struct node *prior;
        struct node *next;
} node, *list;

status init(list *L)
{
        node *p, *q;
        int i;
        
        *L = (list)malloc(sizeof(node));
        if (!(*L)) return ERROR;
        (*L)->next = (*L)->prior = NULL;
        p = (*L);
        
        for (i=0; i<26; i++)
        {
                q = (node*)malloc(sizeof(node));
                if (!q) return ERROR;
                q->data = 'A'+i;
                q->prior = p;
                q->next = p->next;
                p->next = q;
                
                p = q;
        }
        
        // 形成闭环: 
        p->next = (*L)->next;
        (*L)->next->prior = p;
        return OK;
}

void caesar(list L, int n)
{
        node *p = L->next;
        if (n>0)
        {
                do
                {
                        p = p->next;
                } while (--n);
        }
        if (n<0)
        {
                do
                {
                        p = p->prior;
                } while (++n);
        }
        L->next = p;
}

int main()
{
        list L = NULL;
        int i = 0, n = 0;
        node *p = NULL;
        init(&L);

        p = L->next;        
        for (i=0; i<26; i++)
        {
                printf("%c", p->data);
                p = p->next;
        }
        printf("\n");
        printf("请输入一个整数:");
        scanf("%d", &n);
        caesar(L, n);
        p = L->next;
        for (i=0; i<26; i++)
        {
                printf("%c", p->data);
                p = p->next;
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-28 18:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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