私はこのコードで何日も騒がしきました。なぜ、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です。最初のプッシュバックでは最初のノードの値が設定されますが、NEXTが設定されていないノードの場合はlength関数が0を返します。 – mascoj
@mascoj出力を見ると、関数が "0"になっていることが表示されます: if(!length(* lista)){ (* lista) - > val = e; printf( "経度0"); } しかし、印刷されると、リストは空のままです。 – Manuestaire