0

Cで循環単一リンクリストをトラバースしようとしていますが、最後の要素を除くすべての要素が表示されています。バグはどこにありますか?表示機能の他の部分の状態が変化している間かもしれませんが、状態はどうあるべきですか?リンクリストの表示と作成の機能は次のとおりです。

struct node
{

    int data;
    struct node *next;
}*last;

void create(int num)
{

        struct node *t,*q;
        t=(struct node*)malloc(sizeof(struct node));
        t->data=num;
        //list is empty 
        if(last==NULL){
        last=t;
        t->next=last;
    }
    else
    {
        t->next=last->next;     
        last->next=t;
        last=t;
    }
    return;
}

void display()
{

    struct node *q;
    q=(struct node*)malloc(sizeof(struct node));
    if(last==NULL){
        printf("no items in the list");
        return;

    }
    else{
        q=last->next;
        while(q!=last){
                printf("%d\n",q->data);
            q=q->next;          
        }
    }
    //return;
}
4

3 に答える 3

2

から印刷を開始last->nextしますが、while の条件が で壊れq==lastます。lastしたがって、ノードを印刷していません。

part が実行される場合else、リストに少なくとも 1 つのノードがあることがわかります。したがって、else 部分を次のように変更できます。

q=last->next;
do{
    printf("%d\n",q->data);
    q=q->next;
}while(q!=last->next);
于 2013-01-22T11:24:09.900 に答える
1

循環リストの最後のノードを印刷していません。

追加

printf("%d\n",q->data);

elseブロックインの後display()

または、else ブロックの後に醜い printf を配置する代わりに、 do while constructの使用を検討できます 。

また、display() で q のメモリ割り当てを行う必要はありません。ただ

struct node *q;

十分でなければなりません。リストをトラバースするためのポインターのみを保持しているためです。

于 2013-01-22T11:22:13.343 に答える
1

lastこの場合も有効なメモであり、ループから抜け出す方法は問題ありません。while ループの後に少しコードを追加して、lastノードも出力する必要があります。

于 2013-01-22T11:17:37.820 に答える