Heathen1 2017-09-24 11:24 采纳率: 100%
浏览 1305
已采纳

一道C#循环链表的题,没想出来

对某电文(字符串)进行加密,形成密码文(字符串)。假设原文为C1C2C3....Cn,加密后产生的密文为S1S2S3.....Sn.首先读入一个正整数key(key>1)作为加密钥匙,并将密文字符位置安顺时针方向连成一个环。加密时从S1位置起顺时针方向计数,当数到第key个字符位置时,将原文中的字符C1放入该密文字符位置,同时从环中除去该字符位置。接着,从环中下一个字符位置起继续计数,当再次数到第K 个字符位置时,将原文中的C2放入其中并从环中除去该字符位置,依此类推,直至n个原文字符全部放入密文环中。由此产生的S1S2S3...Sn即为原文的密文。

(1)动态输入原文的内容。
(2)动态输入key的值,对于每一个key,在屏幕上产生原文内容及密文内容。
提示:控制台或者窗口实现
请大神指点!

  • 写回答

1条回答 默认 最新

  • 花下泥 2017-09-25 01:17
    关注
     #include <stdio.h>
       #include <string.h>
       #include <malloc.h>
    
        typedef struct node
        {
            char ch;
            struct node *forward; /*链接下一节点*/
            struct node *backward; /*链接前一节点*/
        } CODE;
    
        char *decode(char *ocode, int key)
        {
            char *ncode;
            int length, count,i;
            CODE *loop , *p;
            length = strlen(ocode);
            loop= (CODE*)malloc(length*sizeof(CODE)); /*动态分配密文环*/
            for(i=0;i<length-1;i++)
            {
                loop[i].forward = &loop[i+1];
                loop[i].backward =&loop[i-1];
    
            }     
            loop[0].backward =&loop[length-1];
            loop[0].forward = &loop[1];
            loop[length-1].forward = loop;
            loop[length-1].backward = &loop[length-2];
    
            for(p=loop, i=0; i<length;i++)
            {
                /*产生密文链表*/
                for(count=1;count<key; count++)
                 p= p->forward;
                 p->ch =*ocode++;
                 p->backward->forward =p->forward;
                 p->forward->backward = p->backward;
                 p = p->forward;
             }
             ncode = (char*)malloc((length+1)*sizeof(char));
             for(i=0;i<length;i++)
    
                 ncode[i] =loop[i].ch;
                 ncode[length] = '\0';
                 return ncode;
       }         
    
        void main()
        {
            char ocode[256];
            int key, num=0;
            printf("输入原文字符串: ");
            while(num<255&&(ocode[num++]=getchar())!='\n');
            ocode[(num==255)?num:num-1] ='\0';
            do 
             {
                 printf("输入加密密钥:");
                 scanf("%d",&key);
    
             }   while(key<=1);
             printf("电文的密码是: %s\n",decode(ocode,key));  
    
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问