鱼C论坛

 找回密码
 立即注册
查看: 1320|回复: 6

[已解决]关于用循环链表做简单加密

[复制链接]
发表于 2020-5-27 16:25:25 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>

  4. typedef struct List
  5. {
  6.         char ch;
  7.         struct List *prior;
  8.         struct List *next;
  9. }node;

  10. void init(node **head)
  11. {
  12.         node *temp;
  13.         int i;
  14.         for(i=0;i<26;i++)
  15.         {
  16.                 temp=(node *)malloc(sizeof(node));
  17.                 if(!temp)
  18.                         exit(0);
  19.                 temp->ch='A'+i;
  20.                 if(*head==NULL)
  21.                 {
  22.                         (*head)=temp;
  23.                         (*head)->next=(*head);
  24.                         (*head)->prior=(*head);
  25.                 }
  26.                 else
  27.                 {
  28.                         temp->next=(*head);
  29.                         temp->prior=(*head)->prior;
  30.                         (*head)->prior->next=temp;
  31.                         (*head)->prior=temp;
  32.                 }
  33.         }
  34. }

  35. void tex(node **head1)
  36. {
  37.         node *temp;

  38.         printf("请输入加密内容:\n");
  39.         while(1)
  40.         {
  41.                 temp=(node *)malloc(sizeof(node));
  42.                 if(!temp)
  43.                         exit(0);
  44.                 scanf("%c",&temp->ch);
  45.                 if(temp->ch=='0')
  46.                         break;
  47.                 if(*head1==NULL)
  48.                 {
  49.                         (*head1)=temp;
  50.                         (*head1)->next=(*head1);
  51.                         (*head1)->prior=(*head1);
  52.                 }
  53.                 else
  54.                 {
  55.                         temp->next=(*head1);
  56.                         temp->prior=(*head1)->prior;
  57.                         (*head1)->prior->next=temp;
  58.                         (*head1)->prior=temp;
  59.                 }
  60.         }
  61. }

  62. void sec(node *head,node *head1)
  63. {
  64.         node *temp=head1;
  65.         node *target;
  66.         int i,n;

  67.         srand((unsigned)time(NULL));
  68.        
  69.         do
  70.         {
  71.                 for(target=head;target->next!=head&&target->ch!=temp->ch;target=target->next)
  72.                         ;
  73.                 n=-1*(rand()%100)+50;
  74.                 if(n>=0)
  75.                 {
  76.                         for(i=0;i<n;i++)
  77.                                 target=target->next;
  78.                 }
  79.                 else
  80.                 {
  81.                         for(i=0;i<(abs(n));i++)
  82.                                 target=target->prior;
  83.                 }
  84.                 printf("%c -- %d\n",target->ch,n);
  85.                 temp=temp->next;
  86.         }while(temp!=head1);
  87. }

  88. void output(node *head)
  89. {
  90.         node *temp=head;
  91.         do
  92.         {
  93.                 printf("%c",temp->ch);
  94.                 temp=temp->next;
  95.         }while(temp!=head);
  96.         putchar('\n');
  97. }

  98. int main(void)
  99. {
  100.         node *head=NULL;
  101.         node *head1=NULL;
  102.         init(&head);
  103.         tex(&head1);
  104.         sec(head,head1);
  105.         output(head);
  106.         output(head1);

  107.         return 0;
  108. }
复制代码


写了一个做简单加密的小程序,然后不同的输入方式结果不一样,有一些不解,请各位大佬指点一下。
第一种:
输入:ABC0
输出:
N -- -39
B -- -26
W -- -32
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABC

第二种:
输入:
A
B
C
0
输出:
O -- -38
H -- -44
G -- -21
N -- 14
J -- -19
C -- -23
ABCDEFGHIJKLMNOPQRSTUVWXYZ
A
B
C
最佳答案
2020-5-27 19:04:59
小猪鼠 发表于 2020-5-27 18:57
我知道这个,你看我第二种只输入了3个字母但是加密输出了6个字母

这个简单,你输入的是A\nB\nC\n0,\n也看作是一个字符

\n是遍历整个A~Z都没找到于是停留在了Z,每次输入Z也是随机加密的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-27 18:26:00 | 显示全部楼层
你这是随机加密,每次输入ABC0后的各个字母的移位都不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-27 18:57:01 | 显示全部楼层
麻麦皮 发表于 2020-5-27 18:26
你这是随机加密,每次输入ABC0后的各个字母的移位都不同

我知道这个,你看我第二种只输入了3个字母但是加密输出了6个字母
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-27 19:04:59 | 显示全部楼层    本楼为最佳答案   
小猪鼠 发表于 2020-5-27 18:57
我知道这个,你看我第二种只输入了3个字母但是加密输出了6个字母

这个简单,你输入的是A\nB\nC\n0,\n也看作是一个字符

\n是遍历整个A~Z都没找到于是停留在了Z,每次输入Z也是随机加密的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-27 19:07:42 | 显示全部楼层
麻麦皮 发表于 2020-5-27 19:04
这个简单,你输入的是A\nB\nC\n0,\n也看作是一个字符

\n是遍历整个A~Z都没找到于是停留在了Z,每次输 ...

好的,明白了谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-27 19:17:30 | 显示全部楼层
小猪鼠 发表于 2020-5-27 19:07
好的,明白了谢谢

给你补充一下吧,想要不加密回车键,可以
  1. if(temp->ch == '\n')
  2. {
  3.         continue;
  4. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-27 19:26:35 | 显示全部楼层
麻麦皮 发表于 2020-5-27 19:17
给你补充一下吧,想要不加密回车键,可以

好的,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 04:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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