数据结构编程练习(数组与字符串)


在这里插入图片描述

1.字符串的插入

描述:编写算法,实现下面函数的功能。函数void insert(char *s, char *t, int pos)将字符串t插入到字符串s中,插入位置为pos(插在第pos个字符前)。假设分配给字符串s的空间足够让字符串t插入。
说明:不得使用任何库函数。

输入样例:
1
abcde
abc
2
acd
baaaa

输出样例:
abcabcde
abaaaacd
#include <stdio.h>

#define MAX_SIZE 100

void insert(char *dest, char *src, int pos) {
    int len_dest = 0;//length of the destination string
    int len_src = 0;//length of the source string
    int i, j;
    /*get the length of these two strings*/
    while (*(dest + len_dest) != 0) {
        len_dest++;
    }
    while (*(src + len_src) != 0) {
        len_src++;
    }
    /*move destination string backward partly*/
    for (i = len_dest - 1; i >= pos-1; i--) {
        dest[len_src + i]  = dest[i];
    }
    /*insert source string*/
    for (j = len_src - 1; j >= 0; j--) {
        dest[len_src + i] = src[j];
        i--;
    }
}

int main() {
    int m;
    while (scanf("%d", &m) && m != 0) {
        char dest[MAX_SIZE], src[MAX_SIZE];

        getchar();//receive extra '\n'
        scanf("%s", dest);
        getchar();
        scanf("%s", src);

        insert(dest, src, m);
        printf("\n%s", dest);
    }

    return 0;
}

2.二维数组中的元素查重

描述:设二维数组a[1…m, 1…n]含有m*n个整数。编写一个算法判断a中所有元素是否互不相同。

输入样例:
4 3
1 2 3
4 5 6
7 8 9
10 11 12
3 4
1 2 3 4
5 6 7 8
1 9 10 11
0 0

输出样例:
NO
YES
#include <stdio.h>
#include <stdlib.h>

int array_compare(int **array, int m, int n);

int array_compare_(int **array, int m, int n);

int main() {
    int m, n;
    while (scanf("%d %d", &m, &n) && m != 0 && n != 0) {
        /*allocate space*/
        int **array = (int **) malloc(sizeof(int *) * m);
        for (int i = 0; i < m; i++) {
            array[i] = (int *) malloc(sizeof(int) * n);
        }
        /*input data*/
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &array[i][j]);
            }
        }
        /*judge*/
        printf("%s\n", array_compare(array, m, n) ? "YES" : "NO");
        /*printf("%s\n", array_compare_(array, m, n) ? "YES" : "NO");*/
        /*free heap space*/
        for (int i = 0; i < m; i++) {
            free(array[i]);
        }
        free(array);
        array = NULL;//avoid wild pointer
    }

    return 0;
}

int array_compare(int **array, int m, int n) {
    /*outer circulation*/
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            /*inner circulation*/
            for (int k = 0; k < m; k++) {
                for (int l = 0; l < n; l++) {
                    /*values are equal && not in the same position*/
                    if (*(*(array + i) + j) == *(*(array + k) + l) && !(i == k && j == l)) {
                        return 1;
                    }
                }
            }
        }
    }
    return 0;
}

int array_compare_(int **array, int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            int k, l;
            /*从当前元素的下一个元素开始比较*/
            if (j < n - 1) {//当前元素不是该行最后一个元素
                k = i;
                l = j + 1;
            } else if (i < m - 1) {//当前元素为本行最后一个元素但该元素不在最后一行
                k = i + 1;
                l = 0;
            } else {//当前元素为二维数组最后一个元素
                return 0;
            }
            /*先与当前行的剩余元素进行比较*/
            while (l < n) {
                if (array[i][j] == array[k][l++]) {
                    return 1;
                }
            }
            /*与其余行的元素比较*/
            for (k = k + 1; k < m; k++) {
                for (l = 0; l < n; l++) {
                    if (array[i][j] == array[k][l]) {
                        return 1;
                    }
                }
            }
        }
    }
    return 0;
}

3.查找子串第一次出现的位置

描述:在C语言<string.h>头文件内,实现了函数char *strstr(char *str1, const char *str2)。它的作用是:若str2是str1的子串,则返回str2在str1中首次出现的地址;如果str2不是str1的子串,则返回NULL。下面,请你设计算法简单实现函数strstr(),若存在则返回子串首次出现的下标(从0开始),若不存在返回-1。

输入样例:
bjfuacm bjfu
datastructure hello
aaaaaaaaaaab ab
0 0

输出样例:
0
-1
10
#include <stdio.h>

#define MAX_SIZE 100

int strstr(char *m_str, const char *p_str);

int main() {
    char str1[MAX_SIZE], str2[MAX_SIZE];
    while (scanf("%s", str1) && scanf("%s", str2)) {
        if (str1[0] == 48 && str1[1] == 0 && str2[0] == 48 && str2[1] == 0) break;
        printf("\n%d", strstr(str1, str2));
    }

    return 0;
}

int strstr(char *m_str, const char *p_str) {
    int is_equal;
    int m_cur, p_cur;

    for (m_cur = 0; *(m_str + m_cur) != 0; m_cur++) {
        is_equal = 1;
        p_cur = 0;
        int tmp = m_cur;

        while (*(p_str + p_cur) != 0) {
            if (*(m_str + tmp) == *(p_str + p_cur)) {
                tmp ++;
                p_cur++;
            } else {
                is_equal = 0;
                break;
            }
        }

        if (is_equal == 1) {
            return m_cur;
        }
    }
    return -1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值