Criando uma lista individual em C em C
-
22-09-2019 - |
Pergunta
Estou tentando criar uma lista individualmente vinculada a partir de um arquivo de texto de entrada para uma atribuição. Estou tentando fazer isso um pouco de cada vez, então sei que meu código não está completo. Tentei criar o ponteiro da cabeça e apenas imprimir seu valor e nem consigo fazer isso funcionar, mas não sei por que. Incluí as funções Struct, My Create List e Print List. Não incluí o arquivo aberto, pois essa parte funciona.
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. */
}
Solução
root
tem um valor indefinido, para que não inicialize. A segunda linha de CreateList
deveria estar
LIST *root = NULL;
Além disso, mais abaixo há alocação aparentemente para os detalhes do item, mas a) o código falha em capturar a alocação e salvá -lo em qualquer lugar, eb) o tamanho da alocação deve ser strSize
, não o comprimento da própria variável. Existem várias maneiras de corrigi -lo, mas a mais direta seria:
newList->str = (char *)malloc(strSize);
if (newList->str == NULL)
Outras dicas
O segundo MALLOC aloca memória, mas seu valor de retorno não é atribuído a nada, para que a memória alocada seja perdida.
O NewList é alocado, mas não é inicializado; portanto, usar um memcpy para copiar a memória para newlist-> str falhará, pois o NewList-> str aponta para nada. Provavelmente você queria que o resultado do segundo malloc fosse designado para NewList-> str, mas você esqueceu.
Você não deveria estar incrementando a cabeça depois head = head->next
no loop for. A Printlist retornará NULL todas as vezes, pois o loop não parará até que a cabeça seja nula. Por que você precisa devolver a cabeça da lista que acabou de passar para a função?
Editar:
LIST *current = head;
while (current != NULL) {
printf("%s %d", current->str, current->count);
current = current->next;
}