Создание односвязного списка в 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. */
}
3 ответа
root
имеет неопределенное значение, поэтому он не будет инициализирован. Вторая строка CreateList
должно быть
LIST *root = NULL;
Кроме того, далее внизу, по-видимому, выделяется информация для элемента, но а) код не может захватить выделение и сохранить его где-либо, и б) размер выделения должен быть strSize
, а не длина самой переменной. Есть несколько способов исправить это, но самым простым будет:
newList->str = (char *)malloc(strSize);
if (newList->str == NULL)
Вы не должны увеличивать голову после head = head->next
в цикле for. PrintList будет возвращать NULL каждый раз, так как цикл не остановится, пока head не станет NULL. Зачем вам в любом случае возвращать заголовок списка, который вы только что передали функции?
Редактировать:
LIST *current = head;
while (current != NULL) {
printf("%s %d", current->str, current->count);
current = current->next;
}
Второй malloc выделяет память, но его возвращаемое значение ни к чему не присваивается, поэтому выделенная память теряется.
newList выделяется, но не инициализируется, поэтому использование memcpy для копирования памяти в newList->str не удастся, поскольку newList->str ничего не указывает. Возможно, вы хотели, чтобы результат второго malloc был назначен newList->str, но вы забыли его.