这两处代码的意思,将对应字母的哈希索引值,存储到与字母的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
就是分别输入每个大小写字符的数量
在C语言中,如果执行一个运算时,同时有无符号整数和带符号整数参加,则C语言会按无符号整数进行运算
问题:如何在单词列表中进行排序并使用指针?
解决方案: 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