2016-10-11 12 views
0

私はこのコードで何日も騒がしきました。なぜ、2番目の呼び出しで要素がリストの後ろにプッシュされるのか、 T.Tリストの後ろにプッシュできない

私は必死に助けてください。

#include <stdio.h> 
#include <stdlib.h> 

typedef struct DLista{ 
    float val; 
    struct DLista *next; //*prev; 
}DLista; 

void print(DLista *lista){ 
    DLista *it = lista; 
    if(lista == NULL){ 
    printf("Lista no inicializada\n"); 
    }else{ 
    printf("["); 
    while(it->next!=NULL){ 
     printf("%f, ",it->val); 
     it = it->next; 
    } 
    printf("]\n"); 
    } 
} 

int length(DLista *lista){ 
    DLista *it = lista; 
    int i = 0; 
    while(it->next!=NULL){ 
    it = it->next; 
    i++; 
    } 
    return i; 
} 

void pushback(DLista **lista, float e){ 
    DLista *it = *lista; 
    if(!length(*lista)){ 
    (*lista)->val= e; 
    printf("Longitud 0"); 
    }else{ 
    while (it->next != NULL){ 
     printf("%f, ",it->val); 
     it = it->next; 
    } 
    DLista *new; 
    new = (DLista*) malloc(sizeof(DLista)); 
    if (new==NULL) printf("No hay memoria disponible!\n"); 

    new->val = e; 
    new->next = NULL; 

    it->next=new; 
    } 

} 

void pushfront(DLista **lista, float e){ 
    DLista *new; 
    new = (DLista*) malloc(sizeof(DLista)); 
    if (new==NULL) printf("No hay memoria disponible!\n"); 

    new->val = e; 
    new->next = *lista; 
    *lista = new; 
} 

int removefront(DLista **lista){ 
    DLista *new = NULL; 
    if((*lista)->next == NULL){ 
    return 0; 
    }else{ 
    fprintf(stderr,"removing: %f \n",(*lista)->val); 
    new = (*lista)->next; 
    free(*lista); 
    *lista=new; 
    return 1; 
    } 
} 

void clear(DLista **lista){ 
    int i; 
    do{ 
    i = removefront(lista); 
    }while(i); 
} 

void init(DLista **lista){ 
    *lista = (DLista*) malloc(sizeof(DLista)); 
    (*lista)->next=NULL; 
    (*lista)->val=0; 
    fprintf(stderr,"initialized \n"); 
} 

int main(){ 
    DLista *lista=NULL; 
// lista->next=NULL; 
    init (&lista); 
    printf("Longitud: %d \n", length(lista)); 
    pushback(&lista,1.0); 
    print(lista); 
    pushfront(&lista,2.0); 
    pushfront(&lista,3.0); 
    print(lista); 
    pushback(&lista,5.0); 
    print(lista); 
    pushback(&lista,7.0); 
    print(lista); 
    printf("Longitud: %d \n", length(lista)); 

    printf("Borrado? %d \n", removefront(&lista)); 
    print(lista); 
    printf("Borrado? %d \n", removefront(&lista)); 
    print(lista); 
    printf("Borrado? %d \n", removefront(&lista)); 
    print(lista); 
    clear(&lista); 
    print(lista); 

    return 0; 
} 

コードは、この出力を生成します:

initialized 
Longitud: 0 
Longitud 0[] 
[3.000000, 2.000000, ] 
3.000000, 2.000000, [3.000000, 2.000000, 1.000000, ] 
3.000000, 2.000000, 1.000000, [3.000000, 2.000000, 1.000000, 5.000000, ] 
Longitud: 4 
removing: 3.000000 
Borrado? 1 
[2.000000, 1.000000, 5.000000, ] 
removing: 2.000000 
Borrado? 1 
[1.000000, 5.000000, ] 
removing: 1.000000 
Borrado? 1 
[5.000000, ] 
removing: 5.000000 
[] 
+1

長さ関数は1です。最初のプッシュバックでは最初のノードの値が設定されますが、NEXTが設定されていないノードの場合はlength関数が0を返します。 – mascoj

+0

@mascoj出力を見ると、関数が "0"になっていることが表示されます: if(!length(* lista)){ (* lista) - > val = e; printf( "経度0"); } しかし、印刷されると、リストは空のままです。 – Manuestaire

答えて

0

私の要素が2回目の呼び出し

上のリストの背面にプッシュされている理由上の任意のアイデアは、あなたのように見えますあなたがリストの終わりに達するまで各ノードのnextを歩いています。最後に、追加するノードにnextを設定します。

あなたはpushbackを呼び出している、それがwhileループを持っています

while (it->next != NULL){ 
    printf("%f, ",it->val); 
    it = it->next; 

リストが初期化されると呼ばれる最初の時間pushbackを。 2番目の呼び出しで新しいノードが背面に追加されます。

+0

私はdo {} while()に変更するとそれはです。構造体にセグメンテーションエラーが発生します。 – Manuestaire

+0

あなたの質問は、なぜ私の要素が2番目の呼び出しでリストの後ろにプッシュされるのかを質問します。 'push(' length(* lista)) ''ブロック 'pushback'では' printf'文の最後に改行がありません。これにより、出力を読みにくくすることができます。これを念頭に置いて、 'next'がnullの場合、あなたの印刷機能はリストを印刷しないことがわかります。最初に何かがリストに追加されたとき、最初の項目 'next'はnullなので、何も出力されません。 – soundslikeodd

+0

@Manuestaireこの解決策があなたの質問に答える場合は、回答としてマークしてください。そうでない場合、より多くの情報を提供できますか? – soundslikeodd

関連する問題