动态存储项目练习

动态存储

#include <stdio.h>
#define MAX_ELEMENT 100
#define ELEMENT_SIZE 100
#define MAX_ALPHABET 26

char g_szBuf[10000] = { 0 };
int stat_array[MAX_ALPHABET] = { 0 };

enum Operation { ADD = 1, DEL, MODIFY, QUERY, COUNT, PSTORE, ARRANGE, PALL };
enum QueryOps { QIDX = 1, QKEYSTR };

/* 以ELMENTSIZE为最小元素长度,将字符串以100的长度一一隔开。
   ELEMENTSIZE为99,预留最后一位为'\0',方便删除函数实现。
*/

int IsStrEqual(char* str1, char* str2)
{
    while (1) {
        // 字符串长度相等,终止
        if (*str1 == '\0' && *str2 == '\0') {
            break;
        }
        // 字符串长度不等,终止
        if ((*str1 == '\0' && *str2 != '\0') ||
            (*str2 == '\0' && *str1 != '\0')) {
            return 0;
        }
        // 当前字符不相等,说明字符串不一致
        if (*str1 != *str2) {
            return 0;
        }
        // 当前字符相等,比较下一个字符
        str1++;
        str2++;
    }
    return 1;
}

void ElementAdd(int index, char* array)
{
    for (int i = 0; i <= ELEMENT_SIZE; i++) {
        if (array[i] == '\0') {
            return;
        }
        g_szBuf[index + i] = array[i];
    }
    return;
}

void Add(char* array)
{
    int i = 0;
    // 遍历100个元素的数组
    while (i < MAX_ELEMENT) {
        // 寻找空闲的元素
        if (g_szBuf[i * ELEMENT_SIZE] == 0) {
            ElementAdd(i * ELEMENT_SIZE, array);
            return;
        }
        i++;
    }
    printf("Full of memory. Fail to add new string.\n");
    return;
}

int QueryIdxByContent(char* str1)
{
    int i = 0;
    // 遍历100个元素的数组
    while (i < MAX_ELEMENT) {
        // 寻找有值的元素
        if (g_szBuf[i * ELEMENT_SIZE] != 0) {
            // 判断字符串是否相等
            if (IsStrEqual(str1, g_szBuf + (i * ELEMENT_SIZE))) {
                return i * ELEMENT_SIZE;
            }
        }
        i++;
    }
    return -1;
}


void ElementDelete(int index)
{
    for (int i = 0; i < ELEMENT_SIZE; i++) {
        g_szBuf[index + i] = 0;
    }
    return;
}

void Delete(char* array)
{
    // 基于字符串内容查询下标
    int index = QueryIdxByContent(array);
    if (index != -1) {
        ElementDelete(index);
    }
    return;
}

void Modify(char* old, char* new)
{
    int index = QueryIdxByContent(old);
    if (index != -1) {
        ElementDelete(index);
        ElementAdd(index, new);
    }
    return;
}

int MyStrLen(char* str1)
{
    int i = 0;
    while (*str1 != '\0') {
        i++;
        str1++;
    }
    return i;
}

int ContainSubString(char* str1, char* key)
{
    int keyLen = MyStrLen(key);
    int strLen = MyStrLen(str1);
    int isAllEqual;
    for (int i = 0; i < strLen; i++) {
        if (str1[i] == *key) {
            isAllEqual = 1;
            for (int j = 1; j < keyLen; j++) {
                if (str1[i + j] != key[j]) {
                    isAllEqual = 0;
                    continue;
                }
            }
            if (isAllEqual) {
                return 1;
            }
        }
    }
    return 0;
}

// 基于索引查找
void QueryByIdx(int index)
{
    if (index >= MAX_ELEMENT) {
        printf("Error: Query index exceeds maximum element size!\n");
        return;
    }
    if (g_szBuf[index * ELEMENT_SIZE] == 0) {
        printf("Empty memory. There is no string stored at this index!\n");
        return;
    }
    printf("%s at index %d\n", &g_szBuf[index * ELEMENT_SIZE], index);
}

void QueryByContent(char* key)
{
    for (int i = 0; i < MAX_ELEMENT; i++) {
        // 如果当前字符串包含key,则匹配成功,打印结果并返回
        if (ContainSubString(&g_szBuf[i * ELEMENT_SIZE], key)) {
            printf("%s at index %d\n", &g_szBuf[i * ELEMENT_SIZE], i);
        }
    }
    return;
}

void GetStatsForElem(int index)
{
    int asciiIndex;
    for (int i = 0; i < ELEMENT_SIZE; i++) {
        // 将字符转为ASCII码
        if (g_szBuf[index + i] >= 'A' && g_szBuf[index + i] <= 'Z') {
            asciiIndex = g_szBuf[index + i] - 'A';
            stat_array[asciiIndex]++;
        }
        if (g_szBuf[index + i] >= 'a' && g_szBuf[index + i] <= 'z') {
            asciiIndex = g_szBuf[index + i] - 'a';
            stat_array[asciiIndex]++;
        }
    }
    return;
}

void GetStats()
{
    // 每次统计前先清空原有数据
    for (int i = 0; i < MAX_ALPHABET; i++) {
        stat_array[i] = 0;
    }
    // 遍历数组,统计每个字符串元素
    for (int i = 0; i < MAX_ELEMENT; i++) {
        if (g_szBuf[i * ELEMENT_SIZE] != 0) {
            GetStatsForElem(i * ELEMENT_SIZE);
        }
    }
    // 打印
    for (int i = 0; i < MAX_ALPHABET; i++) {
        printf("%c, %d\n", i + 'a', stat_array[i]);
    }
    return;
}


