gpt4 book ai didi

无法推到列表后面

转载 作者:行者123 更新时间:2023-11-30 16:56:14 25 4
gpt4 key购买 nike

我现在已经为这段代码苦苦挣扎了几天,知道为什么我的元素在第二次调用时被推到列表的后面吗? TT

请帮帮我,我非常需要帮助。

#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
[]

最佳答案

any idea on why my elements are pushed to the back of the list on the second call

看起来您正在沿着每个节点的下一个走,直到到达列表的末尾。然后将最后一个 next 设置为要添加的节点。

您正在调用 pushback 并且它具有 while 循环:

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

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

关于无法推到列表后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39982519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com