2017-01-01 3 views
1

私は、同じ構造体型(peca)へのリンクを含むこの構造体を持っています。問題は、別の関数でpeca-> penextを試してみると、構造体pecaが次のまたは前のものにリンクされていないことをデバッガが示していることです。私は間違って何をしていますか?私のCプログラムでリンクリストをデバッグするのが難しい

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++; 
    } 


} 
+3

[C ' 'に'のmalloc() 'と家族の戻り値をキャストさせない理由でこの議論を参照してください。](のhttp://のstackoverflow。 com/q/605845/2173917)。 –

+0

'paux - ' __after__ 'paux ++'を本当にしたいですか? –

+0

なぜですか? この方法では、膿が次の場合、pauxは前のものを指し示します。 –

答えて

1

は、原則として、Ddn'tはループのために、特別なケースを作ります。 if (i==0)のコードをループの前に置き、if (i==27)のコードがループの外に出ます。ループ自体を読者にとってよりシンプルにし、反復回数を変更して条件を変更することを忘れた場合の問題を回避します。

pauxをループ内で変更しないと、コードがはるかに単純になります。イテレータiを使用してオブジェクトにアクセスします。あなたが本当にどちらか、あなたの構文を簡素化し、それイテレータ作るか、またはループの最初にそれを割り当てることがpauxを使用する場合:

paux = pj->ppeca + i;

次に、あなたはpaux + 1paux - 1で次と前を見つけることができます。

本当に次の/前のポインタが必要ですか?コードの残りの部分を見ることなく、これは愚かな疑問に思えるかもしれませんが、要素が配列に既に割り当てられている場合、二重リンクリストに似た構造を持つのはなぜですか?

3

あなたがPECAへのポインタをインクリメントする方法は、単にコードを壊しているだけです。私はポルトガル語を話すので、peantpelastを意味するので、それは二重リンクリストであると推測できます。

あなたの作品(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ないことに気づいていない。

これは、私はあなたがworngをやっていると思うものです。

このコードが修正されています

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++; 
    } 
関連する問題