我现在已经使用此代码进行了几天的争论,任何关于为什么我的元素在第二次调用时被推到列表后面的想法? 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
[]
答案 0 :(得分:0)
关于为什么我的元素在第二次调用时被推到列表后面的任何想法
看起来你走到每个节点的next
,直到你到达列表的末尾。然后将最后next
设置为要添加的节点。
您正在呼叫pushback
并且它有while
循环:
while (it->next != NULL){
printf("%f, ",it->val);
it = it->next;
第一次调用列表的pushback
已初始化。第二次调用新节点被添加到后面。