Создание односвязного списка с данными из файлового потока - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время я пытаюсь создать программу, которая создаст связанный список, содержащий следующее в каждом узле:

  1. указатель на следующий узел (очевидно, необходим)
  2. aстрока, прочитанная из строки текста из файлового потока
  3. количество раз, когда строка встречалась в файловом потоке

У меня есть следующий код, но ясталкиваюсь с несколькими проблемами, которые я явно не могу понять:

  1. Как выполнить поиск в списке, а затем создать узел, если соответствующий узел еще не был найден в списке?

  2. В общем, как создать головной узел и затем начать связывать с ним последующие узлы?

Любая помощь очень ценится, так как япотратил много часов, гугля и просматривая видео на YouTube безрезультатно.

typedef struct List
    {
       struct List *next;
       char *str;
       int count;
    } List;

Выше приведено в заголовочном файле.Ниже мой текущий код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "C2A6E4_List-Driver.h"

#define ARRAY_SIZE 255  /*Define the size of the array*/

List *CreateLinkedList(FILE *fp)
{
   List *head, *ptr, *p;
   head = NULL;
   char tempBuffer[ARRAY_SIZE];

   while (fgets(tempBuffer, ARRAY_SIZE, fp) != NULL)
   {
      char *strToken = strtok(tempBuffer, " ");

      while (strToken != NULL)
      {
         for (p = head; p != NULL; p = p->next)
            ;
         if (strcmp(p->str, strToken) == 0)
         {
            p->count++;
            break;
         }
         else
         {
            if ((ptr = (List *)malloc(sizeof(List))) == NULL)
            {
               fprintf(stderr, "Failed to allocate memory!");
               exit(EXIT_FAILURE);
            }

            if ((ptr->str = (char *)malloc(strlen(strToken) * sizeof(char) + sizeof(char))) == NULL)
            {
               fprintf(stderr, "Failed to allocate memory!");
               exit(EXIT_FAILURE);
            }

            memcpy(&ptr->str, &strToken, sizeof(strToken));
            ptr->count = 1;

            if (head != NULL)
            {
               p = head;
               p->next = ptr;
            }
            else
               head = ptr;
         }
         strToken = strtok(NULL, " ");
      }
   }
   return head;
}
...