Хранение нескольких записей в связанном списке - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть текстовый файл, состоящий из нескольких записей журнала, которые я могу прочитать и сохранить в структуре под названием Журнал. Но теперь моя проблема в том, что я не знаю, как добавить его в связанный список 1 на 1.

, это мой метод вставки

void insertStart (LinkedList *list, Journal *JEntry) {
    Node *newNode;
    newNode = (Node*)malloc(sizeof(Node));
    newNode->data.day = JEntry->day;
    newNode->data.month = JEntry->month;
    newNode->data.year = JEntry->year;
    strcpy(newNode->data.entry, JEntry->entry);


    if (list == NULL) {
        list->head = newNode;
    }
    else {
        newNode->next = list->head;
        list->head = newNode;
    }
    printf("Inserted Entry = %d/%d/%d :%s\n", newNode->data.day, newNode->data.month, newNode->data.year, newNode->data.entry);
}

, а это

fscanf(fo, "%d", &numEntry);
journal = (Journal *)malloc(numEntry * sizeof(Journal));

for (i=0; i<numEntry;i++) {
    fscanf(fo, "%d/%d/%d\n", &journal[i].day, &journal[i].month, &journal[i].year);
    fgets(journal[i].entry, SIZE, fo);

    }

    insertStart(list, journal);
    index = atoi(argv[1]);
    printf("%d-%02d-%02d: %s\n", journal[index].year, journal[index].month, journal[index].day, journal[index].entry);
    free(journal);
    fclose(fo);
}

это моя структура


#define SIZE 102
typedef struct {
    int day;
    int month;
    int year;
    char entry[SIZE];
} Journal;


typedef struct Node {
    Journal data;
    struct Node *next;
} Node;

typedef struct {
    Node *head;
} LinkedList;

, если я поместил insertStart в for для l oop, да, он вводился 4 раза, но это один и тот же результат снова и снова.

Если я положу его туда, где показано выше, он будет запущен только 1 раз.

Теперь у меня вопрос: как мне сохранить оставшуюся часть записи в связанном списке? спасибо

это содержимое текстового файла

4
12/04/2010 
Interview went well I think, though was told to wear shoes. 
18/04/2010 
Doc advised me to concentrate on something... I forget. 
03/05/2010 
Was asked today if I was an art exhibit. 
19/05/2010 
Apparently mudcakes not made of mud, or angry wasps.

первое число 4 - это количество записей на случай, если кто-нибудь спросит.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Рассматривали ли вы просто сохранение JEntry в узле вместо создания копии?

typedef struct 
{
  Journal* data;
  struct Node* next'
} 
Node;

Таким образом, это можно упростить

void insertStart (LinkedList *list, Journal *JEntry) 
{
  Node* newNode = malloc(sizeof(Node));
  newNode->data = JEntry;
  newNode->next = NULL;

вместо

struct { Node* head } LinkedList

просто объявите его

Node* list;

, если вы хотите изменить указатель, передайте его как двойной указатель

void insertStart( Node** list, Journal* JEntry)  /* insertStart(&list,journal + i) */

Если в списке уже есть запись, убедитесь, что ваш новый узел указывает на это

if (*list != NULL) 
{
  newNode->next = *list;
}

Теперь ваш список указывает на новый узел

*list = newNode;

При печати используйте также -> для JEntry.

printf("Inserted Entry = %d/%d/%d :%s\n", newNode->data->day, newNode->data->month, newNode->data->year, newNode->data->entry);
1 голос
/ 23 апреля 2020

Во-первых, вам нужно установить list->head на NULL при его создании (или использовать calloc вместо malloc).

Однако ваша проблема исходит из строки insertStart(list,journal); , Хотя journal является указателем на начало массива Journal объектов, insertStart этого не знает. Разыменовывает указатель и добавляет в список только первую запись журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...