2010-02-22 6 views
6

Estoy tratando de crear una lista vinculada individualmente a partir de un archivo de texto de entrada para una tarea. Estoy intentando hacerlo un poco a la vez, así que sé que mi código no está completo. Traté de crear el puntero de la cabeza y simplemente imprimir su valor y ni siquiera puedo hacer que funcione, pero no estoy seguro de por qué. Incluí las funciones struct, my create list e print list. No incluí el archivo abierto ya que esa parte funciona.Creación de una lista vinculada individualmente en C

typedef struct List 
{ 
    struct List *next; /* pointer to the next list node */ 
    char *str;   /* pointer to the string represented */ 
    int count;   /* # of occurrences of this string */ 
} LIST; 

LIST *CreateList(FILE *fp) 
{ 
    char input[LINE_LEN]; 
    LIST *root;    /* contains root of list    */ 
    size_t strSize;   
    LIST *newList;   /* used to allocate new list members */ 

    while (fscanf(fp, BUFFMT"s", input) != EOF) { 

     strSize = strlen(input) + 1; 

     /* create root node if no current root node */ 
     if (root == NULL) { 
      if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL) { 
       printf("Out of memory..."); 
       exit(EXIT_FAILURE); 
      } 
      if ((char *)malloc(sizeof(strSize)) == NULL) { 
       printf("Not enough memory for %s", input); 
       exit(EXIT_FAILURE); 
      } 
       memcpy(newList->str, input, strSize); /*copy string */ 
       newList->count = START_COUNT; 
       newList->next = NULL; 
       root = newList; 
     } 
    } 
     return root; 
} 

/* Prints sinly linked list and returns head pointer */ 
LIST *PrintList(const LIST *head) 
{ 
    int count; 

    for (count = 1; head != NULL; head = head->next, head++) { 
     printf("%s %d", head->str, head->count); 
    }      
    return head;  /* does this actually return the start of head ptr, b/c I want to 
          return the start of the head ptr. */ 
} 
+1

No desea tener 'head ++' en 'PrintList',' head = head-> next' ya incrementa el puntero. –

+1

¿lo preguntaste dos veces ...? http://stackoverflow.com/questions/2309618/single-linked-lists-in-c – lorenzog

Respuesta

2

root tiene un valor indefinido, por lo que no se inicializará. La segunda línea de CreateList debe ser

LIST *root = NULL; 

también, más abajo hay asignación al parecer por los detalles del tema, pero a) el código no logra captar la asignación y guardarlo en cualquier lugar, y b) el tamaño de la asignación debe ser strSize, no la longitud de la variable en sí. Hay varias maneras de solucionarlo, pero la más sencilla sería:

newList->str = (char *)malloc(strSize); 
if (newList->str == NULL) 
1

No se le debe incrementar la cabeza después de head = head->next en el bucle. PrintList devolverá NULL cada vez ya que el ciclo no se detendrá hasta que la cabecera sea NULL. ¿Por qué necesita devolver el encabezado de la lista que acaba de pasar a la función de todos modos?

Editar:

LIST *current = head; 
while (current != NULL) { 
    printf("%s %d", current->str, current->count); 
    current = current->next; 
} 
+0

Justo lo que mi profesor quiere. Y el parámetro const char * me confundió sobre cómo iteraría a través del ciclo. – Crystal

+0

Debe crear un puntero al nodo actual e inicializarlo con la cabeza. Entonces no toques la cabeza otra vez hasta que la regreses. –

1

El segundo malloc asigna memoria, pero su valor de retorno no está asignado a nada, por lo que se pierde la memoria asignada.

newList se asigna pero no se inicializa, por lo que usar memcpy para copiar memoria a newList-> str fallará ya que newList-> str apunta a nada. Probablemente querías que el resultado del segundo malloc se asignara a newList-> str, pero lo olvidaste.

Cuestiones relacionadas