0

私は独学で C を学んでおり、今は二重連結リストを学ぼうとしています。本のチュートリアルに従って、いくつかの問題を発見しました。

typedef struct _seg {
   int  bits[256];
   struct _seg *next, *prev;
} seg;
EXTERN seg *head;
EXTERN seg *last;

このようなコードに基づいて、リンクリストを先頭から調べるには、次のようなことができることがわかります。

seg *p;
p = head;
for ( i = 0; i < k; i++)              
p = p->next;

ただし、最後のノード(最後として定義)からリンクリストを逆にたどるにはどうすればよいですか?

4

1 に答える 1

2

あなたは対称的に推論し、例えばコーディングすることができます

seg *p = last;
for (int j=0; j < k && p != NULL; j++)
  p = p->prev;

未定義の動作p != NULLを回避するためにテストを追加しました(リストの要素数が少ない場合。多くのシステムでは、その場合にテストを省略すると、セグメンテーション違反でクラッシュします)。k

コンパイル時にすべての警告とデバッグ情報を有効にすることを忘れないでください (例: でコンパイルgcc -Wall -g)、デバッガーの使用方法 (例: ) を学びますgdb

ところで、C++11は C99 やC11とは異なる言語であり(ただし、いくつかの互換性があります)、std::listを使用してリンクされたリストの言語サポートを (その標準ライブラリを通じて) 提供します。

于 2013-09-22T14:55:20.770 に答える