void GetStoreInfo()
{
    for (int i = 0; i < MAX_ELEMENT; i++) {
        (g_szBuf[i * ELEMENT_SIZE] == 0) ? printf("F") : printf("U");
    }
    printf("\n");
    return;
}

// 基于当前索引,寻找下一个不为空的内存的索引
int GetNextNonEmptyMemoryIdx(int index)
{
    for (int i = index + 1; i < MAX_ELEMENT; i++) {
        if (g_szBuf[i * ELEMENT_SIZE] != 0) {
            return i;
        }
    }
    return -1;
}

void ArrangeMemory()
{
    int nonEmptyMemIdx;
    // 遍历数组,终止条件为遍历到倒数第二个元素为止,不需要检查最后一个元素
    for (int i = 0; i < MAX_ELEMENT - 1; i++) {
        // 判断当前内存是否为空,如果为空,则从之后的内存获取不为空的移过来
        if (g_szBuf[i * ELEMENT_SIZE] == 0) {
            // 获取下一个不为空内存的索引
            nonEmptyMemIdx = GetNextNonEmptyMemoryIdx(i);
            // 之后没有不为空的内存了,不需要继续整理,直接返回
            if (nonEmptyMemIdx == -1) {
                return;
            }
            // 有不为空的内存,将该内存复制到当前空的内存块
            ElementAdd(i * ELEMENT_SIZE, &g_szBuf[nonEmptyMemIdx * ELEMENT_SIZE]);
            // 删除原先不为空的内存记录
            ElementDelete(nonEmptyMemIdx * ELEMENT_SIZE);
        }
    }
    return;
}

int main()
{
    char input1[MAX_ELEMENT];
    char input2[MAX_ELEMENT];
    int operation;
    int queryChoice;
    int queryIdx;
    while (1) {
        printf("请输入功能对应数字\n");
        printf("1.增加\n");
        printf("2.删除\n");
        printf("3.修改\n");
        printf("4.查询\n");
        printf("5.统计\n");
        printf("6.打印存储信息\n");
        printf("7.整理内存\n");
        printf("8.打印当前数组\n");
        scanf("%d", &operation);
        for (int i = 0; i < MAX_ELEMENT; i++) {
            input1[i] = 0;
            input2[i] = 0;
        }
        switch (operation) {
        case ADD: {
            printf("请输入想添加的字符串:");
            scanf("%s", input1);
            Add(input1);
            break;
        }
        case DEL: {
            printf("请输入想删除的字符串:");
            scanf("%s", input1);
            Delete(input1);
            break;
        }
        case MODIFY: {
            printf("请输入原始字符串:");
            scanf("%s", input1);
            printf("请输入修改后的字符串:");
            scanf("%s", input2);
            Modify(input1, input2);
            break;
        }
        case QUERY: {
            printf("请选择查询方式,1.基于索引查询,2.模糊查询:");
            scanf("%d", &queryChoice);
            if (queryChoice == QIDX) {
                printf("请输入索引:");
                scanf("%d", &queryIdx);
                QueryByIdx(queryIdx);
            }
            else if (queryChoice == QKEYSTR) {
                printf("请输入关键字:");
                scanf("%s", input1);
                QueryByContent(input1);
            }
            break;
        }
        case COUNT: {
            GetStats();
            break;
        }
        case PSTORE: {
            GetStoreInfo();
            break;
        }
        case ARRANGE: {
            ArrangeMemory();
            break;
        }
        case PALL: {
            for (int i = 0; i < MAX_ELEMENT - 1; i++) {
                if (g_szBuf[i * ELEMENT_SIZE] == 0) {
                    printf("NULL, ");
                }
                else {
                    printf("%s, ", &g_szBuf[i * ELEMENT_SIZE]);
                }
            }
            if (g_szBuf[(MAX_ELEMENT - 1) * ELEMENT_SIZE] == 0) {
                printf("NULL\n");
            }
            else {
                printf("%s\n", &g_szBuf[(MAX_ELEMENT - 1) * ELEMENT_SIZE]);
            }
        }
        default: {
           
            break;
        }
        }
    }


    // char* str1 = "HA";
    // char* str2 = "world";
    // char* str3 = "happy";
    // char* str4 = "ppy";

    // Add(str1);
    // Add(str2);
    // Add(str3);
    // Add(str3);
    // Add(str3);
    // Add(str3);
    // Add(str3);
    // Add(str3);
    // Add(str3);

    // // Modify(str1, str3);
    // Delete(str2);
    // Delete(str3);
    // Delete(str3);
    // Delete(str3);
    // Delete(str3);
    // Delete(str3);

    // for (int i = 0; i < MAXELEMENT; i++) {
    //     printf("%s,", &g_array[i * ELEMENTSIZE]);
    // }
    // printf("\n");
    // // GetStats();
    // GetStoreInfo();
    // // ArrangeMemory();
    // // GetStoreInfo();
    // QueryByContent(str4);
    // QueryByIdx(8);

    // // printf("%d\n", IsStrEqual(str1, str4));
    // // printf("%s\n", g_array+100);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值