gpt4 book ai didi

c - 如何在c中使用指针合并排序字符串数组?

转载 作者:行者123 更新时间:2023-11-30 20:52:44 24 4
gpt4 key购买 nike

我正在学习字符串数组中的合并排序。这是我的代码:

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com