c-基数排序链表中指针上的EXC_BAD_ACCESS



我正试图想出一个基本的基数排序(我从来没有见过,所以如果我的排序很糟糕,我很抱歉),但我在link = *(link.pointer);行遇到了EXC_BAD_ACCESS错误。我的C技能不太好,所以希望有人能教我做错了什么。

我正在使用XCode,并且ARC已启用。

这是代码:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define ARRAY_COUNT 10
#define MAX_VALUE   1000000
#define MODULO 10.0f
typedef enum
{
    false,
    true
} bool;
typedef struct linkedListStruct
{
    int value;
    struct linkedListStruct *pointer;
} LinkedList;
void radixSort(int *array);
bool arraySorted(int *array);
int * intArray(int minValue, int maxValue);
int main(int argc, const char * argv[])
{
    int *sortingArray = intArray(0, MAX_VALUE);
    radixSort(sortingArray);
    printf("Array %s sorted", arraySorted(sortingArray) ? "" : "not");
    return 0;
}
void radixSort(int *array)
{
    int numberOfIterations = (int)ceilf(log(MAX_VALUE)/log(MODULO));
    for(int n = 0; n < numberOfIterations; n++)
    {
        LinkedList *linkedListPointers[(int)MODULO] = {0};
        int i = ARRAY_COUNT;
        while(i--)
        {
            int location = (int)floor((array[i] % (int)powf(MODULO, n + 1))/powf(MODULO, n));
            LinkedList link = { array[i], NULL };
            link.pointer = linkedListPointers[location];
            linkedListPointers[location] = &link;
        }
        int location = 0;
        for(int pointerSelection = 0; pointerSelection < MODULO; pointerSelection++)
        {
            if(linkedListPointers[pointerSelection])
            {
                LinkedList link = { 0, linkedListPointers[pointerSelection] };
                linkedListPointers[pointerSelection] = NULL;
                while(link.pointer)
                {
                    link = *(link.pointer);
                    array[location++] = link.value;
                }
            }
        }
    }
}
bool arraySorted(int *array)
{
    int i = ARRAY_COUNT;
    while(--i)if(array[i - 1] > array[i])break;
    return !i;
}
int * intArray(int minValue, int maxValue)
{
    int difference = maxValue - minValue;
    int *array = (int *)malloc(sizeof(int) * ARRAY_COUNT);
    int i;
    for(i = 0; i < ARRAY_COUNT; i++)
    {
        array[i] = rand()%difference + minValue;
    }
    return array;
}

此外,如果有人想对我的同类提出改进建议,我们也将不胜感激。

问题来自于我如何分配链表。我更改了

LinkedList link = { array[i], NULL };
link.pointer = linkedListPointers[location];

LinkedList *link = malloc(sizeof(LinkedList));
link->value = array[i];
link->pointer = linkedListPointers[location];

在第一个例子中,指向link的指针在每次循环迭代中都保持不变(我不知道它会这样做),所以我需要使指针指向新分配的内存块。

编辑:

改变这一点也让我改变了

while(link.pointer)
{
    link = *(link.pointer);
    array[location++] = link.value;
}

while(linkPointer)
{
    link = *linkPointer;
    array[location++] = link.value;
    linkPointer = link.pointer;
}

相关内容

  • 没有找到相关文章

最新更新