#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)){
блоке ofpushback
у вас нет разрыва строки в конце вашегоprintf
оператора. Это делает вывод немного трудным для чтения. Имея это в виду, вы можете видеть, что ваша функция печати не печатает список, еслиnext
имеет значение null. При первом добавлении чего-либо в список первый элементnext
имеет значение null, поэтому ничего не распечатывается.3. @Manuestaire Пожалуйста, если это решение отвечает на ваш вопрос, пожалуйста, отметьте его как ответ. Если нет, можете ли вы предоставить дополнительную информацию.