0

円形のlinkedlistにはほとんど問題がありません:最後に要素(整数)を挿入したいです。私の関数は最後に要素を追加しますが、リンクリストは実際には循環していません (私はこの印象を持っています)。これは、私が使用する構造の .h です。

struct liste_circulaire {
  int val;
  struct liste_circulaire *suivant; /* suivant = next element */
};

typedef struct liste_circulaire liste;

    int main(void) {
  liste *l, *deb;
  deb = (liste *)malloc(sizeof(liste));
  l = deb;
  l -> suivant = deb;  /* suivant = next element */
  ajouter_element(l,0);
  ajouter_element(l,1);
  ajouter_element(l,2);
  ajouter_element(l,3);
  affiche(l,l->suivant);
  printf("%d\n",l->suivant->suivant->suivant->suivant->suivant->val);
  return 0;
}
void ajouter_element(liste *l,int x) {  
  liste *deb = l;  /* with this line, I have a pointeur on the first element of my list */
    while(l->suivant != deb) {    
      l = l -> suivant;
    }
  l -> suivant = (liste *)malloc(sizeof(liste));
  l = l -> suivant;
  l -> val = x;  
  l -> suivant = deb;
}

void affiche(liste *l,liste *deb) {
  if(l == deb) {
    printf(" Fin\n");
    return;
  }
  printf(" %d -->",deb->val);
  affiche(l,deb->suivant);
}

私のメインでは、リストの最初の要素を出力するように要求すると乱数がありますが、私の例ではリストの最初の値が 0 です。フランス人学生) ありがとう!

4

3 に答える 3

2

このため、プログラムは乱数を出力しています。

liste *l, *deb;
deb = (liste *)malloc(sizeof(liste));
l = deb;
l -> suivant = deb; 

リストの最初の要素は、正しく割り当てているノードですが、番号を指定していません。追加してみてください:

l -> val = 0; 

そして取り除く:

ajouter_element(l,0);

これで問題が解決するはずです。

于 2012-10-11T20:46:16.953 に答える
1

list.h循環リンク リストの定義済みヘッダー ファイルを使用できます。

次のリンクには、その方法のが含まれています。

これlist.hには、定義のような循環リンクリストの管理に関連するすべての関数が含まれています, ヘッドに追加, テールに追加, 削除, 循環リンクリストを閲覧するためのforeach関数...

于 2012-10-11T20:56:45.303 に答える
0

最初の要素の値を設定しないことに注意してください。(ヘルナンはここで私を倒した...)

ajouter_element() を呼び出すと、新しい要素がリストの末尾に追加されるだけでなく、リストの先頭が新しい要素になるように設定されます。

l = l -> suivant;

affiche()2 番目の要素を最初に出力し、最初の要素を最後に出力します。最初に印刷されるのはdeb->val、主にl->suivant->val.


最初の項目を印刷する場合はaffiche()... 印刷してください。:]

void affiche(liste *l,liste *deb) {
  if (deb == 0)
  {
    deb = l;
  }

  printf(" %d -->",l->val);

  if(l->suivant == deb) {
    printf(" Fin\n");
    return;
  }

  affiche(l->suivant,deb);
}

これを次のように呼び出します。

affiche(l,0);

また

affiche(l,l);

どちらも同じことをします。オーバーロードして、単一の値のみを取得することもできます。

私はこれを実行していません (またはコンパイルもしていません) が、うまくいけばかなり近いものです。

于 2012-10-11T20:48:11.843 に答える