对结构体数组进行合并排序

问题描述 投票:0回答:1

我正在尝试对结构数组进行合并排序,我遇到了许多不同的段错误,但目前它发生在 arrayCopy 函数中:

void arrayCopy(item10array dest[], item10array src[], const int lenght, const int leftShift) {
    for(int i = 0; i < lenght; i++) {
        structCopy(dest[i], src[leftShift + i]);
    }
}

我改变了一些小事情,直到我将段错误推入函数 arrayCopy 中,我不明白是什么导致了错误。

typedef struct 
{
    char Nome[50]; //vem do ficheiro ruas.txt
    unsigned int int_arr[6];
    char char_arr[6];
}Arteria;

typedef struct
{
    Arteria arteria;
    int cont;
}item10array;


void structCopy(item10array dest, item10array src) {

    strcpy(dest.arteria.Nome, src.arteria.Nome);

    for(int j = 0; j < 6; j++) {
        dest.arteria.int_arr[j] = src.arteria.int_arr[j];
        dest.arteria.char_arr[j] = src.arteria.char_arr[j];
    }

    dest.cont = src.cont;
}

void arrayCopy(item10array dest[], item10array src[], const int lenght, const int leftShift) {
    for(int i = 0; i < lenght; i++) {
        structCopy(dest[i], src[leftShift + i]);
    }
}

void mergeSorted(item10array *array, const int l, const int m, const int r) {
    int left_lenght = m - l + 1;
    int right_lenght = r - m;

    item10array temp_left[left_lenght];
    item10array temp_right[right_lenght];

    int i, j, k;

    arrayCopy(temp_left, array, left_lenght, l);
    arrayCopy(temp_right, array, right_lenght, m + 1);

    for (i = 0, j = 0, k = l; k <= r; k++) {
        if ((i < left_lenght) && (j >= right_lenght || temp_left[i].cont <= temp_right[j].cont)) {
            structCopy(array[k], temp_left[i]);
            i++;
        }
        else {
            structCopy(array[k], temp_right[j]);
            j++;
        }
    }  
}

void sortRecursion(item10array *arrray, int l, int r) {
    //isto é desnecessario mas dá me paz de alma
    if(r <= 1)
        return;
    if(l < r) {
        //encontrar o meio do array
        int m = l + (r - l) / 2;

        sortRecursion(arrray, l, m);
        sortRecursion(arrray, m + 1, r);

        mergeSorted(arrray, l, m, r);
    }
}

void sortItem10(item10array *rua, int lenght) {
    sortRecursion(rua, 0, lenght - 1);
}

void item10letra(Arteria* origin_ptr) {
    item10array rua[345] = {{"0", 0, 0, 0}};
    for (int i = 0; i < 345; i++) {
        rua[i].arteria = origin_ptr[i];
    }
    char letra;
    int cont = 0;
    int lenght = sizeof(item10array) * 345;

    for(int i = 0; i < 345; i++) {
        rua[i].arteria = origin_ptr[i];
    }


    for(int i = 0; i < 345; i++) {
        for(int j = 0; j < 6 && rua[i].arteria.char_arr[j] != 0; j++) {
            if(rua[i].arteria.char_arr[j] == letra) {
                cont++;
            }
        }
        rua[i].cont = cont;
    }

    sortItem10(rua, lenght);
}

有些东西没有英文名字,那是因为我也没有英文名字。

谢谢。

c sorting segmentation-fault mergesort
1个回答
0
投票

这不是一个解决方案,但您根本不需要迭代数组结构成员。您可以分配结构。 (我还建议使用

size_t
类型而不是
int

void arrayCopy(item10array *dest, const item10array *src, const size_t lenght, const size_t leftShift) 
{
    for(size_t i = 0; i < lenght; i++) 
    {
        dest[i] = src[leftShift + i];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.