无法推到列表的后面

时间:2016-10-11 16:49:48

标签: c list structure

我现在已经使用此代码进行了几天的争论,任何关于为什么我的元素在第二次调用时被推到列表后面的想法? 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 个答案:

答案 0 :(得分:0)

  

关于为什么我的元素在第二次调用时被推到列表后面的任何想法

看起来你走到每个节点的next,直到你到达列表的末尾。然后将最后next设置为要添加的节点。

您正在呼叫pushback并且它有while循环:

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

第一次调用列表的pushback已初始化。第二次调用新节点被添加到后面。