Не удается переместить в конец списка

#c #list #structure

#c #Список #структура

Вопрос:

я уже несколько дней борюсь с этим кодом, есть идеи, почему мои элементы перемещаются в конец списка при втором вызове? 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 inicializadan");
  }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 (amp;lista);
  printf("Longitud: %d n", length(lista));
  pushback(amp;lista,1.0);
  print(lista);
  pushfront(amp;lista,2.0);
  pushfront(amp;lista,3.0);
  print(lista);
  pushback(amp;lista,5.0);
  print(lista);
  pushback(amp;lista,7.0);
  print(lista);
  printf("Longitud: %d n", length(lista));

  printf("Borrado? %d n", removefront(amp;lista));
  print(lista);
  printf("Borrado? %d n", removefront(amp;lista));
  print(lista);
  printf("Borrado? %d n", removefront(amp;lista));
  print(lista);
  clear(amp;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. При первоначальном возврате задается значение первого узла, но функция длины возвращает 0 для узла без следующего набора.

2. @mascoj если вы посмотрите на вывод, вы увидите, что напечатано «Longitud 0», что означает, что функция вошла в: if(!length(* lista)){ (* lista)-> val= e; printf(«Longitud 0»); } Но затем при печати спискаостается пустым

Ответ №1:

есть идеи о том, почему мои элементы перемещаются в конец списка при втором вызове

Похоже, вы идете по next каждому узлу, пока не дойдете до конца списка. Затем вы устанавливаете последний next для добавляемого вами узла.

Вы вызываете pushback , и у него есть while цикл:

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

При первом pushback вызове список инициализируется. При втором вызове новый узел добавляется в конец.

Комментарии:

1. Дело в том, что если я изменю is на do{}while(); структура, я получу ошибку сегментации.

2. Ваш вопрос задает why my elements are pushed to the back of the list on the second call . В if(!length(*lista)){ блоке of pushback у вас нет разрыва строки в конце вашего printf оператора. Это делает вывод немного трудным для чтения. Имея это в виду, вы можете видеть, что ваша функция печати не печатает список, если next имеет значение null. При первом добавлении чего-либо в список первый элемент next имеет значение null, поэтому ничего не распечатывается.

3. @Manuestaire Пожалуйста, если это решение отвечает на ваш вопрос, пожалуйста, отметьте его как ответ. Если нет, можете ли вы предоставить дополнительную информацию.