Estoy trabajando para crear un programa de lista vinculada en C. Tengo problemas para mostrar la lista completa. Todo lo que puedo mostrar son los primeros y últimos elementos. No estoy seguro de lo que está pasando. He intentado cambiar los enlaces a todas las formas diferentes en que puedo pensar, y ninguno de ellos funcionará del todo. Estoy bastante seguro de que esto es solo un simple error que estoy cometiendo en alguna parte. Agradecería cualquier ayuda y sugerencia.

Aquí está el código

#include <stdio.h>
#include <stdlib.h>

struct node
{
     int data;
     struct node *next;
}
*start = NULL;

void display();
void create ();

int main(void)
{
int numberOfElements = 0;
printf("How many elements do you want to enter?\n");
scanf("%d",&numberOfElements);

for (int i = 0; i < numberOfElements; ++i){
     printf("Please enter data for element number %d\n", i+1);
     createList();
}

display();


     return 0;
}

void display(){
     struct node *tempNode;

     printf("Now displaying the list\n");
     tempNode = start;
     while (tempNode != NULL){
          printf("%d---> ",tempNode->data);
          tempNode = tempNode->next;
     }
     printf("NULL\n");

}
void createList(){
     struct node *newNode, *current;
     newNode = (struct node *)malloc(1 * sizeof (struct node));

     //printf("Please enter the data for each element\n");
     scanf("%d", &newNode ->data);

     // For testing
     printf("You entered %d\n",newNode->data);

     newNode->next = NULL;

     if(start == NULL){
          start = newNode;
          current = newNode;
     }
     else {
          current->next = newNode;
          current = newNode;
     }
}

Entonces, cuando el usuario ingresa algunos datos, digamos dos elementos, de 22 y 28, la pantalla debe ser 22 ---> 28 ---> NULL en lugar de lo que se muestra es 22 ---> NULL

Gracias

0
terrylt1 24 jun. 2020 a las 07:44

2 respuestas

La razón es que current tiene un ámbito local en su función CreateList, aunque persiste en el nodo actual en current, cuando CreateList sale, current se desvanece, durante otra llamada del CreateList, current no sabe nada de la ejecución anterior, ya que se crea como una nueva variable para esta invocación particular de la función. Pero persiste el valor solo para el primer nodo ya que start tiene alcance global, existe a menos que su programa finalice la ejecución. Entonces, haga current variable global, que corrige el error:

Mira esto: https://ideone.com/yWQLDL

0
Mateen 24 jun. 2020 a las 05:43

Su código espera / requiere que la variable current en createList mantenga su valor entre las llamadas de la función. Por defecto, no funciona de esa manera en C. El valor de las variables dentro de una función no mantiene su valor de llamada a llamada.

Si desea que una variable en una función se comporte de esa manera, debe usar la palabra clave static.

Entonces si cambias:

 struct node *newNode, *current;

Para

     struct node *newNode;
     static struct node *current;

La variable current mantendrá su valor entre llamadas y su código (probablemente) funcionará.

En términos más técnicos, debe leer sobre "duración del almacenamiento automático" y "duración del almacenamiento estático".

Dicho esto, no es una buena idea hacer algo así, de hecho, es una idea bastante mala. También es una mala idea tener start como variable global.

En su lugar, debe definir dos variables en main, por ejemplo head y tail, y pasarlas (o su dirección) a la función de inserción.

0
4386427 24 jun. 2020 a las 05:44