数据结构串实现字符串加密

大学数据结构课程作业

说明

具体说明可以参照《数据结构串实现单词统计》中的说明。

问题描述

一个文本串可用事先给定的字母映射表进行加密。例如,设字母映射表为:

a b c d e f g h i j k l m n o p q r s t u v w x y z

n g z q t c o b m u h e l k p d a w x f y I v r s j

则字符串“encrypt”被加密为“tkzwsdf”。

基本要求:

① 编写一个算法将输入的文本串进行加密后输出

② 编写一个算法,将输入的已加密的文本串解密后输出

③ 编写主函数进行测试

实现算法

头文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include<stdio.h>
#include<stdlib.h>
/*
**数据结构串头文件
**ASorb time:201811
*/

//状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//函数返回状态码类型

typedef int Status;
/**串的堆分配存储表示**/
typedef struct {
    char *ch;
    int length;
}HString;

//生成一个其值等于串常量chars的串T
Status StrAssign(HString *T,char *chars){
    int len=0;
    if(T->ch) free(T->ch);
    for(char *c=chars;*c;c++,len++);
    if(!len){
        T->ch = NULL;
        T->length = 0;
    }
    else{
        if(!(T->ch=(char*)malloc(sizeof(char)*len)))
            exit(OVERFLOW);
        for(int i=0;i<len;i++)
            T->ch[i] = chars[i];
        T->length = len;
    }
    return OK;
}
//返回S的元素个数,称为串的长度
int StrLength(HString S){
    return S.length;
}
//串比较
int StrCompare(HString S,HString T){
    for(int i=0;i<S.length && i<T.length;i++)
        if(S.ch[i] != T.ch[i])
            return S.ch[i] - T.ch[i];
    return S.length - T.length;
}
//将S清为空串,并释放S的空间
Status ClearString(HString *S){
    if(S->ch){
        free(S->ch);
        S->ch = NULL;
    }
    S->length = 0;
    return OK;
}
//用T返回有S1和S2连接而成的新串
Status Concat(HString *T,HString S1,HString S2){
    if(T->ch)free(T->ch);
    if(!(T->ch=(char*)malloc(sizeof(char)*(S1.length+S2.length))))
        exit(OVERFLOW);
    for(int i=0;i<S1.length;i++)
        T->ch[i] = S1.ch[i];
    for(int i=0;i<S2.length;i++)
        T->ch[i+S1.length]=S2.ch[i];
    T->length = S1.length + S2.length;
    return OK;
}
//返回串S的第pos个字符起长度为len的子串
Status SubString(HString *Sub,HString S,int pos,int len){
    if(pos<1 || pos>S.length || len<0 || len>S.length-pos+1)
        return ERROR;
    if(Sub->ch){
        free(Sub->ch);
        Sub->length = 0;
    }
    if(!len){
        Sub->ch = NULL;
        Sub->length =0;
    }
    else{
        if(!(Sub->ch=(char*)malloc(sizeof(char)*len)))
            exit(OVERFLOW);
        for(int i=0;i<len;i++)
            Sub->ch[i] = S.ch[pos+i-1];
        Sub->length = len;
    }
    return OK;
}

主函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
**实验3 002
**ASorb time:201811
**/
#include"DataH.h"
#define MAX_CHARS 100
Status key_op(HString S,char m_chars[],char j_chars[]) {
	char m_key[] = { "abcdefghijklmnopqrstuvwxyz" };		//明文
	char j_key[] = { "ngzqtcobmuhelkpdawxfyIvrsj" };		//暗文
	for (int i = 0; i < S.length; i++) {
		for (int ii = 0; ii < 26; ii++)
			if (S.ch[i] == m_key[ii]) {
				j_chars[i] = j_key[ii];
				break;
			}
			else
				j_chars[i] = S.ch[i];
		for (int ii = 0; ii < 26; ii++)
			if (S.ch[i] == j_key[ii]) {
				m_chars[i] = m_key[ii];
				break;
			}
			else
				m_chars[i] = S.ch[i];
	}
	return OK;
}
int main() {
	HString S; S.ch = NULL;
	char chars[MAX_CHARS], m_chars[MAX_CHARS] = { '\0' }, j_chars[MAX_CHARS] = { '\0' };
	printf("输入需要转换的密码:");
	gets_s(chars);
	StrAssign(&S, chars);
	key_op(S, m_chars, j_chars);
	ClearString(&S);
	printf("你输入的key:%s\n",chars);
	printf("明文key:%s\n", m_chars);
	printf("暗文key:%s\n", j_chars);
	getchar();
	return 0;
}
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计