我有这个结构包含相同结构类型(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++;
}
}
答案 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 + 1
和paux - 1
找到下一个和上一个。
但你真的需要下一个/前一个指针吗?在没有看到其余代码的情况下,这听起来可能是一个愚蠢的问题,但是当你的元素已经被分配到数组中时,为什么你的结构类似于双链表?