难以在我的C程序中调试我的链表

时间:2017-01-01 12:24:43

标签: c struct linked-list

我有这个结构包含相同结构类型(peca)的链接。问题是当我尝试在不同的函数中使用peca-> penext时,调试器显示结构peca没有链接到下一个或前一个。我做错了什么?

typedef struct peca{
    int index;
    int esquerda;
    int direita;
    int disponibilidade;
    struct peca *penext;
    struct peca *peant;
}PECA;

typedef struct mao{
    int index;
    int tamanho;
    PECA *ppeca;
    struct mao *pnext;
}MAO;

typedef struct jogada{
    int index;
    PECA *ppeca;
    struct jogada *pnext;
}JOGADA;

typedef struct jogo{
    int nr_maos;
    MAO *pmao;
    JOGADA *pjog;
}JOGO;

void init_jogada(JOGADA *pj) {
pj->ppeca = (PECA *) malloc(sizeof(PECA) * 28);
PECA *paux = pj->ppeca;
  for (int i = 0; i < 28; ++i) {
    paux->index = i;
    paux->disponibilidade = 1;
    if (i == 0)
    {
        paux->peant = NULL;
        paux->penext = paux++;
    }
    else if (i == 27)
    {
        paux->peant = paux--;
        paux->penext = NULL;
    }
    else
    {
        paux->penext = paux++;
        paux->peant = paux--;
    }
    paux++;
  }


}

2 个答案:

答案 0 :(得分:3)

增加指向PECA的指针的方式只是cunfusing,这可能是破坏你的代码的原因。由于我会说葡萄牙语,我可以告诉peant表示pelast,所以我可以推断它是双链表。

你的双重链接列表绝对是多余的,因为你的作品(PECA是英文单片)是一个数组。链接列表用于迭代序列,其中项目在内存中稀疏存储,数组将项目放在彼此旁边,这就是为什么可以取消引用具有索引的项目。

这就是我认为你正在做的事情:

    paux->penext = paux++; 
    /* Here you set the next, why increment the pointer while assigning?
       paux++ changes the value of paux. You might not want that here */

也许你不知道paux ++或++ paux或paux--或--paux 更改,其中paux指向。

这是您的代码更正:

  for (int i = 0; i < 28; ++i) {
    paux->index = i;
    paux->disponibilidade = 1;
    if (i == 0)
    {
        paux->peant = NULL;
        paux->penext = paux +1;
    }
    else if (i == 27)
    {
        paux->peant = paux - 1;
        paux->penext = NULL;
    }
    else
    {
        paux->penext = paux + 1;
        paux->peant = paux - 1;
    }
    /* Ok! Now we really want to increment paux, to use in the next iteration */
    paux++;
  }

答案 1 :(得分:1)

作为一般规则,Ddn在for循环中创建特殊情况。获取if (i==0)中的代码并将其放在循环之前,if (i==27)中的代码超出循环。它使循环本身对于读者来说更加简单,并且在您更改迭代次数并忘记更改条件时避免出现问题。

如果您不在循环内修改paux,您的代码看起来会更简单。使用迭代器i来访问对象。如果您真的想使用paux来简化语法,可以将其设置为迭代器,也可以在循环开始时分配它:

paux = pj->ppeca + i;

然后,您可以使用paux + 1paux - 1找到下一个和上一个。

但你真的需要下一个/前一个指针吗?在没有看到其余代码的情况下,这听起来可能是一个愚蠢的问题,但是当你的元素已经被分配到数组中时,为什么你的结构类似于双链表?