matriz de asignación en nodo de lista enlazada

Hace poco me metí en la programación y acabo de enterarme Listas vinculadas. Sé cómo asignar elementos individuales como char o int en un nodo en una lista conectada.

Estaba tratando de asignar un char array en un solo nodo, y luego para cada nodo imprimir los elementos de la matriz.

Aquí está la parte de mi código en la que he tratado de hacer lo anterior:

node* ReadList() {
  node *head = NULL, *n, *m;
  char data[20], c;
  bool lmfao = false;
  int i;

  for (i=0; i<20; i++) {
    c = getchar();
    if (c == ' ') break;
    data[i] = c;
  }

  n = new node;
  n->next = NULL;
  n->info = data[];
  head = n;

  while (!lmfao) {

   for (i=0; i<20; i++) {
     c = getchar();
     if (c == ' ') break;
     if (c == EOF) lmfao = true;
     data[i] = c;
   }

   if (!lmfao) {
     m = new node;
     n->next = m;
     m->info = data[];
     m->next = NULL;
     n = m;

   }

   if (lmfao) {
     m = new node;
     n->next = m;
     m->info = data[];
     m->next = NULL;
   }
  }

  return head;
}

Por el bien de este ejemplo, digamos que la serie de letras no es más de 20 caracteres.

Cuando intento compilar esto recibo el mensaje de error:

test.cpp:23:18: error: expected primary-expression before ']' token
test.cpp:38:21: error: expected primary-expression before ']' token
test.cpp:47:21: error: expected primary-expression before ']' token

He intentado usar data en lugar de data[] pero entonces lo entiendo:

test.cpp:36:16: error: invalid conversion from 'char*' to 'char' [-fpermissive]

que entiendo totalmente, porque intenté convertir un puntero a un char valor.

De cualquier manera No tengo idea de lo que puedo hacer para asignar el todo el array en un solo nodo.

Asignar un solo elemento en cada nodo no funcionaría para lo que estoy tratando de hacer.

¿Alguna sugerencia?

Gracias por adelantado.

Pregunta hecha hace 3 años, 4 meses, 25 días - Por coderconqueror


2 Respuestas:

  • El error que estás viendo se debe a cómo estás intentando asignar el array data a la propiedad info del nodo.

    En lugar de intentar asignar directamente data[], necesitas realizar una copia de los elementos del array data en la propiedad info del nodo actual. Puedes lograr esto utilizando funciones de copia de memoria como memcpy o simplemente recorrer el array data e ir asignando los elementos uno por uno.

    Aquí te dejo un ejemplo de cómo podrías modificar tu código para lograr esto:

    cpp
    node ReadList() {
        node head = NULL, n, m;
        char data[20], c;
        bool lmfao = false;
        int i;
    
        for (i = 0; i < 20; i++) {
            c = getchar();
            if (c == ' ') break;
            data[i] = c;
        }
    
        n = new node;
        n->next = NULL;
        n->info = new char[20]; // Reservar memoria para el array en el nodo actual
        memcpy(n->info, data, 20); // Copiar el contenido de data al nodo actual
        head = n;
    
        while (!lmfao) {
            for (i = 0; i < 20; i++) {
                c = getchar();
                if (c == ' ') break;
                if (c == EOF) {
                    lmfao = true;
                    break;
                }
                data[i] = c;
            }
    
            if (!lmfao) {
                m = new node;
                n->next = m;
                m->info = new char[20];
                memcpy(m->info, data, 20);
                m->next = NULL;
                n = m;
            }
        }
    
        return head;
    }
    

    En este código, se reserva memoria para un array de char de tamaño 20 en cada nodo y se copia el contenido de data en este array utilizando memcpy.

    Es importante tener en cuenta que al terminar de usar la lista enlazada, debes liberar la memoria reservada para cada array en cada nodo para evitar fugas de memoria.

    Espero que esta explicación y el ejemplo te ayuden a solucionar tu problema. Si tienes alguna pregunta adicional, ¡no dudes en preguntar!

    Respondida el Dec 21, 2020 a las 14:11 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás recibiendo se debe a que estás intentando asignar una matriz directamente a info en lugar de asignar un puntero a la matriz. Aquí tienes el código corregido:

    cpp
    include include 
    using namespace std;
    
    struct node {
        char info;
        node next;
    };
    
    node ReadList() {
        node head = NULL, n, m;
        char data[20], c;
        bool lmfao = false;
        int i;
    
        for (i = 0; i < 20; i++) {
            c = getchar();
            if (c == ' ') break;
            data[i] = c;
        }
    
        n = new node;
        n->next = NULL;
        // Asigna un puntero a la matriz data
        n->info = data;
        head = n;
    
        while (!lmfao) {
    
            for (i = 0; i < 20; i++) {
                c = getchar();
                if (c == ' ') break;
                if (c == EOF) lmfao = true;
                data[i] = c;
            }
    
            if (!lmfao) {
                m = new node;
                n->next = m;
                // Asigna un puntero a la matriz data
                m->info = data;
                m->next = NULL;
                n = m;
    
            }
    
            if (lmfao) {
                m = new node;
                n->next = m;
                // Asigna un puntero a la matriz data
                m->info = data;
                m->next = NULL;
            }
        }
    
        return head;
    }
    
    int main() {
        node head = ReadList();
    
        // Imprime los elementos de la matriz para cada nodo
        node current = head;
        while (current != NULL) {
            cout << current->info << endl;
            current = current->next;
        }
    
        return 0;
    }
    

    Cambios realizados:

    He cambiado n->info = data[] a n->info = data para asignar un puntero a la matriz data en lugar de la matriz en sí. He hecho lo mismo para los nodos m.

    Nota: Es importante recordar que las matrices en C++ no son punteros, sino bloques de memoria contiguos. Por lo tanto, cuando se asigna una matriz, se asigna la dirección de la primera posición de la matriz. Esto es lo que hacemos al asignar n->info = data y m->info = data.

    Respondida el Dec 21, 2020 a las 14:19 - por Gemini

    Votos positivos: 0 | Votos negativos: 0