指针及其应用——单词排序

img

img


不是很理解画框框的地方的意思,有没有人可以帮忙解答一下,看不懂题目和代码真的写不了啊😭

这两处代码的意思,将对应字母的哈希索引值,存储到与字母的ASCII码值相同的数组下标位置处,以方便从数组中取出对应字母的哈希索引值。

测试代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char word[505][1050],tmp[1050];
int hash[256];


int cmps(char *a,char * b){
    
    int i=0;
    
    
    //下面两个if,如果测试数据无空字符串,可以去除 
    if(a==NULL ){
    
        return 1;
    }
    
    if(a!=NULL && b==NULL){
    
        return 0;
    }
    
    int  ha ;
    int  hb ;
    
    // 循环遍历字符串a和字符串b,直到遇到任意一个到字符串结尾 
    while(a[i]!='\0' && b[i]!='\0'){
        
        ha = hash[a[i]];  // 获取字符串a当前字符的哈希索引值 
        hb = hash[b[i]]; // 获取字符串b当前字符的哈希索引值 
        
    // 如果字符串a当前字符的哈希索引值小于字符串b当前字符的哈希索引值,则返回1 
        if(ha<hb){ 
        
            return 1;
        }
        
      // 如果字符串a当前字符的哈希索引值大于字符串b当前字符的哈希索引值,则返回0
        if(ha>hb){
            return 0;
        }
        
        i++;
        
    }
    
    //  如果字符串a 达到结尾,则返回1,因为字符串b还有字符
    if(a[i]=='\0'){
        return 1;
    }
    
   //  如果字符串a 还没达到结尾,则返回0,因为字符串a还有字符 
    if(a[i]!='\0'){
        return 0;
    }
    
    
    
} 

int main(void){
    
    int n,i,j;
    for(i=0;i<26;i++){
        scanf("%d",&hash['a'+i]); 
    }
    
    for(i=0;i<26;i++){
        scanf("%d",&hash['A'+i]);
    }
    
    

    
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s",word[i]);
    }

    
    int flag = 0;
    for(i=0;i<n;i++){
        
        for(j=0;j<n-i-1;j++){
            
            int re = cmps(word[j+1],word[j]);
        
            if(re==1){
                strcpy(tmp,word[j]);
                strcpy(word[j],word[j+1]);
                strcpy(word[j+1],tmp);
                flag=1;
            }
        
        
        }
        
        
        if(flag==0){
        
            break;
        }
        
        
    }
    
    for(i=0;i<n;i++){
        printf("%s\n",word[i]);
    }
    
    return 0;
    
}

测试数据:

-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
4
abbcc
aaaAaa
aaaA
abbBbb

img

就是分别输入每个大小写字符的数量

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7683384
  • 这篇博客你也可以参考下:大一下数据结构编程实验——线性结构及其应用
  • 除此之外, 这篇博客: 计算机系统基础复习笔记——数据的机器级表示与处理中的 无符号数 有符号数大小的比较 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在C语言中,如果执行一个运算时,同时有无符号整数和带符号整数参加,则C语言会按无符号整数进行运算

  • 您还可以看一下 张云波老师的以太坊智能合约项目实战课程中的 主卡及副卡中币的销毁小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题:如何在单词列表中进行排序并使用指针?

    解决方案: 1. 定义一个字符串数组,用于存储单词列表。 2. 使用指针数组,指向字符串数组中的每个单词。 3. 使用冒泡排序算法对指针数组进行排序。冒泡排序的基本思想是比较相邻的两个元素,如果它们的顺序错误,则交换它们的位置,直到整个数组按照指定的顺序排序。 4. 输出排序后的单词列表。

    示例代码如下(C语言):

    #include <stdio.h>
    #include <string.h>
    
    #define MAX_WORDS 100 // 定义最大单词数量
    #define MAX_LENGTH 50 // 定义单词最大长度
    
    int main() {
        char words[MAX_WORDS][MAX_LENGTH]; // 字符串数组,用于存储单词列表
        char *pointers[MAX_WORDS]; // 指针数组,指向字符串数组中的每个单词
        int n; // 单词数量
        int i, j;
        char temp[MAX_LENGTH]; // 临时变量,用于交换两个单词
    
        printf("请输入单词数量:");
        scanf("%d", &n);
    
        printf("请输入单词列表:\n");
        for (i = 0; i < n; i++) {
            scanf("%s", words[i]);
            pointers[i] = words[i];
        }
    
        // 冒泡排序
        for (i = 0; i < n - 1; i++) {
            for (j = 0; j < n - 1 - i; j++) {
                if (strcmp(pointers[j], pointers[j + 1]) > 0) {
                    strcpy(temp, pointers[j]);
                    strcpy(pointers[j], pointers[j + 1]);
                    strcpy(pointers[j + 1], temp);
                }
            }
        }
    
        printf("排序后的单词列表:\n");
        for (i = 0; i < n; i++) {
            printf("%s\n", pointers[i]);
        }
    
        return 0;
    }
    

    运行示例:

    请输入单词数量:5
    请输入单词列表:
    apple
    orange
    banana
    grape
    pear
    排序后的单词列表:
    apple
    banana
    grape
    orange
    pear
    

    注意:这只是一个简单的示例,实际应用中可能需要考虑更复杂的情况,例如排除标点符号、忽略大小写等。这里只针对单词的字母顺序进行排序。另外,这个示例代码是使用C语言编写的,如果是其他编程语言,可能需要做一些语法上的调整。

红框里的代码这么理解:
第一个for() 里是将小写26个字母与它的索引值相对应,即输入 -1 保存至 hash['a'] ,输入 2 保存至 hash['b'],依次赋值直到 hash['z'] = 26 ,把字符与它的索引值一一对应。
第二个for()将大写26字母与它的索引值相对应,即 hash['A'] = 27, ... ,hash['Z'] = 52。
小写字符'a' ASCII码值为 97 ,那么hash['a'] ====> hash[97] = -1,其余类推。
大写字符‘A'ASCII码值为 65,那么hash['A']=====>hash[65] = 27,其余类推。
样例输出没给全,是否是这样的,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char word[505][1050], tmp[1050];
int  hash[256];
int  cmps(char* a, char* b)
{
    /********Begin********/
    int ret = 0;
    while (*a && *b && !(ret = hash[*a] - hash[*b]))
        a++, b++;
    if (*a == '\0' && ret == 0)
        ret = 1;
    else if (ret < 0)
        ret = 1;
    else if (ret > 0)
        ret = -1;
    return ret;
    /*********End*********/
}
int main()
{
    int n, i, j;
    for (i = 0; i < 26; i++)
        scanf("%d", &hash['a' + i]);
    for (i = 0; i < 26; i++)
        scanf("%d", &hash['A' + i]);
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%s", word[i]);
    int flag = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            if (cmps(word[j + 1], word[j]) == 1)
            {
                strcpy(tmp, word[j]);
                strcpy(word[j], word[j + 1]);
                strcpy(word[j + 1], tmp);
                flag = 1;
            }
        }
        if (flag == 0)
            break;
    }
    for (i = 0; i < n; i++)
        printf("%s\n", word[i]);
    return 0;
}


#if 0

-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


#endif