作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习字符串数组中的合并排序。这是我的代码:
#include <stdio.h>
#include <string.h>
#define SIZE 10
int num = 0;
// Merges two subarrays of arr[].
// First subarray is arr[l..m]
// Second subarray is arr[m+1..r]
void merge(char str[SIZE][10], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
/* create temp arrays */
char L[n1][10], R[n2][10];
/* Copy data to temp arrays L[] and R[] */
for (i = 0; i < n1; i++)
strcpy(L[i], str[l+i]);
for (j = 0; j < n2; j++)
strcpy(R[j], str[m+1+j]);
/* Merge the temp arrays back into arr[l..r]*/
i = 0; // Initial index of first subarray
j = 0; // Initial index of second subarray
k = l; // Initial index of merged subarray
while (i < n1 && j < n2) {
num++;
switch (strcmp(L[i], R[j])) {
case -1 :
strcpy(str[k], L[i]);
i++;
break;
case 1 :
strcpy(str[k], R[j]);
j++;
break;
}
k++;
}
/* Copy the remaining elements of L[], if there
are any */
while (i < n1) {
strcpy(str[k], L[i]);
i++;
k++;
}
/* Copy the remaining elements of R[], if there
are any */
while (j < n2) {
strcpy(str[k], R[j]);
j++;
k++;
}
}
/* l is for left index and r is right index of the
sub-array of arr to be sorted */
void mergeSort(char str[SIZE][10], int l, int r) {
if (l < r) {
// Same as (l+r)/2, but avoids overflow for
// large l and h
int m = l+(r-l)/2;
// Sort first and second halves
mergeSort(str, l, m);
mergeSort(str, m+1, r);
merge(str, l, m, r);
}
}
/* UTILITY FUNCTIONS */
/* Function to print an array */
void printArray(char A[SIZE][10], int size)
{
int i;
for (i=0; i < size; i++)
printf("%s ", A[i]);
printf("\n");
}
int main(void) {
int i, n;
char str[SIZE][10] = {"korea", "aaa", "computer", "seoul", "algorithm", "bbb", "ccc", "ddd", "game", "java"};
char max[10];
printf("Given array is \n");
printArray(str, SIZE);
mergeSort(str, 0, SIZE - 1);
printf("\nSorted array is \n");
printArray(str, SIZE);
printf("횟수 : %d", num);
return 0;
}
上面的代码运行良好。但我想改变merge(char str[SIZE][10], int l, int m, int r)
和mergeSort(char str[SIZE][10], int l, int r)
, printArray(char A[SIZE][10], int size)
使用双指针的代码不像 char str[SIZE][10]
但是char **str
。我该如何更改这段代码?我尝试像这样进行更改,但是发生了一些错误...我必须更改 merge()
中的代码成员(member) char L[n1][10]
和char R[n2][10]
.
最佳答案
虽然数组可以衰减为指向其第一个元素的指针,但数组的数组不会衰减为指向指针的指针。
如果你有
char str[SIZE][10];
然后是数组 str
可以衰减为指向其第一个元素的指针,其类型为 char (*)[10]
。不会发生进一步的腐烂。
这正是您代码中已有的内容(作为参数 char str[SIZE][10]
将被编译器视为 char (*str)[10]
)。
如果您想要一个指向指针的指针,那么您要么需要从一开始就有该类型(例如 char **str;
),要么使用指针数组(例如 char *str[SIZE];
),它将衰减到正确的类型。
关于c - 如何在c中使用指针合并排序字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58168821/
我是一名优秀的程序员,十分优秀!