gpt4 book ai didi

更改 LinkedList 中的数组值

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:02 29 4
gpt4 key购买 nike

我正在尝试编写一个程序来计算给定字符出现在特定字符序列之后的概率。为此,我使用了结构节点,如下所示:

typedef struct node
{
struct node* prox[nchars];
int* ocorrencias;
int n;
} node;

n是指特定节点出现的次数。指针“ocorrencias”实际上是一个大小为 nchars 的数组,每个条目表示给定字符在当前节点之后出现的次数。要初始化每个节点,我使用以下函数:

void AlocaNode(node* qualquer){
//Função usada para inicializar as variaveis de um node
qualquer = malloc(sizeof(node));
qualquer->n = 0;
qualquer->ocorrencias = (int *)calloc(nchars, sizeof(int));
}

我的问题是当我尝试更改节点的值时。我一定尝试过多种不同的算法来更新 ocorrencias 数组。我试过的最后一个写在下面。 pos 是整数,我确定它具有有效值。

//Pegamos a posição do caracter no array
pos = retornaPos(letra);

//Atualizamos a ocorrencias no node
int *prt = malloc(sizeof(int));
prt = &atual->ocorrencias;
*(prt+pos) = *(prt+pos) + 1;

//E o número de vezes que o node apareceu
atual->n++;

//Verificamos se o node atual já foi alocado
if (atual->prox[pos] == NULL){
AlocaNode(atual->prox[pos]);
}

//E atualizamos o nosso node para apontar para o próximo
atual = atual->prox[pos];

我做错了什么?我如何更新它的值?

最佳答案

您的 AlocaNode 失去分配的内存,因为变量 qualquer 在函数退出后超出范围:

void AlocaNode(node* qualquer) {
qualquer = malloc(sizeof(node));
qualquer->n = 0;
qualquer->ocorrencias = (int *)calloc(nchars, sizeof(int));
}

来自调用函数的节点未更新。相反,您可以将双指针传递给节点:

void AlocaNode(node **qualquer) {
*qualquer = malloc(sizeof(node));
(*qualquer)->n = 0;
(*qualquer)->ocorrencias = calloc(nchars, sizeof(int));
}

然后这样调用:

node qualquer;

AlocaNode(&qualquer);

另一种可能性是从函数返回新节点:

node *AlocaNode(void) {
node *qualquer = malloc(sizeof(node));

(*qualquer)->n = 0;
(*qualquer)->ocorrencias = calloc(nchars, sizeof(int));
return qualquer;
}

然后这样调用:

node qualquer = AlocaNode();

(我更喜欢第二种变体。)

关于更改 LinkedList 中的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26872443/

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