gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:49:13 25 4
gpt4 key购买 nike

我正在尝试提出一种基本的基数排序(我从未真正见过,所以如果我的排序很糟糕,我很抱歉),但我收到了 EXC_BAD_ACCESS 错误link = *(link.pointer); 行。我的 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;
}

关于c - 用于基数排序的链表中的指针上的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18003980/

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