es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C – Devolver el puntero del primer elemento en la lista enlazada (cadena de texto)

Mi función debe devolver el puntero del primer elemento en la lista enlazada “String s” después de agregar un carácter.

typedef struct String
{
    char cChar; //dato de tipo char almacenado en un nodo
    struct String* strNext; //puntero al siguiente nodo de la lista enlazada
}String;

String create ()
{
    String* strTemp = NULL;

//asignación de memoria dinámica
strTemp = (String*)malloc(sizeof(String));
//asegurarse de que el carácter devuelto sea nulo después de la creación
strTemp->cChar = '\0';
strTemp->strNext = NULL;

return *strTemp;
}

void concat(String *a, String *b){
    if (a->strNext == NULL)
        a->strNext = b;
    else
        concat(a->strNext,b);
}

/**
 * @brief Añade un carácter c al final de la cadena String s
 * 
 * @param String s: cadena a manipular
          char c: carácter a añadir
 * @return String: el puntero del primer elemento en la cadena String s
 */
String add (String s, char c){
    String strTemp = NULL;
    strTemp = (String*)malloc(sizeof(String));
    strTemp->cChar = c;
    strTemp->strNext = '\0';
    concat(&s, strTemp);

    return s; // <-- aquí es donde debería devolver
} 

La cadena debe ser una lista enlazada y la función add se llama de la siguiente manera:
add(s1, 'H');

No logro entender las listas enlazadas en C.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para devolver el puntero del primer elemento en la lista enlazada después de agregar un carácter, debemos modificar la función add para devolver un puntero al primer nodo en la lista enlazada. Así es como debería lucir la función add modificada:

    /**
     * @brief Agrega un carácter c al final de la String s
     * 
     * @param String s : cadena a manipular 
     *        char c : carácter a agregar
     * 
     * @return String* : puntero al primer nodo en la lista enlazada
     */
    String* add (String* s, char c){
        String* strTemp = (String*)malloc(sizeof(String));
        strTemp->cChar = c;
        strTemp->strNext = NULL;
        concat(s, strTemp);
    
        // recorrer la lista enlazada para encontrar el primer elemento y devolver su puntero
        String* ptr = s;
        while(ptr->strNext != NULL) {
            ptr = ptr->strNext;
        }
        return s;
    } 
    

    Ten en cuenta que hemos modificado la firma de la función para aceptar un puntero a la lista enlazada existente (s) en lugar de una copia de ella (s1), ya que necesitamos modificar la lista enlazada original.

    Además, hemos reemplazado el tipo de retorno con un puntero al primer elemento de la lista enlazada, ya que eso es lo que necesitamos devolver.

    Por último, después de agregar el nuevo nodo a la lista enlazada, la recorremos para encontrar el primer elemento y devolver su puntero.

    Con estas modificaciones, deberíamos poder llamar a la función add de la siguiente manera:

    // crear una lista enlazada vacía
    String* s1 = create();
    
    // agregar un carácter a la lista enlazada y obtener el puntero a su primer elemento
    String* s2 = add(s1, 'H');
    

Comments are closed.