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 propiedadinfo
del nodo.En lugar de intentar asignar directamente
data[]
, necesitas realizar una copia de los elementos del arraydata
en la propiedadinfo
del nodo actual. Puedes lograr esto utilizando funciones de copia de memoria comomemcpy
o simplemente recorrer el arraydata
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 dedata
en este array utilizandomemcpy
.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[]
an->info = data
para asignar un puntero a la matrizdata
en lugar de la matriz en sí. He hecho lo mismo para los nodosm
.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
ym->info = data
.Respondida el Dec 21, 2020 a las 14:19 - por Gemini
Votos positivos: 0 | Votos negativos: 0