0
#include <stdio.h>
#include <stdlib.h>
#define UINT unsigned int

struct item
{
UINT   time ;           // time in tics which is used to order the list.
UINT   id ;             // penguin id number.
UINT   event ;          // event this item describes.
struct item  *next ;    // pointer to next item in list.
};

struct item *head=NULL;
struct item *trail=NULL;


void link_list(UINT time, UINT id, UINT event)
{
struct item *t=NULL;
static int i=0;
if(i==0)
{
    head->time=time;
    head->id=id;
    head->event=event;
    trail=head;
    trail->next=NULL;
    i++;
    printf("Hello Word\n");
}
t=malloc(sizeof(struct item));
trail->next=t;
trail->time=time;
trail->id=id;
trail->event=event;
trail=t;
trail->next=NULL;
if(i!=0)
    printf("I am \n");

}

int main(int argc, char *argv[])
{
UINT x[3]={4,5,7}, y[3]={40,50,60}, z[3]={100,900,500};
int i=0;
head=malloc(sizeof(struct item));

trail=head;
link_list(x[0], y[0], z[0]);
link_list(x[1], y[1], z[1]);
link_list(x[2], y[2], z[2]);


struct item *f=NULL;
f=head;
do
{
    printf("trail: %d %d %d\n", f->time, f->id, f->event);
    f=f->next;
}
while(f!=NULL);

return 0;
}  

良い一日、

現在、リンク リストのコード実装に論理的な問題があります。このコードは、リンクされたリストを使用するより大きなプログラムに統合するために使用しているフレームワークであるため、これを正しく行う必要があります。

基本的に何が起こっているかというと、リンクされたリストの内容を確認するためのデバッグ ラインとして使用する do while ループに最終的に到達すると、コマンド ラインで次の出力が得られます。

トレイル: 4 40 100

トレイル: 5 50 900

トレイル: 7 60 500

トレイル: 0 0 0

出力が次のようになることを期待しています。

トレイル: 4 40 100

トレイル: 5 50 900

トレイル: 7 60 500

他の printf は、関数を実際に正しく実行しているかどうかを確認するために使用されるため、コードから除外しました。また、これは無関係かもしれませんが、Linux で c 用のより良いデバッガーはありますか? ビルトインデバッガーが malloc コマンドに入ると狂ってしまうので、頭の中のすべてのプログラムをデバッグしなければなりません。:(

4

2 に答える 2

1

組み込みデバッガで gdb を意味する場合は、malloc(); をステップ オーバーするように指示できます。ただし、プログラムが malloc でクラッシュする場合は、メモリ割り当てに遭遇したか、プログラムでバグを使用しています。

明らかなバグの 1 つは、link_list() で "t" を正しく初期化していないことです。特に、t->next はガベージであり、それをたどろうとするとプログラムがクラッシュする可能性があります。Trail->timeではなく、t->time、t->idなどを設定するつもりだと思います。

リンクされたリストに追加する最良の方法は、通常、すべてのフィールドが初期化された新しいリスト項目を返す別の関数を用意し、追加するルーチンでポインターを操作することです。また、リスト ヘッドが構造体ではなく単なるポインターである場合にも役立ちますが、それはスタイルの問題です。

リンクされたリストを提供するライブラリを使用するのが最善ですが、リンクされたリストについて学んでいる場合、それは役に立ちません!

于 2012-09-07T05:13:40.567 に答える
1

新しいノードをテールに追加し、データムをテール ノードに書き込み、テール ポインターを新しいノードに移動します。

t=malloc(sizeof(struct item));
trail->next=t;
trail->time=time;
trail->id=id;
trail->event=event;
trail=t;
trail->next=NULL;

t は新しいノードに設定されます。現在のリスト tail の次のポインタは、t を指すように設定され、tail が指すノードの時刻、id、およびイベント フィールドが書き込まれます。テール参照は、まだデータを含まない t に移動されました。

「リスト」管理にモジュール設計を使用することから始めて、このコードを改善できるものはたくさんありますが、これは差し迫った問題です。

于 2012-09-07T05:13:46.393 に答える